详解计算miou的代码以及混淆矩阵的意义

miou的定义

  1. '''
  2. Mean Intersection over Union(MIoU,均交并比):为语义分割的标准度量。其计算两个集合的交集和并集之比.
  3. 在语义分割的问题中,这两个集合为真实值(ground truth)和预测值(predicted segmentation)。
  4. 这个比例可以变形为正真数(intersection)比上真正、假负、假正(并集)之和。在每个类上计算IoU,之后平均。
  5. 对于21个类别,分别求IOU:
  6. 例如,对于类别1的IOU定义如下:
  7. (1)统计在ground truth中属于类别1的像素数
  8. (2)统计在预测结果中每个类别1的像素数
  9. (1) + (2)就是二者的并集像素数(类比于两块区域的面积加和, 注:二者交集部分的面积加重复了)
  10. 再减去二者的交集(既在ground truth集合中又在预测结果集合中的像素),得到的就是二者的并集(所有跟类别1有关系的像素:包括TP,FP,FN)
  11. 扩展提示:
  12. TP(真正): 预测正确, 预测结果是正类, 真实是正类
  13. FP(假正): 预测错误, 预测结果是正类, 真实是负类
  14. FN(假负): 预测错误, 预测结果是负类, 真实是正类
  15. TN(真负): 预测正确, 预测结果是负类, 真实是负类 #跟类别1无关,所以不包含在并集中
  16. (本例中, 正类:是类别1, 负类:不是类别1)
  17. mIoU:
  18. 对于每个类别计算出的IoU求和取平均
  19. '''
  20. ————————————————
  21. 版权声明:本文为CSDN博主「你吃过卤汁牛肉吗」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
  22. 原文链接:https://blog.csdn.net/u012370185/article/details/94409933
  1. class mIOU:
  2. def __init__(self, num_classes):
  3. self.num_classes = num_classes
  4. self.hist = np.zeros((num_classes, num_classes))
  5. # 返回的是混淆矩阵
  6. def _fast_hist(self, label_pred, label_true):
  7. # 去除背景
  8. # ground truth中所有正确(值在[0, classe_num])的像素label的mask
  9. mask = (label_true >= 0) & (label_true < self.num_classes)
  10. # 计算出每一类(0-n**2-1)中对应的数(0-n**2-1)出现的次数,返回值为(n,n)
  11. # confusion_matrix是一个[num_classes, num_classes]的矩阵,
  12. # confusion_matrix矩阵中(x, y)位置的元素代表该张图片中真实类别为x, 被预测为y的像素个数
  13. '''
  14. 关于下面的混淆矩阵如何计算出来的可能会有些初学者不大理解,笔者根据自己的想法对下面的代码有一定的见解,
  15. 可能有一定错误,欢迎指出
  16. 我们之前得到的是两张由0-num_class-1的数字组成的label,分别对应我们的类别总数
  17. self.num_classes * label_true[mask].astype(int),这段代码通过将label_true[mask]乘以num_class
  18. 第0类还是0,第一类的数字变成num_class(注意这是在原来的图上操作),以此类推,
  19. +label_pred[mask],对于这一步我举个栗子,比如groundtrue是第一类,num_class=21,在之前操作已经将该像素块
  20. 变成21了,如果我预测的还是第一类,则这一像素块变成了22,在bincount函数中,使得数字22的次数增加了1,在后面的reshape中
  21. 数字22对于的就是第二行第第二列,也就是对角线上的(因为混淆矩阵的定义就是对角线上的就是预测正确的,即TP),所以得到了
  22. hist就是混淆矩阵
  23. '''
  24. hist = np.bincount(
  25. self.num_classes * label_true[mask].astype(int) +
  26. label_pred[mask], minlength=self.num_classes ** 2).reshape(self.num_classes, self.num_classes)
  27. return hist
  28. def add_batch(self, predictions, gts):
  29. for lp, lt in zip(predictions, gts):
  30. self.hist += self._fast_hist(lp.flatten(), lt.flatten())
  31. def evaluate(self):
  32. '''
  33. miou = TP / (TP+FN+TN)
  34. 因此下面的式子显然是计算miou的
  35. :return:
  36. '''
  37. iu = np.diag(self.hist) / (self.hist.sum(axis=1) + self.hist.sum(axis=0) - np.diag(self.hist))
  38. return np.nanmean(iu[1:])

