IOU,全称为intersection of union, 中文名“交并比”。这个概念理解起来不难,本文将从原理以及代码实践来解读IOU。

首先要说明的是,IOU在检测领域和分割领域都有应用,但这两个领域的IOU计算方式是不一样的。所以本文就分为两个部分。分别讲解在分割和检测两个领域的IOU计算方式。

分割领域的IOU计算方式


假设白色区域为1,黑色区域为0。
根据IOU计算公式:
iou=A∩BA∪Biou = \frac{A \cap B}{A \cup B}iou=A∪BA∩B​
假设网络输出为A,GT为B。
那么A交B非常好算。

intersection = (A * B).sum()

A并B的计算方式,就是A的白色面积+B的白色面积, 减去A和B的交集。

union = A.sum() + B.sum() - intersection

最终的IOU就是:

IOU = intersection / union

对于多类的语义分割任务计算IOU

上面讲解的例子属于二类分割,语义分割所要处理的数据集往往都是很多类的。网络输出的map的shape是[Batchsize, N, H, W], N是数据集的类别。这个时候我们如何计算IOU呢。
假设label的shape是[Batchsize , H, W], 值的范围是[0-N-1]

A = net(X) # A是网络输出,shape为[Batchsize, N, H, W]
A = np.argmax(A, axis=1)  # A的shape现在为 [Batchsize, H, W],和Gt一致
A += 1
Gt += 1
intersection = A * (A == Gt)
area_inter, _ = np.histogram(intersection, bins= NUMCLASS, range=(1, NUMCLASS))
area_pred, _ = np.histogram(A, bins= NUMCLASS, range=(1, NUMCLASS))
area_label, _ = np.histogram(Gt, bins= NUMCLASS, range=(1, NUMCLASS))
area_union = area_pred + area_label - area_inter
iou = area_inter / area_union
miou = iou.mean()

做一下解释。np.histogram是统计直方图的函数,通过该函数,

  • 我们得知交集中每一个类别的像素值数目是多少

area_inter, _ = np.histogram(intersection, bins= NUMCLASS, range=(1, NUMCLASS))

  • 得知预测结果的每一类别的像素值数目是多少

area_pred, _ = np.histogram(A, bins= NUMCLASS, range=(1, NUMCLASS))

  • 得知label中每一个类别的像素值数目是多少

area_label, _ = np.histogram(Gt, bins= NUMCLASS, range=(1, NUMCLASS))

然后还是利用了两个集合的并集等于两个集合相加减去公共的部分

area_union = area_pred + area_label - area_inter

这里得到了每一个类的IOU,Miou就是求均值,这就是最后两句代码的含义。

检测任务中的IOU计算方式

依然是根据IOU的计算公式:
iou=A∩BA∪Biou = \frac{A \cap B}{A \cup B}iou=A∪BA∩B​
假设A是预测,B是GT。
先求交集。

我这里仅分析如何获得X轴上的交集区域的宽。另一个维度的分析类似的。
问号所指的长度使我们想求的。
W?=WA+WB−(Bxmax−Axmin)W_? = WA+WB - (Bxmax - Axmin)W?​=WA+WB−(Bxmax−Axmin)

然后我们使用相同的分析方法,得到H?H_?H?​。交集区域的面积就是
Sinter=W?∗H?S_{inter} = W_? * H_?Sinter​=W?​∗H?​

知道了交集,并集就好求了。
还是根据并集定理,A和B的并集是A和B的相加减去A和B的交集。
Sunion=SA+SB−SinterS_{union} = S_A + S_B - S_{inter}Sunion​=SA​+SB​−Sinter​

代码实践:

def iou(axmin,aymin,axmax,aymax, bxmin,bymin, bxmax, bymax):width = min(axmin,bxmin) + (axmax-axmin) + (bxmax-bxmin) - max(axmax,bxmax)height = min(aymin,bymin) + (aymax-aymin) + (bymax-bymin) - max(aymax,bymax)return max(width*height/((ymax-ymin)*(xmax-xmin) + (aymax-aymin)*(axmax-axmin) - width*height), 0)

最后结果的结果要和0比较,因为如果得到的IOU小于0,说明没有交集,iou为0.但是分子的面积仍然是非0数字,是负数。所以最后需要和0比较。

