赞
踩
IoU的全称为交并比(Intersection over Union),是目标检测中使用的一个概念,IoU计算的是“预测的边框”和“真实的边框”的交叠率-,即它们的交集和并集的比值。最理想情况是完全重叠,即比值为1。
IoU等于“预测的边框”和“真实的边框”之间交集和并集的比值。IoU计算如下图,B1为真实边框,B2为预测边框。
现在有两个框A和B,如下图。A=[ax1,ay1,ax2,ay2],B=[bx1,by1,bx2,by2]。接下来想统计A和B的交集面积,A自己的面积和B自己的面积。三个待求值里面最关键的就是怎么求交集面积(图中红色框)。
假设A和B是相交的,存在交集。这个时候怎么求交集框(红色框)的左上角坐标和右下角坐标呢?我们发现,当A和B有交集的时候,交集框(红色框)的左上角坐标是max(A的左上角坐标,B的左上角坐标),右下角是min(A的右下角坐标,B的右下角坐标)。那么:
那么当A和B没有交集的时候,h和w的值小于0,如果没有交集,被减数一定小于减数。所以为了鲁棒性,我们最终的inter是这样计算的:
这样当A和B没有交集,inter的值就是0.分子为0,则IoU为0。
● Python代码:
def iou(box1, box2): ''' 两个框(二维)的 iou 计算 注意:边框以左上为原点 box:[x1,y2,x2,y2],依次为左上右下坐标 ''' h = max(0, min(box1[2], box2[2]) - max(box1[0], box2[0])) w = max(0, min(box1[3], box2[3]) - max(box1[1], box2[1])) area_box1 = ((box1[2] - box1[0]) * (box1[3] - box1[1])) area_box2 = ((box2[2] - box2[0]) * (box2[3] - box2[1])) inter = w * h union = area_box1 + area_box2 - inter iou = inter / union return iou box1 = [0,0,2,2] box2 = [1,1,3,3] IoU = iou(box1,box2) print(IoU)
输出:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。