目标检测当中,经常会提到一个词语或者说概念叫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