IoU 简介及原理概述
Intersection over Union(IoU)是一种测量在特定数据集中检测相应物体准确度的一个标准(摘自:百度百科)。通过其英文名可以很直观的看出其计算方法:交并比,即检测的边框结果与真实的边框结果的交集比上它们的并集,其取值范围限制在[0, 1]。
IoU 的定义如下图所示:
计算方式如下:(1)计算两个检测框的交集面积;(2)计算两个检测框各自的面积;(3)两个检测框的面积和减去交集面积,得到两个检测框的并集面积;(4)利用定义,求得IOU值。 由此分析,计算 IoU的难点在于求两个检测框的交集。
IoU 的python实现
IoU的计算思路就是第一部分中的介绍,但是对于编程来说,如何根据两个检测框的坐标求得其交集面积及IoU值呢???
(注:图像坐标系与我们平常数学中接触到坐标系不同哦!!!图像坐标体系中的零点坐标为图片的左上角,X轴为图像矩形的上面那条水平线;Y轴为图像矩形左边的那条垂直线。)
为了求交集面积,只要知道上图中两个蓝色点的坐标(或另外两个角坐标)即可。在此,我们假设两个边框的坐标分别为:rect1(left0, top0, right0, bottom0)、rect2(left1, top1, right1, bottom1)【其中(leftX, topX)为矩形左上角的坐标,(rightX,bottomX)为矩形右下角的坐标】。那么交集框的坐标为:
- left = max(left0, left1)
- top = max(top0, top1)
- right = min(right0, right1)
- bottom = min(bottom0, bottom1)
交集框左上和右下两个角的坐标分别为[left, top]、[right, bottom]。以上可简单理解为:左上角坐标取两个框x轴的最大值及y轴的最大值;右下角的坐标取两个框x轴的最小值及y轴最小值。
在这判断过程中,还需要考虑两个框不相交的情况:其实也很简单,情况1):交集框左上角的X轴的值大于右下角的X轴值(即 left >= right);情况2):交集框左上角的Y轴的值大于右下角的Y轴值(即 top>=bottom)【这个地方与常识有点相悖,此时一定谨记:该坐标系是图像坐标系哦!】。
IoU计算过程中的情况分析完毕,下面则是展现真正成果的时候了!!!!!!!!!!!!!!!
def calculate_IOU(rec1,rec2):
""" 计算两个矩形框的交并比
Args:
rec1: [left1,top1,right1,bottom1] # 其中(left1,top1)为矩形框rect1左上角的坐标,(right1, bottom1)为右下角的坐标,下同。
rec2: [left2,top2,right2,bottom2]
Returns:
交并比IoU值
"""
left_max = max(rec1[0],rec2[0])
top_max = max(rec1[1],rec2[1])
right_min = min(rec1[2],rec2[2])
bottom_min = min(rec1[3],rec2[3])
#两矩形相交时计算IoU
if (left_max < right_min or bottom_min > top_max): # 判断时加不加=都行,当两者相等时,重叠部分的面积也等于0
rect1_area = (rec1[2]-rec1[0])*(rec1[3]-rec1[1])
rect2_area = (rec2[2]-rec2[0])*(rec2[3]-rec2[1])
area_cross = (bottom_min - top_max)*(right_min - left_max)
return area_cross / (rect1_area + rect2_area - area_cross)
else:
return 0