代码参考博客原文: 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. GPU图形绘制管线简介

    (阅读GPU+编程与CG+语言之阳春白雪下里巴人所得总结) GPU图形绘制管线是描述GPU渲染(把三维世界显示为屏幕上的二维图像)的流程,主要分为三个主要阶段应用程序阶段.几何阶段.光栅阶段. 1.应 ...

  2. Spring Cloud(一):服务注册中心Eureka

    Spring Cloud 基于 Netflix 的几个开源项目进行了封装,提供包括服务注册与发现(Eureka),智能路由(Zuul),熔断器(Hystrix),客户端负载均衡(Ribbon)等在内的 ...

  3. redis最新版本安装及开机自启

    的系统是ubuntu,安装方式有多种,一种是通过apt仓库,一种是下载源码,编译安装 1.通过apt仓库 具体命令: sudo apt-get update sudo apt-get install ...

  4. XSS基础学习

    XSS基础学习 By:Mirror王宇阳 什么是XSS XSS攻击是指在网页中嵌入一段恶意的客户端Js脚本代码片段,JS脚本恶意代码可以获取用户的Cookie.URL跳转.内容篡改.会话劫持--等. ...

  5. floyd + 最大流 (奶牛分配问题)

    FJ has moved his K (1 <= K <= 30) milking machines out into the cow pastures among the C (1 &l ...

  6. 换装WIN10(windows)那点儿事,换装操作系统一文通,玩转安装操作系统

    目录 1. 按 2. win10对电脑配置的要求 3. 原版镜像下载 4. 制作U盘系统盘 5. 硬盘分区调整 6. 设置开机时从U盘启动 7. 安装win10 8. 如何激活WIN10 9. 如何给 ...

  7. vue引用外部JS的两种种方案

    前言 肯定会遇到没有npm化的库 自己写的js 方法 在Vue中该怎么引用呢 第一种 如果库是es6写的 就可以用import 引入 比如我自己写的http 封装接口的方法 就可以这样子导入哦 第二种 ...

  8. 异步查询转同步加redis业务实现的BUG分享

    在最近的性能测试中,某一个查询接口指标不通过,开发做了N次优化,最终的优化方案如下:异步查询然后转同步,再加上redis缓存.此为背景. 在测试过程中发现一个BUG:同样的请求在第一次查询结果是OK的 ...

  9. 「 扫盲 」Web服务器和应用服务器的区别

    我们经常使用apache,tomcat,nginx,jetty等服务器,但并不清楚它们间的区别,它们中,哪些是Web服务器,哪些是应用服务器?今天就来告诉你 Web服务器 理解WEB服务器,首先你要理 ...

  10. 前端基础JavaScript

    JavaScript概述 ECMAScript和JavaScript的关系 1996年11月,JavaScript的创造者--Netscape公司,决定将JavaScript提交给国际标准化组织ECM ...