图像分割与其他任务不同,其性能指标采用的混淆矩阵,然后在混淆矩阵的基础上再计算各项性能指标,其比直接计算 像素级的IoU要方便且更加高效,完整版的代码在博客结尾

⚠️注意:
此文章的性能指标 一般适用于 语义分割,对于实例分割不太适用
语义分割不区别个体,因此可以统计类的准确率,但是实例分割区别个体,因此两者有区别
实例分割性能指标后期加上

1、混淆矩阵

def _fast_hist(self, label_true, label_pred):mask = (label_true >= 0) & (label_true < self.n_classes)b = label_true[mask]b = b.astype(int)a = self.n_classes * b + label_pred[mask]hist = np.bincount(a, minlength=self.n_classes ** 2).reshape(self.n_classes, self.n_classes)return hist
  1. 添加 掩码mask 的目的是为了保证 标签都为非负数 且 在类别之内,预防其他情况,如果有个例不在此范围,则输出 False;则在 label_true[mask] 时将对应位置 置0⃣️,label_pred[mask] 同理;
  2. astype(int) 将label_true 转换成整数,则小数部分将会被截断。注意小数点不是四舍五入,而是直接干掉;
  3. np.bincount 用来统计不同数值的数量
    ⚠️注意:self.n_classes * b + label_pred[mask] b 的范围为 [0, self.n_classes-1] 因此 self.n_classes * b + label_pred[mask] 的范围就变成了 [0,self.n_classes2][0, \quad self.n\_classes^2][0,self.n_classes2]

混淆矩阵可视化

confusion = hist
plt.figure()
plt.grid(False)
plt.imshow(confusion, camp='confusion')
plt.colorbar()
plt.show()

2、语义分割常用指标

假设:共有 kkk 个类, pijp_{ij}pij​ 表示本属于类 iii 但被预测为类 jjj 的像素数量。即,pijp_{ij}pij​ 表示真正的数量,而 pijp_{ij}pij​ 和 pjip_{ji}pji​ 则分别被解释为假正 或 假负。

  1. Pixel Accuracy (PA 像素精度):标记正确的像素占总像素的比例
    PA=∑i=0k−1pii∑i=0k−1∑j=0k−1pijPA = \frac{\sum^{k-1}_{i=0} p_{ii} }{\sum^{k-1}_{i=0}\sum^{k-1}_{j=0}p_{ij}}PA=∑i=0k−1​∑j=0k−1​pij​∑i=0k−1​pii​​

    acc = np.diag(hist).sum() / hist.sum()

  2. Mean Pixel Accuracy (MPA 平均类像素精度):计算每个类内被正确分类像素数的比例,再求所有类的平均
    即: MPA = np.nanmean(对角线值 / 行和)
    MPA=1k∑i=0k−1pii∑j=0k−1pijMPA = \frac1 k \sum^{k-1}_{i=0} \frac{p_{ii}}{\sum^{k-1}_{j=0}{p_{ij}}}MPA=k1​i=0∑k−1​∑j=0k−1​pij​pii​​

    acc_cls = np.diag(hist) / hist.sum(axis=1)
    acc_cls = np.nanmean(acc_cls)

  3. Mean Intersection over Union (MIou 平均交并比):计算真实值和预测值的交集 与 并集的比
    即:IoU = 对角线 / (行和 - 对角线)
    IoU = / 行和 + 列和 - 对角线
    MIoU = 真实 和 预测的交集 / 真实 和预测的并集
    IoU=Apred⋂AtrueApred⋃AtrueMIoU=1k∑i=0k−1pii∑j=0k−1pij+∑j=0k−1(pji−pii)IoU = \frac{A_{pred} \bigcap A_{true}}{A_{pred} \bigcup A_{true}} \\ \quad \\ MIoU = \frac1k\sum^{k-1}_{i=0}\frac{p_{ii}}{\sum^{k-1}_{j=0}p_{ij} + \sum^{k-1}_{j=0} \big( p_{ji}-p_{ii} \big)}IoU=Apred​⋃Atrue​Apred​⋂Atrue​​MIoU=k1​i=0∑k−1​∑j=0k−1​pij​+∑j=0k−1​(pji​−pii​)pii​​

3、完整代码

class StreamSegMetrics():""" Stream Metrics for Semantic Segmentation Task """def __init__(self, n_classes):self.n_classes = n_classesself.confusion_matrix = np.zeros((n_classes, n_classes))def update(self, label_trues, label_preds):for lt, lp in zip(label_trues, label_preds):self.confusion_matrix += self._fast_hist(lt.flatten(), lp.flatten())@staticmethoddef to_str(results):string = "\n"for k, v in results.items():if k != "Class IoU":string += "%s: %f\n" % (k, v)# string+='Class IoU:\n'# for k, v in results['Class IoU'].items():#    string += "\tclass %d: %f\n"%(k, v)return stringdef _fast_hist(self, label_true, label_pred):mask = (label_true >= 0) & (label_true < self.n_classes)b    = label_true[mask]b     = b.astype(int)a   = self.n_classes * b + label_pred[mask]hist = np.bincount(a, minlength = self.n_classes ** 2).reshape(self.n_classes, self.n_classes)return histdef get_results(self):hist    = self.confusion_matrix                 acc     = np.diag(hist).sum() / hist.sum()      acc_cls = np.diag(hist) / hist.sum(axis=1)acc_cls = np.nanmean(acc_cls)iu      = np.diag(hist) / (hist.sum(axis=1) + hist.sum(axis=0) - np.diag(hist))mean_iu = np.nanmean(iu)freq    = hist.sum(axis=1) / hist.sum()fwavacc = (freq[freq > 0] * iu[freq > 0]).sum()cls_iu  = dict(zip(range(self.n_classes), iu))return {"Overall Acc": acc,"Mean Acc"   : acc_cls,"FreqW Acc"  : fwavacc,"Mean IoU"   : mean_iu,"Class IoU"  : cls_iu,  }def reset(self):self.confusion_matrix = np.zeros((self.n_classes, self.n_classes))

