目标检测之iou的计算

1. IoU的简介及原理解析

IoU 的全称为交并比(Intersection over Union),通过这个名称我们大概可以猜到 IoU 的计算方法。IoU 计算的是 “预测的边框” 和 “真实的边框” 的交集和并集的比值。

å¨è¿éæå¥å¾çæè¿°

 开始计算之前,我们首先进行分析下交集和并集到底应该怎么计算:我们首先需要计算交集,然后并集通过两个边框的面积的和减去交集部分即为并集,因此 IoU 的计算的难点在于交集的计算。 

让我们先思考一下两个框交集的计算。两个框交集的计算的实质是两个集合交集的计算,因此我们可以将两个框的交集的计算简化为:

我们假设集合 A 为[x_1,x_2],集合 B 为   [y_1,y_2]。然后我们来求AB交集的上下界限。

交集计算的逻辑

交集下界z_1:max\{ x_1,y_1\} ​    
交集上界 z_2: min\{x_2,y_2\}
如果z_2-z_1 ​小于0,则说明集合 A 和集合 B 没有交集。
下面使用Python来实现两个一维集合的 IoU 的计算: 

def iou(set_a, set_b):
    '''
    一维 iou 的计算
    '''
    x1, x2 = set_a # (left, right)
    y1, y2 = set_b # (left, right)
    
    low = max(x1, y1)
    high = min(x2, y2)
    # intersection
    if high-low<0:
        inter = 0
    else:
        inter = high-low
    # union
    union = (x2 - x1) + (y2 - y1) - inter
    # iou
    iou = inter / union
    return iou

上面,我们计算了两个一维集合的 iou,将上面的程序进行扩展,即可得到两个框 IoU 计算的程序。

def iou(box1, box2):
    '''
    两个框(二维)的 iou 计算
    
    注意:边框以左上为原点
    
   # box1=[top, left, bottom, right]=[x1_min,y1_min,x1_max,y1_max]
   # box2=[top, left, bottom, right]=[x2_min,y2_min,x2_max,y2_max]
    '''
   # in_h = min(x1_max, x2_max) - max(x1_min, x2_min)# 相交的长方形的高
    in_h = min(box1[2], box2[2]) - max(box1[0], box2[0])
 # in_w = min(y1_max, y2_max) - max(y1_min, y2_min)# 相交的长方形的宽
    in_w = min(box1[3], box2[3]) - max(box1[1], box2[1])
    if in_h<0 or in_w<0
         inter = 0  
    else 
       inter=in_h*in_w #长方形的面积长*宽
    union = (box1[2] - box1[0]) * (box1[3] - box1[1]) + \
            (box2[2] - box2[0]) * (box2[3] - box2[1]) - inter
    iou = inter / union
    return iou

猜你喜欢

转载自blog.csdn.net/weixin_38145317/article/details/89211286