分割模型输出的是软遮罩——每个像素一个 0 到 1 的置信度。但下游几乎总要把它切成非黑即白的硬遮罩,这一刀切在哪里、以及量化噪声有多大,共同决定了结果。
这个实验可以让你亲手拖这两个旋钮,看软遮罩被切成什么样。左边是模型原始输出:上半部分模型很有把握(接近纯白),下半部分不确定(灰)。右边是二值化之后剩下的东西。
重点看碎片化那个数,同时盯着总覆盖。你会看到一个反直觉的现象:低置信区已经碎成一堆孤立像素了,总覆盖却几乎没动。
这个演示想说明什么
它复现的是一个实测踩到的坑:一个 int8 量化模型在标准验证集上几乎无损,换到分布外图片上 IoU 直接掉到 0.30。
原因不是量化误差变大了——误差在哪都差不多。原因是误差落在软遮罩的哪个区间。模型有把握的区域,置信度接近 0 或 1,离阈值很远,加多少噪声都翻不过去;模型不确定的区域,置信度本来就在阈值附近徘徊,一点扰动就让像素在两侧反复横跳。于是同样的噪声,在简单样本上什么都不发生,在难样本上把整个区域打成筛子。
把噪声推过 0.12,只看下半部分和碎片化数字,这个效应会非常明显。
为什么面积指标看不出来
IoU、Dice、覆盖率这些指标衡量的是面积重合。一个区域碎成上百个孤立像素,只要这些像素加起来的面积和原来差不多,面积指标就几乎不变。但对下游几乎所有用途——抠图合成、轮廓追踪、连通域分析——碎裂的遮罩是不可用的。
所以只报 IoU 的量化验证是不充分的。至少要同时看:
- 连通域数量:真实主体通常是少数几个连通块,数量暴涨就是碎裂。
- 边界长度 / 面积比:碎裂会让周长相对面积急剧上升。
- 按置信区间分层的误差:把像素按软遮罩值分桶,分别统计。全局平均会把靠近阈值那一桶的灾难稀释掉。
怎么用到自己的项目里
这个实验的遮罩是程序生成的,不是真实模型输出,所以它演示的是机制而不是具体数值。要迁移到自己的场景,关键是复制那个验证集构造原则:验证量化模型时,必须单独准备一批模型本来就不确定的样本——边界模糊的、低对比度的、训练集里罕见的类别。只在干净样本上验证量化,会系统性地高估它的安全性。
如果分层验证后发现 int8 在难样本区间不可接受,退到 fp16 通常是划算的:牺牲一半体积收益,换回可预测的行为。
相关文章
- 量化验证的采样偏差:int8 在分布外样本上的崩塌:完整的实测记录,包括 IoU 从接近无损掉到 0.30 的全过程和分层验证方案。
- 轮廓追踪的终止条件缺陷:碎裂遮罩在下游造成的具体故障之一。
- 纯客户端图像处理管线:这类工具为什么能完全跑在浏览器里。
- 实用功能:站点内其他浏览器端工具。
