语义分割常见评价指标global_acc, mean_acc, mean_iou计算,个人学习记录,仅供参考。

一、理论计算

假设真实标签为:

预测标签为:

则手动列出混淆矩阵可得:

1.1 全局准确率

预测正确的像素数量 / 总的像素数量
global_acc = (1+1+1+1+0) / 9 = 4 / 9 = 0.4444,即混淆矩阵对角线元素之和除以混淆矩阵所有元素和。

1.2 平均准确率

分别算出每一类的准确率,分子为对角线元素,分母为真实标签i数量,这里具体为第i行的元素和。
cls_0_acc = 1 / (1+2) = 1/3;
cls_1_acc = 1 / (1+1+1) = 1/3;
cls_2_acc = 1 / 1 = 1;
cls_3_acc = 1 / 1 = 1;
cls_4_acc = 0 / 1 = 0;
mean_acc = (1/3 + 1/3 + 1 + 1 + 0) / 5 = 8/15 = 0.5333

1.3 平均iou

分别计算出每一类的iou,再求平均。
cls_0_iou = 1 / (3 + 2 - 1) = 1/4;
cls_1_iou = 1 / (3 + 3 - 1) = 1/5;
cls_2_iou = 1 / (1 + 1 - 1) = 1;
cls_3_iou = 1 / (1 + 2 - 1) = 1/2;
cls4_iou = 0 / (1 + 1 - 0) = 0;
mean_iou = (1/4 + 1/5 +1 + 1/2 + 0) / 5 = 0.39

参考链接:
语义分割前言
基于pytorch的FCN网络简单实现

二、代码实现

2.1 计算混淆矩阵

计算真实标签与预测标签的混淆矩阵,先贴出代码再详细分析过程。

def _fast_hist(label_true, label_pred, n_class):# 根据真实标签和预测标签计算混淆矩阵mask = (label_true >= 0) & (label_true < n_class)hist = np.bincount(n_class * label_true[mask].astype(int) +label_pred[mask], minlength= n_class**2).reshape(n_class, n_class)return hist

详细分析:

import numpy as np
true_l = np.array([[0,0,1],[1,3,2],[4,1,0]])pred_l = np.array([[0,1,1],[0,3,2],[3,4,1]])def _fast_hist(label_true, label_pred, n_class):# mask在元素值大于等于0,小于等于n_class的地方填Truemask = (label_true >= 0) & (label_true < n_class)print('mask:\n', mask)# label_true[mask]用mask中为true的索引取label_trueprint('label_true[mask]:\n', label_true[mask].astype(int))# 以下个人理解为相当于编码过程,label_true看成'十位',label_pred看成'个位'# 将5*5的矩阵与0-24的地址对应上print('n_class * label_true[mask]:\n', n_class * label_true[mask].astype(int))print('label_pred[mask]:\n', label_pred[mask])print('n_class * label_true[mask].astype(int) + label_pred[mask]:\n',n_class * label_true[mask].astype(int) + label_pred[mask])hist = np.bincount(n_class * label_true[mask].astype(int) +label_pred[mask], minlength= n_class**2).reshape(n_class, n_class)print('hist:\n', hist)return hist_fast_hist(label_true=true_l, label_pred=pred_l, n_class=5)

输出结果:

mask:[[ True  True  True][ True  True  True][ True  True  True]]
label_true[mask]:[0 0 1 1 3 2 4 1 0]
n_class * label_true[mask]:[ 0  0  5  5 15 10 20  5  0]
label_pred[mask]:[0 1 1 0 3 2 3 4 1]
n_class * label_true[mask].astype(int) + label_pred[mask]:[ 0  1  6  5 18 12 23  9  1]
hist:[[1 2 0 0 0][1 1 0 0 1][0 0 1 0 0][0 0 0 1 0][0 0 0 1 0]]

其中np.bincount()输出不同元素出现的次数,注意参数minlength的作用,参考链接:
np.bincount()用法介绍
numpy.bincount详解

2.2 根据混淆矩阵计算各指标

def label_accuracy_score(label_trues, label_preds, n_class):hist = np.zeros((n_class, n_class))# 一个batch里可能有多个数据,通过迭代器逐个计算for lt, lp in zip(label_trues, label_preds):hist += _fast_hist(lt.flatten(), lp.flatten(), n_class)  # 其实这里也可以不flatten, 函数值arr[mask]这一步也可帮忙拉平print('hist:\n', hist)acc = np.diag(hist).sum() / hist.sum()  # 混淆矩阵对角线元素和 / 所有元素和acc_cls = np.diag(hist) / hist.sum(axis=1)  # hist.sum(axis=1) => [3,3,1,1,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)  # hist.sum(axis=0) => [2,3,1,2,1],对应每一类预测标签数量freq = hist.sum(axis=1) / hist.sum()fwavacc = (freq[freq > 0] * iu[freq > 0]).sum()  # 没弄懂是什么意思return acc, acc_cls, mean_iu, fwavaccprint('======计算指标======')
acc, acc_cls, mean_iu, fwavacc = label_accuracy_score(label_trues=true_l, label_preds=pred_l, n_class=5)
print('global_acc', acc)
print('mean_acc:', acc_cls)
print('mean_iou:', mean_iu)
print('fwavacc', fwavacc)

输出结果:

======计算指标======
hist:[[1. 2. 0. 0. 0.][1. 1. 0. 0. 1.][0. 0. 1. 0. 0.][0. 0. 0. 1. 0.][0. 0. 0. 1. 0.]]
global_acc 0.4444444444444444
mean_acc: 0.5333333333333333
mean_iou: 0.39
fwavacc 0.31666666666666665

