python计算公式分母有0_python计算iou(交并比)

目标检测当中,经常会提到一个词语或者说概念叫iou,全称intersection over union,也就是交并比,指的是相交的的区域面积比上相并的区域面积,简单来讲就是交集除以并集,我们用python代码实现一下

公式如下:

变换一下,分母可以用面积减去相交的面积表示:

所以,我们只要求出两块区域各自的面积和相交的面积即可求出iou,两块区域各自的面积很好求,直接用(ymax-ymin) * (xmax - xmin)即可求出(也就是长乘以宽),而对于相交的区域长宽怎么求呢?

通常来讲,两个box相交会有以下四种情况:

但是,你细品,会发现,四种情况可以合成一种求法:

我们用左上角的点(xmin, ymin)和右下角 (xmax, ymax) 的点表示一个长方形,那么两个区域为 (xmin0, ymin0, xmax0, ymax0) 和 (xmin1, ymin1, xmax1, ymax1),其实我们找到两块区域xmax中较小的那个,再找到两块区域xmin中较大的那个,相减就是宽,同理,找到两区域ymax较小的那个,ymin较大的那个,相减就是高,从而宽x高就得出面积了,即 (min(xmax0, xmax1) - max(xmin0, xmin1)) * (min(ymax0, ymax1) - max(ymin0, ymin1))

我们用python代码实现一下:

def iou(rect1, rect2):

xmin1, ymin1, xmax1, ymax1 = rect1

xmin2, ymin2, xmax2, ymax2 = rect2

s1 = (xmax1 - xmin1) * (ymax1 - ymin1)

s2 = (xmax2 - xmin2) * (ymax2 - ymin2)

sum_area = s1 + s2

left = max(xmin2, xmin1)

right = min(xmax2, xmax1)

top = max(ymin2, ymin1)

bottom = min(ymax2, ymax1)

if left >= right or top >= bottom:

return 0

intersection = (right - left) * (bottom - top)

return intersection / (sum_area - intersection ) * 1.0

调用一下

In [7]: iou([1, 2, 3, 4], [2, 2, 3, 4])

Out[7]: 0.5

viencoding.com版权所有,允许转载,但转载请注明出处和原文链接: https://viencoding.com/article/279

欢迎小伙伴们在下方评论区留言 ~ O(∩_∩)O

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值