「解析」语义分割性能指标 附代码相关推荐

  1. 牙齿的X射线图像的语义分割(附代码)

    第一步结果 第二步结果 本研究的目的是通过使用U-Net模型和二值图像分析的深度学习方法,在一次拍摄的全景x射线图像中自动语义分割和测量牙齿的总长度,以便为牙齿疾病.疾病和状况的管理提供诊断信息. 模 ...

  2. 「解析」牛客网-华为机考企业真题 81-108

    又是一年春招时,有幸收到华为自动驾驶算法岗,之前刷题不多,在此汇总下牛客网的真题,主要采用Python编写,个人觉得语言只是实现工具而已,并不是很关键,Python简洁易懂,更加适合算法工程师快速验证 ...

  3. CV之IS:利用pixellib库基于deeplabv3_xception模型对《庆余年》片段实现语义分割/图像分割简单代码全实现

    CV之IS:利用pixellib库基于deeplabv3_xception模型对<庆余年>片段实现语义分割/图像分割简单代码全实现 目录 利用pixellib库基于deeplabv3_xc ...

  4. 「解析」牛客网-华为机考企业真题 1-20

    又是一年春招时,有幸收到华为自动驾驶算法岗,之前刷题不多,在此汇总下牛客网的真题,主要采用Python编写,个人觉得语言只是实现工具而已,并不是很关键,Python简洁易懂,更加适合算法工程师快速验证 ...

  5. 「解析」牛客网-华为机考企业真题 41-60

    又是一年春招时,有幸收到华为自动驾驶算法岗,之前刷题不多,在此汇总下牛客网的真题,主要采用Python编写,个人觉得语言只是实现工具而已,并不是很关键,Python简洁易懂,更加适合算法工程师快速验证 ...

  6. 「解析」牛客网-华为机考企业真题 21-40

    又是一年春招时,有幸收到华为自动驾驶算法岗,之前刷题不多,在此汇总下牛客网的真题,主要采用Python编写,个人觉得语言只是实现工具而已,并不是很关键,Python简洁易懂,更加适合算法工程师快速验证 ...

  7. 谷歌大脑发布神经网络的「核磁共振」,并公开相关代码

    作者:杨晓凡.camel.思颖.杨文 神经网络的可解释性一直是所有研究人员心头的一团乌云.传统的尝试进行可解释性研究的方法是通过查看网络中哪个神经元被激发来来理解,但是即使我们知道「第 538 号神经 ...

  8. 开源教程 「nlp-tutorial」!用百行代码搞定各类NLP模型

    ↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 参与:思源.贾伟   来源:机器之心 NLP 的研究,从词嵌入到 CNN ...

  9. 场景解析和语义分割区别_精准安防场景理解及语义分割

    原标题:精准安防场景理解及语义分割 前20位报名的朋友,可以立减200元学费 第21-50位报名的朋友,可以立减100元学费 课程简介: 继人脸识别之后,场景理解和语义分割正在成为人工智能的下一个风口 ...

最新文章

  1. Android中如何使用命令行查看内嵌数据库SQLite3
  2. Hadoop-2.2.0学习之二HDFS联盟
  3. ABAP源程序---发票校验明细表
  4. mxnet基础到提高(36)-单层神经网络
  5. Android拍照流程
  6. android 屏幕分辨率 屏幕密度,Android屏幕适配——多分辨率多屏幕密度
  7. vue 日期格式化返回指定个数月份_vue过滤器实现日期格式化的案例分析
  8. Go语言内置的基础类型
  9. MySQL中有exists关键字吗_Mysql中EXISTS关键字用法、总结
  10. 力扣 278.第一个错误的版本
  11. python数据框转化为矩阵_在Python中将系列重塑为Dataframe矩阵
  12. 「Algospot」量化QUANTIZE
  13. 开始学习编写用于 Windows SideShow 设备的小工具【转】
  14. CSS动画transform、transition和animation的区别
  15. [导入]WAP常见问题问答大全---七、关于WAP浏览器的常见问答
  16. numpy 的三角函数运算
  17. 飞机大战游戏python_《飞》字意思读音、组词解释及笔画数 - 新华字典 - 911查询...
  18. 好文推荐(二):临界点-产品思维与设计思维(7)
  19. 靠查看英语资料 , “一不小心”成了国内第一
  20. Nebula Graph学习篇1_基础概念、初步使用、整合SpringBoot使用

热门文章

  1. 游戏反外挂技术首次公开
  2. 国际物流概述:国际物流的流程是什么?
  3. YK线上机器redis配置(没有主从,单点,一致性哈希)
  4. 删除字符串中出现次数最少的字符,汽水瓶,简单密码
  5. 天天生鲜项目实战(一)
  6. phpunit 远程代码执行漏洞(CVE-2017-9841)复现
  7. 西北大学电影专硕考研考情与难度、参考书及上岸前辈备考经验
  8. spring 事务传播
  9. java skeleton_stub 和 skeleton 的讲解,自己实现一个stub和skeleton程序
  10. 图解时间自适应卷积----Time-aware Large Kernel Convolutions