参考:https://github.com/wasidennis/AdaptSegNet/blob/master/compute_iou.py
mIOU代码讲解
以单张图片为例,mIOU的计算分为两个步骤:
1.统计TP、FN和TN
def fast_hist(pred, label, n):
# 输入: pred 预测分割图像展开的一维行向量
# label 标签图像展开的一维行向量
# n 包括背景在内的类别总数
# 输出: 统计TP、FN和TN的n*n的矩阵
k = (pred >= 0) & (pred < n)
return np.bincount(n * pred[k].astype(int) + label[k], minlength=n ** 2).reshape(n, n)
2.对统计矩阵进行分析,得到每一类的IOU
def per_class_iu(hist):
# 输入: fast_hist计算得到的n*n的统计矩阵
# label 标签图像展开的一维行向量
# n 包括背景在内的类别总数
# 输出: 每一类的IOU
return np.diag(hist) / (hist.sum(1) + hist.sum(0) - np.diag(hist))
举例
hist = fast_hist(pred.flatten() , label.flatten() , np.max(label)+1)
原理:将每一个类别对应到矩阵对应行的第0个位置,再加上label的类别,得到最终的位置。如果预测与类别相同,则一定是位于对角线上;TN和PN情况时,一定位于非对角线上。最后采用np.bincount对每个位置上的取值次数进行统计,得到最终统计矩阵。
输出结果为:
IOU = per_class_iu(hist)
输出结果为: