代码参考博客原文: https://blog.csdn.net/jiongnima/article/details/84750819

在原文和原文的引用里,找到了关于mIoU详尽的解释。这里重点解析 fast_hist(a, b, n) 这个函数的代码。

生成混淆矩阵的代码:

 #设标签宽W,长H
def fast_hist(a, b, n):#a是转化成一维数组的标签,形状(H×W,);b是转化成一维数组的标签,形状(H×W,);n是类别数目,实数(在这里为19)
'''
核心代码
'''
k = (a >= 0) & (a < n)#k是一个一维bool数组,形状(H×W,);目的是找出标签中需要计算的类别(去掉了背景)
return np.bincount(n * a[k].astype(int) + b[k], minlength=n ** 2).reshape(n, n)#np.bincount计算了从0到n**2-1这n**2个数中每个数出现的次数,返回值形状(n, n)

在调用了 k = (a >= 0) & (a < n) 以后,得到了bool数组,那它长什么样子呢?举个栗子说明:

构造一个4×4的数组a,把背景值设置为255,除背景外类别共3个,分别为1, 2, 3

mushroomer@mushroomerMate:~$ python3
Python 3.7.1rc2 (default, Jun 14 2019, 23:23:01)
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy as np
>>> a = np.array([[255, 0, 0, 255], [255, 255, 2, 2], [1, 1, 1, 255], [255, 255, 255, 255]])>>> a
array([[255, 0, 0, 255],
[255, 255, 2, 2],
[ 1, 1, 1, 255],
[255, 255, 255, 255]])
>>> n = 3
>>> k = (a >= 0) & (a < n)
>>> k
array([[False, True, True, False],
[False, False, True, True],
[ True, True, True, False],
[False, False, False, False]])
>>> a[k]
array([0, 0, 2, 2, 1, 1, 1])

可以看出,k是个和a尺寸相同的bool数组,有效类别都标记为True,背景全部标记为False

a[k] 会把 k 标记的 True 对应在 a 中的值都提取出来。

再以 n = 3 为例,混淆矩阵如下:

混淆矩阵映射关系:

$index=n*class(a)+class(b)$

之后是np.bincount, 这个函数统计下标在目标列表中出现的次数。例如:

Python 3.7.1 (default, Dec 10 2018, 22:54:23) [MSC v.1915 64 bit (AMD64)] :: Anaconda, Inc. on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy as np
>>> np.bincount([0, 0, 0, 2, 1, 1, 3])
array([3, 2, 1, 1], dtype=int64)
>>> np.bincount([0, 0, 0, 2, 1, 1, 3], minlength=7)
array([3, 2, 1, 1, 0, 0, 0], dtype=int64)
>>> np.bincount([0, 0, 0, 2, 1, 1, 9], minlength=7)
array([3, 2, 1, 0, 0, 0, 0, 0, 0, 1], dtype=int64)

列表中最大值为3,统计 [0, 1, 2, 3] 对应每个元素在输入列表中出现的次数,得到 [3, 2, 1, 1], 含义是:0出现3次;1出现2次;2出现1次;3出现1次。

如果指定 minlength, 则认为列表中最大值为 max_value = max(max([0, 0, 0, 2, 1, 1, 3]), minlength),然后去统计 list(range(max_value)) 对应每个元素在输入列表中出现的次数。

在 fast_hist 函数中指定 minlength = n ** 2, 目的是使输出长度为 n ** 2, 输出形状就正好可以转换为 n * n 矩阵。当然根据 np.bincount 函数的特性,类别值如果超过 minlength,输出长度就不是 n ** 2 了,因此我举的栗子里背景值为 255 显然是不合适的,^_^,意识到了吗?

然后统计出来混淆矩阵每个 index 对应的 (class a 重叠 class b) 出现的次数,就得到了结果。这里的映射关系重点是要理解每个 index 都对应唯一一个 class a 重叠 class b,例如 n = 3, class a = 1, class b = 2,那么对应的 index = 3*1 + 2 = 5,对应填到混淆矩阵里。假如 class a = 2, class b = 1, 那 index = 3*2 + 1 = 7,index 就变成了7,这个 index 是一一对应的。