深度学习中的IOU计算方式和代码实践相关推荐

  1. 总结 62 种在深度学习中的数据增强方式

    数据增强 数据增强通常是依赖从现有数据生成新的数据样本来人为地增加数据量的过程 这包括对数据进行不同方向的扰动处理 或使用深度学习模型在原始数据的潜在空间(latent space)中生成新数据点从而 ...

  2. 深度学习中的正则化技术(附Python代码)

    作者:SHUBHAM JAIN 翻译:和中华 校对:丁楠雅 本文约3500字,建议阅读20分钟. 本文简单介绍了什么是正则化以及在深度学习任务中可以采用哪些正则化技术,并以keras代码具体讲解了一个 ...

  3. 深度学习中的IoU概念理解

    1.什么是IoU(Intersection over Union) IoU是一种测量在特定数据集中检测相应物体准确度的一个标准.IoU是一个简单的测量标准,只要是在输出中得出一个预测范围(boundi ...

  4. 如何上手深度学习中的图像处理?有这个代码资源库就够了

    仙女为大家整理的代码资源库,收集了大量深度学习项目图像处理领域的代码链接.包括图像识别,图像生成,看图说话等等方向的代码,所有代码均按照所属技术领域建立索引,以便大家查阅使用. 2.1 图像生成  2 ...

  5. 深度学习中常见的LOSS函数及代码实现

    Introduction 训练深度学习模型地目的只有一个,尽可能的学习到训练数据的分布.像往常的考试一样,考试成绩会有一个分数作为评判标准,评价你对于知识点地掌握情况,以便后续针对性地去学习.深度学习 ...

  6. 深度学习中感受野的计算

    一直以来很奇怪感受野是怎么计算的,这里参考了两个博客总算是看懂了. http://blog.csdn.net/skying_li/article/details/70158924 http://blo ...

  7. pytorch深度学习中每个epoch运行时间的统计代码

    开头部分引入time模块, import time 然后在每个epoch循环中开始处加入: since = time.time() 结尾处加入以下代码: time_elapsed = time.tim ...

  8. 深度学习中的激活函数与梯度消失

    转载请注明出处:http://www.cnblogs.com/willnote/p/6912798.html 前言 深度学习的基本原理是基于人工神经网络,信号从一个神经元进入,经过非线性的激活函数,传 ...

  9. 深度学习中的随机数种子

    深度学习中的随机数种子 seed()函数的作用 解释 例子1 例子2 深度学习中的随机数种子 训练过程 测试过程 代码随机种子的设定 本文参考网络上对于seed函数的讲解,记录一下我对于这个函数作用的 ...

最新文章

  1. Java日志体系权威总结
  2. css 行内元素设置宽高
  3. Maven打包web项目报错:webxml attribute is required (or pre-existing WEB-INF/web.xml if executing in update)
  4. postfix+sasl+dovecot
  5. 如何面向用户价值编写敏捷开发用户故事
  6. SpringBoot与quartz框架实现分布式定时任务
  7. docker 安装gitlab
  8. c语言中 字母对应的数值,C语言编程:求下式中每个字母所代表的数字
  9. 第四节:教你如何快速让浏览器兼容ES6特性
  10. pythonfor循环加2_初中生教你编程---python(for循环)part 2
  11. 肖申克的救赎【观影记录及经典台词摘录】
  12. mysql解题器_mysql触发器,答题记录表同步教学跟踪(用户列表)
  13. HTTP hijack
  14. 配置 DNS over HTTPS阻止DNS污染
  15. git bug分支管理
  16. vue中使用vue-awesome-swiper的方法(实现一屏展示多个图片,点击左右滚动一张)
  17. css实现一个温度计图表
  18. php微信支付需要哪些设置,如何申请和配置微信支付接口?
  19. 工作站是高档的微型计算机 (,家用pc机和工作站有什么不同?
  20. c# u盘使用记录_C# 监测U盘插入与拔出事件

热门文章

  1. 护卫神主机大师或者是主机管理系统中创建网站时提示开设失败的解决办法
  2. 怎么才能快速批量给视频添加BGM
  3. java中结束进程的方法_java关闭Process
  4. 在windows平台下php使用imagick库把pdf转换成(合并)图片
  5. Python 爬虫实例(15) 爬取 汽车之家(汽车授权经销商)
  6. 不容忽视的10个新兴硬件技术
  7. python的try和except用法_Python中的错误和异常处理简单操作示例【try-except用法】...
  8. PySide2、nltk、wordcloud、gensim、sklearn、pyinstaller实现词嵌入可视化、绘制词云图、制作GUI并打包的踩坑总结
  9. 中国高钛渣行业产业投资分析及需求前景预测报告2022-2027年
  10. 非递归算法和递归算法的效率分析