Tips:
1.np.diag()返回矩阵对角元素
2.np.nanmean(),计算时忽略nan,参考链接:
np.nansum()、np.nanmean() 函数用法

语义分割 评价指标(global_acc, mean_acc, mean_iou)等numpy实现相关推荐

  1. 憨批的语义分割重制版2——语义分割评价指标mIOU的计算

    憨批的语义分割重制版2--语义分割评价指标mIOU的计算 注意事项 学习前言 什么是mIOU mIOU的计算 1.计算混淆矩阵: 2.计算IOU: 3.计算mIOU: 计算miou 注意事项 这是针对 ...

  2. 详解语义分割评价指标

    本文主要介绍语义分割的三大评价指标,分别是执行时间.内存占用以及准确度,本文着重介绍准确度. 一.执行时间 二.内存占用 三.准确度 假设一共有k+1类(包括k个目标类和1个背景类): 1.Pixel ...

  3. 语义分割评价指标mIOU

    mIOU定义 Mean Intersection over Union(MIoU,均交并比),为语义分割的标准度量.其计算两个集合的交集和并集之比,在语义分割问题中,这两个集合为真实值(ground ...

  4. 【语义分割】评价指标:PA、CPA、MPA、IoU、MIoU详细总结和代码实现(零基础从入门到精通系列!)

    文章目录 引言 1 混淆矩阵 2 语义分割 PA:像素准确率 CPA:类别像素准确率 MPA:类别平均像素准确率 IoU:交并比 MIoU:平均交并比 3 综合实例 步骤一:输入真实.预测图片 步骤二 ...

  5. 语义分割各种评价指标实现

    前言 现存其实已经有很多博客实现了这个代码,但是可能不完整或者不能直接用于测试集的指标计算,这里简单概括一下. 一些概念.代码参考: [1] 憨批的语义分割9--语义分割评价指标mIOU的计算 [2] ...

  6. 霹雳吧啦Wz语义分割学习笔记P3

    P3.FCN网络结构详解 1.前言 Fully Convolutional Networks for Semantic Segmentation 2015CVPR https://arxiv.org/ ...

  7. 计算机视觉算法——语义分割网络总结

    计算机视觉算法--语义分割网络总结 计算机视觉算法--语义分割网络总结 1. FCN 1.1 关键知识点--网络结构及特点 1.2 关键知识点--转置卷积 1.3 关键知识点--语义分割评价指标 2. ...

  8. 图像语义分割模型综述

    文章目录 一.语义分割介绍 二.语义分割的思路 空洞卷积 条件随机场 三.经典语义分割算法介绍 1.FCN 2.UNet Family (1)UNet (2)Attention U-Net (3)UN ...

  9. 【语义分割】评价指标代码函数:np.sum()、np.nansum()、np.nanmean()、np.diag()、np.bincount()

    引言 本文针对: [语义分割]评价指标:PA.CPA.MPA.IoU.MIoU详细总结和代码实现(零基础从入门到精通系列!)中实现评价指标代码里相关函数进行补充说明,包括:np.sum().np.na ...

最新文章

  1. python两数交换 函数_Python 为什么只需一条语句“a,b=b,a”,就能直接交换两个变量?...
  2. 利物浦大学的vlog网站
  3. java中文本框显示在命令按钮后面_Maya中Pymel写个带界面的重命名工具(一)
  4. Silverlight进度条控件动画源代码
  5. c语言编写点餐系统的图形界面,「分享」C语言如何编写图形界面
  6. 消息中间件学习总结(2)——RocketMQ之阿里开源消息中间件RocketMQ的前世今生
  7. 防灾科技学院计算机好就业吗,防灾科技学院2015年毕业生就业质量报告.pdf
  8. Chromium Embedded Framework中文文档 (SVN属性)
  9. NIS 病毒库 更新 地址
  10. 非功能测试之界面测试和易用性测试
  11. 标准gpx文件的时间格式
  12. 百度云盘Mac破解不限制下载速度-百度网盘客户端 - Go语言编写
  13. 麒麟子Javascript游戏编程零基础教程六:Javascript中的实数类型number
  14. turn.js 异步请求图片资源,实现电子书翻页效果 报错 ”The page 1 dose not exist”
  15. 颈椎病自我治疗预防颈椎病
  16. ThingsBoard 多个设备的最新遥测数据合并计算案例
  17. TC275——04Blinky-LED
  18. android水波纹动画制作,Framer之事件 | 如何制作安卓点击水波纹效果?
  19. 宇视网络视频录像机国标对接配置指导
  20. 视频添加字幕哪个软件好用?推荐三款添加字幕的软件

热门文章

  1. 计算机cpu损坏,电脑cpu坏了的处理方法
  2. linux操作系统适合作网络服务器的基本平台工作,WindowsNT和UNIX或Linux操作系统均适合作网络服务器的基本平台工作。()...
  3. 阿里云oss使用ossimport从又拍云迁移文件数据
  4. jsp中引用js文件 path
  5. c语言学生管理界面菜单,c语言学生管理系统之菜单
  6. 一箭穿心动画css3代码
  7. 托软件,本软件仅供研究学习代码交流
  8. 基于Cent os 云服务器中SVN 服务器的搭建
  9. docker三剑客docker-compose、docker-machine、swarm
  10. 光大银行王磊:数据共享需重点防范第三方风险