语义分割指标MIoU

1. 前言

  • 本文学习记录了机器学习中的分类常见评价指标以及分割中的MIoU。
  • 主要有以下概念:Accuracy, Precision, Recall, Fscore,混淆矩阵,IoU及MIoU。

2. 分类评测指标

  • 图像分类, 顾名思义就是一个模式分类问题, 它的目标是将不同的图像, 划分到不同的类别,实现最小的分类误差, 这里我们只考虑单标签分类问题, 即每一个图片都有唯一的类别。
  • 对于单个标签分类的问题, 评价指标主要有 Accuracy, Precision, Recall, Fscore。
  • 在计算这些指标之前, 我们先计算几个基本指标, 这些指标是基于二分类的任务, 也可以拓展到多分类。

    • 标签为正样本, 分类为正样本的数目为 True Positive, 简称 TP。
    • 标签为正样本, 分类为负样本的数目为 False Negative,简称 FN。
    • 标签为负样本, 分类为正样本的数目为 False Positive,简称 FP。
    • 标签为负样本, 分类为负样本的数目为True Negative,简称 TN。
  • 判别是否为正例只需要设一个概率阈值 T,预测概率大于阈值 T 的为正类, 小于阈值 T 的为负类,默认就是 0.5。 如果我们减小这个阀值 T, 更多的样本会被识别为正类,这 样可以提高正类的召回率, 但同时也会带来更多的负类被错分为正类。 如果增加阈值 T, 则正类的召回率降低, 精度增加。 如果是多类,比如 ImageNet1000 分类比赛中的 1000 类, 预测类别就是预测概率最大的那一类。

2.1 准确率 Accuracy

  • 单标签分类任务中每一个样本都只有一个确定的类别, 预测到该类别就是分类正确, 没有预测到就是分类错误,因此最直观的指标就是 Accuracy,也就是准确率。
  • Accuracy=(TP+TN)/(TP+FP+TN+FN), 表示的就是所有样本都正确分类的概率, 可以 使用不同的阈值 T。
  • 在 ImageNet 中使用的 Accuracy 指标包括 Top_1 Accuracy 和 Top_5 Accuracy, Top_1 Accuracy 就是前面计算的 Accuracy。
  • 记样本 xi 的类别为 yi,类别种类为(0,1,…,C),预测类别函数为 f,则 Top-1 的计 算方法如下:
  • 如果给出概率最大的 5 个预测类别, 只要包含真实的类别,则判定预测正确, 计算出来的指标就是 Top-5。

2.2 精确度 Precision 和召回率 Recall

  • 正样本精确率为:Precision=TP/(TP+FP), 表示召回为正样本的样本中, 到底有多少是真正的正样本。
  • 正样本召回率为:Recall=TP/(TP+FN),,表示的是有多少样本被召回类。

2.3 F1 score

  • 有的时候我们不仅关注正样本的准确率,也关心其召回率, 但是又不想用 Accuracy 来进行衡量, 一个折中的指标是采用 F-score。
  • F1 score=2x Precision x Recall / (Precision+Recall), 只有在召回率 Recall 和 精确率 Precision 都高的情况下,F1 score 才会很高, 因此 F1 score 是一个综合性能 的指标。

2.4 混淆矩阵

  • 如果对于每一类, 我们想知道类别之间相互误分的情况, 查看是否有特定的类别之间相互混淆, 就可以用混淆矩阵画出分类的详细预测结果。 对于包含多个类别的任务, 混淆矩阵很清晰的反映出各类别之间的错分概率,如下。

  • 这是一个包含 20 个类别的分类任务,混淆矩阵为 20 x 20 的矩阵, 其中第 i 行第 j 列, 表示第 i 类目标被分类为第 j 类的概率,可以知道, 越好的分类器对角线上的值更大, 其他地方应该越小。

3. 分割评价指标

3.1 IoU

  • IoU 全称 Intersection-over-Union, 即交并比, 在目标检测领域中, 定义为两个矩形框面积的交集和并集的比值, IoU=A∩B/A∪B。

  • 如果完全重叠,则 IoU 等于 1, 是最理想的情况。一般在检测任务中,IoU 大于等于 0.5 就认为召回, 如果设置更高的 IoU 阈值,则召回率下降,同时定位框也越更加精确。
  • 图像分割中也会经常使用 IoU,此时就不必限定为两个矩形框的面积。 比如对于二 分类的前背景分割, 那么 IoU=(真实前景像素面积∩预测前景像素面积)/(真实前景像素面积∪预测前景像素面积), 这一个指标, 通常比直接计算每一个像素的分类正确概 率要低,也对错误分类更加敏感。

3.2 精确度

  • 假设共有k类($L0-L_k$,其中包含背景),$p{ij}$表示原本是i类但预测为j类的结果数。$p{ii}$表示真正的结果数。而$p{ij}$和$p_{ji}$分别被解释为假正假负,尽管两者都是假正与假负之和。

  • Pixel Accuracy:标记正确的像素占总像素的比例

  • Mean Pixel Accuracy:PA的平均值

  • MIoU:均交并比,语义分割的标准度量。计算两个集合的交集与并集之比,在语义分割中,这两个集合为真实值和预测值。这个比例可以理解为:真正数/真正+假负+假正

    等价于

  • 直观理解如下图:

3.3 上述指标的计算

  • 首先得得出混淆矩阵,例如:

  • 对于上例,MIoU的解释:
    • 对于类别1:TP=43,FN=7,FP=2;
    • 类别2:TP=45,FN=5,FP=6;
    • 类别3:TP=49,FN=1,FP=5.
    • 因此:IoU1=43/(43+2+7)=82.69%,IoU2=45/(45+5+6)=80.36%,IoU=49/(49+1+5)=89.09%
    • 因此mIoU=84.05%,其实就是IOU的分母计算为矩阵的每一行加每一列,再减去重复的TP
  • 根据上述公式,代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import numpy as np

class Evaluator(object):
def __init__(self, num_class):
self.num_class = num_class
self.confusion_matrix = np.zeros((self.num_class,)*2)

def Pixel_Accuracy(self):
Acc = np.diag(self.confusion_matrix).sum() / self.confusion_matrix.sum()
return Acc

def Pixel_Accuracy_Class(self):
Acc = np.diag(self.confusion_matrix) / self.confusion_matrix.sum(axis=1)
Acc = np.nanmean(Acc)
return Acc

def Mean_Intersection_over_Union(self):
MIoU = np.diag(self.confusion_matrix) / (np.sum(self.confusion_matrix, axis=1) + np.sum(self.confusion_matrix, axis=0) -np.diag(self.confusion_matrix))
MIoU = np.nanmean(MIoU)
return MIoU
-------------The End-------------
谢谢大锅请我喝杯阔乐~