前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python 极简实现 IoU

Python 极简实现 IoU

作者头像
AI科技大本营
发布2023-05-08 13:40:07
3150
发布2023-05-08 13:40:07
举报

来源 | 简明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格式)。

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

下面给出对应转换关系:

代码语言:javascript
复制
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。由上图可以发现以下规律:如果相交时

代码语言:javascript
复制
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)

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

代码

代码语言:javascript
复制
def cal_iou(box1, box2):
    """
    :param box1: = [xmin1, ymin1, xmax1, ymax1]
    :param box2: = [xmin2, ymin2, xmax2, ymax2]
    :return:
    """
    xmin1, ymin1, xmax1, ymax1 = box1
    xmin2, 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 - a1
    iou = 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

代码语言:javascript
复制
60+专家,13个技术领域,CSDN 《IT 人才成长路线图》重磅来袭!直接扫码或微信搜索「CSDN」公众号,后台回复关键词「路线图」,即可获取完整路线图!更多精彩推荐☞赠书 | VR 设备装备指南☞微软每年豪砸安全研发 10 亿美元,聊聊背后的技术密码☞3D 建模费时费力,Python 让照片秒变模型点分享点收藏点点赞点在看
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-04-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AI科技大本营 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 参考链接: 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
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档