mask模式
电脑眼中的标签:一张只有编号的“二维点阵图”
我们要从“电脑看到的”和“人类看到的”两个视角来解释。 电脑眼中的标签:一张只有编号的“二
维点阵图”对于 PyTorch 或者深度学习模型来说,语义分割的标签绝对不是一张彩色的图,而是一
个二维的整数矩阵(单通道)。尺寸一致: 如果原图是 512*512,标签也是 512*512 的矩阵。没
有颜色,只有类别编号: 矩阵里的每一个数值,都是一个 0, 1, 2... 这样的离散整数。0 代表背景
(Background)1 代表车子 (Car) 2 代表行人 (Person)。
为什么需要 P 模式?(因为人类的肉眼是瞎的)
既然电脑只需要 0, 1, 2,那我们直接把这个矩阵存成单通道图片(L 模式的灰度图)不就好了吗?
如果你把存满 0, 1, 2 的矩阵直接当成灰度图打开,在人类看来,0 是纯黑,1 也是极度接近黑色的
黑,2 还是黑。整张标签图在人眼看来就是一张纯黑的图! 数据标注员根本无法检查自己标得对不
对。P 模式(调色板模式)就是为了拯救人类视觉而诞生的“魔法滤镜”:
它的底层数据依然是 0, 1, 2。
但它的文件头里偷偷塞了一本“密码本(调色板)”:
遇到 0,在屏幕上显示黑色。
遇到 1,在屏幕上显示大红色。
遇到 2,在屏幕上显示蓝色。
结果: 电脑用 PIL 读取时,读到的依然是 0, 1, 2,完美满足训练需求;而人类双击打开图片时,
看到的是五颜六色的色块,完美满足检查需求。
| 模式 | 通道数 | 每个像素的含义 | 适用于 | 常用读取方式 | 备注 |
| P (Palette) | 1通道(索引) | 类别ID ➔ 查调色板得到颜色 | 语义分割标注(类别索引型) | PIL.Image.open() |
像素值是类别索引,调色板映射成RGB |
| L (Luminance) | 1通道(灰度值) | 0~255 灰度值 | 灰度图、深度图、标签图 | PIL.Image.open().convert('L') or cv2.imread(..., 0) |
直接表示亮度或类别ID,无调色板 |
| RGB | 3通道 | 真实颜色(R,G,B各0~255) | 彩色图片、可视化图像 | cv2.imread() / PIL.Image.open().convert('RGB') |
每个像素是直接的颜色值 |
在 L 模式下,图像大部分是黑色的(因为类别索引如 0、1、2 对应的灰度值极低),但边缘处
之所以是亮白色的,是因为这些边缘像素的值被设定为了 255。
在人工标注数据时,不同物体之间的边界(边缘)是非常模糊且难以绝对精确定义的。比如猫的毛
发和椅子的交界处,到底算猫还是算椅子?如果强制标为猫,或者强制标为椅子,模型在训练时碰
到这种模棱两可的像素就会很“痛苦”,导致 Loss 剧烈震荡。为了解决这个问题,大神们发明了
Ignore Label(忽略标签) 机制。他们把物体交界处的一圈像素(通常是 1~2 个像素宽的白边)单
独挑出来,赋予一个特殊的类别 ID,最常用的就是 255。在代码计算 Loss 时,我们会明确告诉
CrossEntropyLoss 忽略掉值为 255 的像素点(在 PyTorch 中通过 ignore_index=255 实现),
即:“这部分边缘太模糊了,你预测错了我也不扣你分。”
为什么 255 在 L 模式下是白色的?
这就是图像灰度值的物理意义了。
我们知道,L 模式本质上是一张 8 位的单通道灰度图,取值范围是 0 ~ 255。
0 代表纯黑(通常是背景)。
1, 2, 3... 代表飞机、自行车、鸟等类别(这些数字对应的灰度极度接近 0,所以肉眼看依然是纯
黑)。255 代表最高亮度,也就是纯白!
评价指标
像素准确率 (PA, Pixel Accuracy):最直白,但也最容易被“骗”
理论解读:
PA 是最符合人类直觉的指标。假设一张图片有 100 个像素,模型预测对了 90 个,那 PA 就是
90%。它只关心“总答对题数”,不关心“是哪门科目的题”。
类别像素准确率 (CPA, Class Pixel Accuracy)
在所有原本属于类别 i 的像素中,模型成功找出了多少?
类别平均像素准确率 (MPA, Mean Pixel Accuracy):宏观视角,人人平等
理论解读:
算出了每个类别的 CPA 之后,我们需要一个单一的数值来评估模型的整体能力。MPA 的做法
非常霸气:不管你是占全图 99% 的背景,还是只占 1%的肿瘤,在 MPA 面前,众生平等。
交并比(Intersection over Union,IoU)
IoU的值越高,说明预测结果和真实标签的重叠度越高,分割效果也越好。如果IoU等于1,那就
表示预测区域和真实区域完全重合;如果IoU等于0,那就说明两者完全没有重叠。一般来说,IoU
能达到0.5以上,就被认为是比较好的分割结果了。
平均交并比(Mean Intersection over Union,mIoU)
mIoU就是计算所有类别IoU的平均值,这个指标能综合评估模型在各个类别上的分割精度,可
以说是语义分割任务中最重要的指标了。它能平衡不同类别之间的差异,更全面地反映模型的性
能,所以在比较不同模型的时候,mIoU是一个比较可靠的指标。mIoU的取值范围在0到1之间,值
越高代表模型在各个类别上的平均分割效果越好。一般来说,mIoU越高的模型,它的分割性能也
越好。
频率加权交并比(Frequency Weighted Intersection over Union,FWIoU)
FWIoU 是 PA(像素准确率)和 mIoU 之间的一个折中。它既不像 PA 那样彻底无视小类别,也不
像 mIoU 那样给小类别过高的权重。它认为:谁在真实世界里占的面积大,谁的话语权就重。
类别F1分数(Class F1 Score)
F1 分数结合了类别预测的精确率和召回率,对每个类别单独计算,能更细致地反映模型在不同
类别上的分类性能。在一些既要求分类准确又要求不遗漏任何信息的场景中,F1 分数能提供更全
面的评估信息。F1 分数的取值在 0 到 1 之间,值越高表示该类别上模型的分类性能越好。
平均F1分数(Mean F1 Score,mF1)
mF1就是把所有类别的F1分数加起来求平均,就能综合评估模型在各个类别上的整体表现,平衡
了不同类别之间的差异,不会只盯着那些主要的类别而忽略了其他的类别,这样能更全面地反映模
型的分类能力。mF1的取值范围在0到1之间,值越高代表模型在各个类别上的平均分类性能越好。