详解计算miou的代码以及混淆矩阵的意义的更多相关文章

  1. 训练技巧详解【含有部分代码】Bag of Tricks for Image Classification with Convolutional Neural Networks

    训练技巧详解[含有部分代码]Bag of Tricks for Image Classification with Convolutional Neural Networks 置顶 2018-12-1 ...

  2. SENet详解及Keras复现代码

    转: SENet详解及Keras复现代码 论文地址:https://arxiv.org/pdf/1709.01507.pdf 代码地址:https://github.com/hujie-frank/S ...

  3. rabbitmq五种模式详解(含实现代码)

    一.五种模式详解 1.简单模式(Queue模式) 当生产端发送消息到交换机,交换机根据消息属性发送到队列,消费者监听绑定队列实现消息的接收和消费逻辑编写.简单模式下,强调的一个队列queue只被一个消 ...

  4. Console命令详解,让调试js代码变得更简单

    Firebug是网页开发的利器,能够极大地提升工作效率. 但是,它不太容易上手.我曾经翻译过一篇<Firebug入门指南>,介绍了一些基本用法.今天,继续介绍它的高级用法. ======= ...

  5. [转] Console命令详解,让调试js代码变得更简单

    http://www.cnblogs.com/see7di/archive/2011/11/21/2257442.html Firebug是网页开发的利器,能够极大地提升工作效率. 但是,它不太容易上 ...

  6. Bullet核心类介绍(Bullet 2.82 HelloWorld程序及其详解,附程序代码)

    实验平台:win7,VS2010 先上结果截图: 文章最后附有生成该图的程序. 1. 刚体模拟原理 Bullet作为一个物理引擎,其任务就是刚体模拟(还有可变形体模拟).刚体模拟,就是要计算预测物体的 ...

  7. jquery轮播图详解,40行代码即可简单解决。

    我在两个月以前没有接触过html,css,jquery,javascript.今天我却在这里分享一篇技术贴,可能在技术大牛面前我的文章漏洞百出,也请斧正. 可以看出来,无论是div+css布局还是jq ...

  8. 利用jquery对ajax操作,详解原理(附代码)

    1. jQuery load() 方法 jQuery load() 方法是简单但强大的 AJAX 方法. load() 方法从服务器加载数据,并把返回的数据放入被选元素中. 语法: $(selecto ...

  9. 通俗易懂详解Java代理及代码实战

    一.概述 代理模式是Java常用的设计模式之一,实现代理模式要求代理类和委托类(被代理的类)具有相同的方法(提供相同的服务),代理类对象自身并不实现真正的核心逻辑,而是通过调用委托类对象的相关方法来处 ...

随机推荐

  1. jvm-learning-运行时数据区-整体

    在jdk8之后之前的方法区有叫做元数据. 每个JVM只有一个Runtime实例,即为运行时环境,相当于内存结构种的运行时数据区 线程 线程是一个程序里的运行单元,JVM允许一个应用有多个线程并行的执行 ...

  2. Semaphore 有什么作用 ?

    Semaphore 就是一个信号量,它的作用是限制某段代码块的并发数.Semaphore 有一个构造函数,可以传入一个 int 型整数 n,表示某段代码最多只有 n 个线程可 以访问,如果超出了 n, ...

  3. System.getenv和getProperty的区别

    /** * System.getenv()是获取---环境变量(environment variables), * 系统层面的,好比我linux系统里的.bash_profile文件里面的变量 * 返 ...

  4. kafka指定partiton生产

    kafka发送一个消息的时候需要封装成一个ProducerRecord : public ProducerRecord(String topic, Integer partition, Long ti ...

  5. 介绍一下 WebApplicationContext ?

    WebApplicationContext 是 ApplicationContext 的扩展.它具有 Web 应用 程序所需的一些额外功能.它与普通的 ApplicationContext 在解析主题 ...

  6. 设计一个简单的devops系统

    前言 公司设计的RDMS挺好用的,我也照猫画虎简单的设计一个DevOps系统,与大家分享,不足之处欢迎拍砖,以免误人子弟 前置条件 gitlab gitlab-runner k8s 1. gitlab ...

  7. 基于 WPF和ASP.NET Core 在线音视频聊天项目

    Dimension 基于 .NET 6 的在线音视频聊天项目 WPF和ASP.NET API开发 使用第三方依赖介绍 公用依赖 log4net 日志记录. SignalR 用于服务器与客户端的通讯手段 ...

  8. Unity中让Update中的方法执行一次

    Unity中让Update中的方法执行一次 Unity中,很多时候,代码需要放在Update中时刻监测状态,一旦状态符合,又只需要代码执行一次:其实可以通过设置控制量的方式,让代码只执行一次:方法:设 ...

  9. idea maven web项目tomcat本地部署

    条件:1.安装jdk   2.安装tomcat idea 创建maven web项目部署在 tomcat maven plugin中 本地部署: 1.新建maven web项目 2.输入项目名称 3. ...

  10. Native方法的使用

    Java不是完美的,Java的不足除了体现在运行速度上要比传统的C++慢许多之外,Java无法直接访问到操作系统底层(如系统硬件等),为此Java使用native方法来扩展Java程序的功能. 可以将 ...