mIoU混淆矩阵生成函数代码详解的更多相关文章

  1. 混淆矩阵-MATLAB代码详解

    一.混淆矩阵 (一).简介 在人工智能中,混淆矩阵(confusion matrix)是可视化工具,特别用于监督学习,在无监督学习一般叫做匹配矩阵.在图像精度评价中,主要用于比较分类结果和实际测得值, ...

  2. 代码详解:TensorFlow Core带你探索深度神经网络“黑匣子”

    来源商业新知网,原标题:代码详解:TensorFlow Core带你探索深度神经网络“黑匣子” 想学TensorFlow?先从低阶API开始吧~某种程度而言,它能够帮助我们更好地理解Tensorflo ...

  3. 非极大值抑制(NMS,Non-Maximum Suppression)的原理与代码详解

    1.NMS的原理 NMS(Non-Maximum Suppression)算法本质是搜索局部极大值,抑制非极大值元素.NMS就是需要根据score矩阵和region的坐标信息,从中找到置信度比较高的b ...

  4. Github-jcjohnson/torch-rnn代码详解

    Github-jcjohnson/torch-rnn代码详解 zoerywzhou@gmail.com http://www.cnblogs.com/swje/ 作者:Zhouwan  2016-3- ...

  5. DeepLearning tutorial(3)MLP多层感知机原理简介+代码详解

    本文介绍多层感知机算法,特别是详细解读其代码实现,基于python theano,代码来自:Multilayer Perceptron,如果你想详细了解多层感知机算法,可以参考:UFLDL教程,或者参 ...

  6. BM算法  Boyer-Moore高质量实现代码详解与算法详解

    Boyer-Moore高质量实现代码详解与算法详解 鉴于我见到对算法本身分析非常透彻的文章以及实现的非常精巧的文章,所以就转载了,本文的贡献在于将两者结合起来,方便大家了解代码实现! 算法详解转自:h ...

  7. ASP.NET MVC 5 学习教程:生成的代码详解

    原文 ASP.NET MVC 5 学习教程:生成的代码详解 起飞网 ASP.NET MVC 5 学习教程目录: 添加控制器 添加视图 修改视图和布局页 控制器传递数据给视图 添加模型 创建连接字符串 ...

  8. Github-karpathy/char-rnn代码详解

    Github-karpathy/char-rnn代码详解 zoerywzhou@gmail.com http://www.cnblogs.com/swje/ 作者:Zhouwan  2016-1-10 ...

  9. JAVA类与类之间的全部关系简述+代码详解

    本文转自: https://blog.csdn.net/wq6ylg08/article/details/81092056类和类之间关系包括了 is a,has a, use a三种关系(1)is a ...

随机推荐

  1. 【转】Java多线程面试问题集锦

    如果你即将去一家从事大型系统研发的公司进行Java面试,不可避免的会有多线程相关的问题.下面是一些针对初学者或者新手的问题,如果你已经具备良好的基础,那么你可以跳过本文,直接尝试针对进阶水平的Java ...

  2. QGIS WGS84转其它坐标系并计算坐标

    需求: 将带有经度.纬度(WGS84坐标系)坐标的文本(*.txt)转换成指定投影坐标系的shp文件并计算x,y坐标. 环境和工具: WIN10.QGIS2.16.带有经纬度坐标的文本.格式如下图: ...

  3. 三、Nginx原理解析

    Nginx原理解析 一.反向代理 工作流程 用户通过域名发出访问Web服务器的请求,该域名被DNS服务器解析为反向代理服务器的IP地址: 反向代理服务器接受用户的请求: 反向代理服务器在本地缓存中查找 ...

  4. 【Tool】---SVN的超级简单并具体得使用介绍

    又一次被打脸,笔者表示再也不相信自己的记性了.简单的SVN隔了一段时间后,由于项目的需要要重新简历代码库,竟然一下子又忘了.天那,这就好比战士上了战场发现没带枪,这能行吗?因此,趁着今天又简短的复习了 ...

  5. 【PCIE-4】---PCIE中部分概念或问题总结(很基础很重要)

    前面三小节,介绍了PCIE的基本知识和概念,以及扫描流程.在不求甚解的情况下,我想各位小伙伴应该对PCIE有了个宏观的认识,OK,那么本章我们在之前的基础上,再单独把一些概念和更深层次的问题摘出来具体 ...

  6. 字符串 hash - 不停地删掉字母

    Censor frog is now a editor to censor so-called sensitive words (敏感词). She has a long text p . Her j ...

  7. Spring(二)核心容器 - 简介 、BeanFactory、ApplicationContext

    目录 前言 1.容器简介 2.容器的结构 2.1 BeanFactory 2.2 ApplicationContext 2.2.1 ConfigurableApplicationContext 2.2 ...

  8. 本地缓存google.guava及分布式缓存redis 随笔

    近期项目用到了缓存,我选用的是主流的google.guava作本地缓存,redis作分布式 缓存,先说说我对本地缓存和分布式缓存的理解吧,可能不太成熟的地方,大家指出,一起 学习.本地缓存的特点是速度 ...

  9. python 线程池实用总结

    线程池的两张方法 submit 和map from concurrent.futures import ThreadPoolExecutor import time # def sayhello(a) ...

  10. P1553 数字反转(升级版)

    题目描述 给定一个数,请将该数各个位上数字反转得到一个新数. 这次与NOIp2011普及组第一题不同的是:这个数可以是小数,分数,百分数,整数.整数反转是将所有数位对调:小数反转是把整数部分的数反转, ...