语义分割评价指标梳理与代码实现记录

最近在处理烟雾分割任务时,发现现有的语义分割评估指标在应对特定分布(如目标极其微小、类别极度不平衡)时存在一些统计上的盲区。为了更客观地衡量模型性能,我对常用的评价指标进行了梳理,并记录了在 MMSegmentation 框架下实现自定义烟雾分割评价指标的过程。

一、通用语义分割评价指标复习

在语义分割中,预测结果通常被视为逐像素的分类问题。因此,评价指标主要围绕混淆矩阵展开:

  • TP (True Positive):正确预测为正样本的像素数。
  • TN (True Negative):正确预测为负样本的像素数。
  • FP (False Positive):错误预测为正样本的像素数。
  • FN (False Negative):错误预测为负样本的像素数。

1. 像素准确率 (Pixel Accuracy, PA)

这是最直观的指标,表示预测正确的像素在总像素中的占比。

PA=i=0kpiii=0kj=0kpij=TP+TNTP+TN+FP+FNPA = \frac{\sum_{i=0}^{k} p_{ii}}{\sum_{i=0}^{k} \sum_{j=0}^{k} p_{ij}} = \frac{TP + TN}{TP + TN + FP + FN}

2. 平均像素准确率 (mean Pixel Accuracy, mPA)

分别计算每个类别的像素准确率,然后再求取所有类别的平均值。

mPA=1k+1i=0kpiij=0kpijmPA = \frac{1}{k+1} \sum_{i=0}^{k} \frac{p_{ii}}{\sum_{j=0}^{k} p_{ij}}

3. 交并比 (Intersection over Union, IoU)

语义分割中最常用的核心指标,用于衡量特定类别的预测结果与真实标签(Ground Truth)交集和并集的比值。

IoU=TPTP+FP+FNIoU = \frac{TP}{TP + FP + FN}

4. 平均交并比 (mean Intersection over Union, mIoU)

计算所有类别的 IoU,并取综合平均值,以兼顾各类别目标区域的精准度与完整度。

mIoU=1k+1i=0kTPiTPi+FPi+FNimIoU = \frac{1}{k+1} \sum_{i=0}^{k} \frac{TP_i}{TP_i + FP_i + FN_i}


二、面向特定任务(烟雾分割)的评价指标

在烟雾分割等特定场景下,评价指标的计算逻辑通常会有两点区别:
第一,评价指标主要只针对“烟雾”这一个类别进行考察;
第二,为了应对数据分布的不平衡,往往会采用 Image-level(图像级别)的平均机制,而不是全局像素累加。

参考《Deep Smoke Segmentation》和《FoSp: Focus and Separation Network for Early Smoke Segmentation》等论文,我们通常使用以下五个核心指标:mIoU, mFbeta, mPrecision, mRecall, mMse

💡 概念澄清:前缀 “m” 的特殊含义
在此场景下,m 通常代表 mean(所有图像分数的均值),这与通用指标中代表的“所有类别的均值”有所区别。
其计算流程为:先在测试集的每一张图像上独立计算得出指标数值,最后将所有图像的得分加和并除以图像总数 nn

1. 图像级别核心指标的计算

对于单张图像,我们对比预测结果与 GT,得出单图级别的 TPTPFPFPFNFN

  • Precision (精确率): Precision=TPTP+FPPrecision = \frac{TP}{TP + FP}
  • Recall (召回率): Recall=TPTP+FNRecall = \frac{TP}{TP + FN}
  • IoU (交并比): IoU=TPTP+FP+FNIoU = \frac{TP}{TP + FP + FN}
  • Fbeta (FβF_\beta): 结合精确率和召回率,通常定义为 Fβ=(1+β2)×Precision×Recallβ2×Precision+RecallF_\beta = \frac{(1 + \beta^2) \times Precision \times Recall}{\beta^2 \times Precision + Recall}

计算完单图分数后,对数据集中的 nn 张图像求算术平均:

