来源 | 简明AI

头图 | 下载于视觉中国

出品 | AI 科技大本营(ID:rgznai100)

IOU中文名叫交并比,见名知意就是交集与并集的比值。是在目标检测中常用的算法。

IoU原理

如上图所示,就是计算上面阴影部分与下面阴影部分的比值。

我们来拆分一下任务,分子部分就是Box1与Box2交集的面积,先设为A1。分母部分是Box1与Box2并集集的面积,设为A2,其实也是Box1面积S1加上Box2面积S2再减去一个A1(为什么要减去A1呢,因为Box1与Box2重合了A1部分,需要减去一个,没想通的童鞋去面壁0.1秒钟去:)

IoU = A1 / A2

A2 = S1 + S2 -A1

IoU = A1 / (S1 + S2 -A1)

S1是Box1的面积,S2是Box2的面积。其实问题就转化为了对Box与A1求解。

下面我们继续拆解任务

1、坐标轴的定义

OpenCV坐标器

首先先看下在OpenCV中,坐标轴的定义。原点位于图片左上角,向右为X轴正方向,向下为Y轴正方向(这一点不同于数学中定义)。

2、Box表示与计算

Box有常用的两种表达方式:

1:Boxa = (xmin,ymin,xmax,ymax)(coco与voc格式);2:Boxb = (xcenter,ycenter,w,h)(yolo格式)。

其实就是根据一个事物的不同表达方式,本质上是一样的。

下面给出对应转换关系:

