目标检测之IoU(交并比)详解及代码实现

1. IOU概述

       IoU的全称为交并比(Intersection over Union),是目标检测中使用的一个概念,IoU计算的是“预测的边框”和“真实的边框”的交叠率-,即它们的交集和并集的比值。最理想情况是完全重叠,即比值为1。

2. IoU计算

       IoU等于“预测的边框”和“真实的边框”之间交集和并集的比值。IoU计算如下图,B1为真实边框,B2为预测边框。
在这里插入图片描述

3. IoU代码实现

       现在有两个框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)

输出:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Roaddd/article/details/114023447