mIoU=1ni=1nIoUimIoU = \frac{1}{n} \sum_{i=1}^{n} IoU_i

2. 均方误差 (mMse) 指标

在对比网络输出的概率图时,mMse (mean Mean Squared Error) 可以直观反映概率分布的偏离程度。具体定义在不同研究中略有差异:

  • 常规设定:将网络输出经过 Sigmoid 激活并通过阈值处理后的二值化图,与二值化标签进行均方误差计算。
  • 变体使用:也有直接利用 [0,1][0,1] 连续概率图进行均方差计算,或者采用均方根误差 (RMSE)。

无论细节如何,其整体逻辑均是先计算单图均方误差,再求全集的均值

mMse=1ni=1nMseimMse = \frac{1}{n} \sum_{i=1}^{n} Mse_i


三、Global IoU 与 Image-level IoU 的差异分析

在处理烟雾(尤其是早期微小烟雾)这种占比呈现极度长尾分布的场景时,如果沿用很多代码库(如 MMSegmentation 原生逻辑)默认的”全局平均精度(Global Average)”计算方式,会造成性能指标”造假虚高”——这正是为什么必须强调使用前文提到的 Image-level 平均机制

数学逻辑的本质差异

  1. 全局计算 (Global):先将整个测试集所有图片上的交集和所有图片上的并集各自揉在一起累加,最后做唯一一次除法。

    IoUglobal=i=1n交集ii=1n并集iIoU_{global} = \frac{\sum_{i=1}^{n} \text{交集}_i}{\sum_{i=1}^{n} \text{并集}_i}

  2. 图像级别计算 (Image-level):先计算每张图像的 IoU 分数,再求取这些分数的平均值。

    IoUimagelevel=1ni=1n(交集i并集i)IoU_{image-level} = \frac{1}{n} \sum_{i=1}^{n} \left( \frac{\text{交集}_i}{\text{并集}_i} \right)

实例说明

假设一个微型测试集只包含 2 张照片:

  • 图片 A (大片浓烟):真实像素 10,000。模型预测交集 9,000 像素,并集 11,000 像素。单图 IoUA=90001100081.8%IoU_A = \frac{9000}{11000} \approx \textbf{81.8\%}
  • 图片 B (极小烟雾):真实像素 100 像素。网络完全漏检,交集 0,并集 100 像素。单图 IoUB=0100=0%IoU_B = \frac{0}{100} = \textbf{0\%}

对比计算结果:

  • 全局模式:把面积数值直接合并 9000+011000+10081.08%\frac{9000 + 0}{11000 + 100} \approx \textbf{81.08\%}
  • 单图模式:百分比分数算术平均 81.8%+0%2=40.9%\frac{81.8\% + 0\%}{2} = \textbf{40.9\%}

直观结论:全局模式下,模型在图片 B 上的致命漏检被图片 A 庞大的像素绝对数量给”稀释和掩盖”了,制造出高达 81% 的幻象。而 Image-level 模式断崖式坠落到 40.9%,反而更为客观、真实地反映了模型在全数据集上的平均检测性能。这正是为什么在类别极度不平衡或目标大小差异巨大的任务中,必须严格遵从对单张图进行独立评价再求平均。


四、MMSegmentation 1.x 烟雾分割评价指标代码实现

在 MMSegmentation 1.x 版本中,为了实现上述的 Image-level 评价机制 以及加入 mMse 等指标,我们需要自定义一个评价指标类。它继承自官方的 IoUMetric,在保留全局统计功能的同时,通过覆写 processcompute_metrics,额外计算单图平均(Macro-Average)以及基于概率图的 RMSE/MSE 误差。

操作步骤

  1. 在工程目录下创建 mmseg/evaluation/metrics/smoke_seg_metric.py 文件。
  2. 将以下代码填入文件中,不要忘记添加模块注册功能。
  3. 在你的网络主配置文件的 val_evaluatortest_evaluator 字段中指向 SmokeSegMetric 以启用它。