xmin,ymin,xmax,ymax = round(xcenter-(w/2.0)) ,round(ycenter-(h/2.0)),round(xcenter+(w/2.0)),round(ycenter+(h/2.0))
xcenter,ycenter,w,h = round((xmin+xmax)/2.0),round((ymin+ymax)/2.0),round(xmax-xmin),round(ymax-ymin)
Boxa = (round(Boxb[0]-(Boxb[2]/2.0)) ,round(Boxb[1]-(Boxb[3]/2.0),round(Boxb[0]+(Boxb[2]/2.0),round(Boxb[1]+(Boxb[3]/2.0))

Box的面积计算为 w*h

S_Boxa = (xmax-xmin)*(ymax-ymin) = (Boxa[2]-Boxa[0])*(Boxa[3]-Boxa[1])

S_Boxb = w*h = Boxb[2]*Boxb[3]

3、A1的表示与计算

box相交的一些情况

计算相交的面积和上个问题类似,只需计算出相交框的w与h如果没有相交,就是0。由上图可以发现以下规律:如果相交时

xmin =max(xmin1, xmin2)#相交框xmin是两个框的左上角x坐标的最大值:
ymin =max(ymin1, ymin2)#相交框ymin是两个框的左上角y坐标的最大值:
xmax =min(xmax1, xmax2)#相交框xmax是两个框的右下角x坐标的最大值:
ymax =min(ymax1, ymax2)#相交框ymax是两个框的右下角y坐标的最大值:

最后处理一下不想交的情况即可,可以发现当不想交时,就会至少出现一下情况的一种:

xmax<=xmin or ymax<ymin

所以处理方法很简单:出现任一情况,w or h就会有一个等于0,使得计算出的面积也为0

w =max(0, xmax - xmin)

h =max(0, ymax - ymin)

所以整体代码就挥之欲出了,是不是也挺简单的:)

代码

def cal_iou(box1, box2):""":param box1: = [xmin1, ymin1, xmax1, ymax1]:param box2: = [xmin2, ymin2, xmax2, ymax2]:return:"""xmin1, ymin1, xmax1, ymax1 = box1xmin2, ymin2, xmax2, ymax2 = box2# 计算每个矩形的面积s1 = (xmax1 - xmin1) * (ymax1 - ymin1)  # b1的面积s2 = (xmax2 - xmin2) * (ymax2 - ymin2)  # b2的面积# 计算相交矩形xmin = max(xmin1, xmin2)ymin = max(ymin1, ymin2)xmax = min(xmax1, xmax2)ymax = min(ymax1, ymax2)w = max(0, xmax - xmin)h = max(0, ymax - ymin)a1 = w * h  # C∩G的面积a2 = s1 + s2 - a1iou = a1 / a2 #iou = a1/ (s1 + s2 - a1)return iou

参考链接:

https://blog.csdn.net/guyuealian/article/details/86488008#commentBox

https://blog.csdn.net/weixin_40922744/article/details/102988751

文章来源:https://xiaosongshine.blog.csdn.net/article/details/108244497


60+专家,13个技术领域,CSDN 《IT 人才成长路线图》重磅来袭!
直接扫码或微信搜索「CSDN」公众号,后台回复关键词「路线图」,即可获取完整路线图!更多精彩推荐
☞赠书 | VR 设备装备指南☞微软每年豪砸安全研发 10 亿美元,聊聊背后的技术密码☞3D 建模费时费力,Python 让照片秒变模型点分享点收藏点点赞点在看

Python 极简实现 IoU相关推荐

  1. Python极简实现IoU

    Python极简实现IoU IoU概念 Box的表示与计算 A1交集情况 IoU概念 交并比(Intersection-over-Union,IoU),就是交集与并集的比值,是在目标检测中常用的算法. ...

  2. 30个Python极简代码

    Python 是机器学习最广泛采用的编程语言,它最重要的优势在于编程的易用性.如果读者对基本的 Python 语法已经有一些了解,那么这篇文章可能会给你一些启发.作者简单概览了 30 段代码,它们都是 ...

  3. python 极简词云

    ''' python 极简词云 by 郑瑞国 安装模块: pip3 install wordcloud                 pip3 install matplotlib ''' from ...

  4. Python极简入门教程

    前言 为了方便各位小白能轻松入门Python,同时加深自己对Python的理解,所以创造了"Python极简入门教程",希望能帮到大家,若有错误请多指正,谢谢.极简入门教程代表着不 ...

  5. python 滤波_[开发技巧]·Python极简实现滑动平均滤波(基于Numpy.convolve)

    [开发技巧]·Python极简实现滑动平均滤波(基于Numpy.convolve) ​ 1.滑动平均概念 滑动平均滤波法(又称递推平均滤波法),时把连续取N个采样值看成一个队列 ,队列的长度固定为N ...

  6. Python极简讲义——一本书入门数据分析与机器学习(序言)

    为什么写此书? 我们正处于一个数据科技(Data Technology,简称DT)的时代.我们的一举一动,都有能在数据空间留下电子印记.于是海量的社交.电商.行为及科研大数据铺面而来.然而,太多的数据 ...

  7. python数据分析入门书籍-Python极简讲义:一本书入门数据分析与机器学习

    "1.轻松入门:文笔流畅,通俗易懂,从Python基础.NumPy.Pandas.Matplotlib,到机器学习算法,循序渐进,帮助零基础读者快速入门.2.图文并茂:一图胜千言,书中配有精 ...

  8. 你好Python -- 极简Python教程

    你好Python -- 极简Python教程 本教程针对Python业余爱好者,展示入门级的编程知识. 目录 你好Python -- 极简Python教程 一. 你好Python! 二. 我想对Pyt ...

  9. 知乎高清原图下载python极简脚本

    1.脚本,注意修改保存目录和爬取链接 # 爬取的知乎文字 #本例爬取 <已续更wlop鬼刀高清壁纸系列4K8K都有不多说看图全知乎放上来最多最好的好吧✧*.٩(ˊωˋ*)و✧*鬼刀wlop> ...

最新文章

  1. Dockerfile镜像的制作
  2. 关于中断处理程序中的关中断函数disable_irq和disable_irq_nosync
  3. PAT甲级1149 Dangerous Goods Packaging :[C++题解]哈希表、逆向思维
  4. nginx可以负载均衡多个tomcat,nginx主机挂了怎么办?Keepalived
  5. 如何自动判断url中汉字的编码格式
  6. mybatis错误之配置文件属性配置问题
  7. redis实践的一点思路,关于支付回调
  8. 【转】 UML各种线的含义
  9. jquery 时间相减获取天数_JQuery Datepicker实现JavaScript日期相减的小例子
  10. [CERC2017]Intrinsic Interval(神仙+线段树)
  11. Go 遍历map时的key随机化问题及解决方法
  12. Python设计模式(七)【命令模式】
  13. verilog实现格雷码(Gray Code)与二进制编码转换
  14. mysql单表多次内联接查询学科名称,一级学科名称二级学科名称三级学科名称
  15. 原生javascript分页 html分页与ajax数据请求结合使用 前端js分页
  16. 统信UOS桌面版游戏攻略
  17. C# 导出Excel、组件NPOI设置单元格格式
  18. 实验记录 | 8/14
  19. 1.tessent命令学习笔记
  20. yara规则--构建yara规则库

热门文章

  1. PostgreSQL SQL 语言:并行查询
  2. Ring Tone Manager on Windows Mobile
  3. 微软MCITP系列课程
  4. delphi中的第三方控件如何安装 (转)
  5. 基于架构的上网行为管理产品界面对比
  6. oracle中 关于触发器,oracle 闪回关于触发器的bug
  7. Java获取文件的目录_Java实现读取某个路径下的文件目录
  8. Pycharm中实现查找和替换
  9. [Git] 拉开发分支的代码报错
  10. Java 常用对象-Date类和Calender类