目标检测之IOU详解

什么是IOU

IoU 的全称为交并比(Intersection over Union),通过这个名称我们大概可以猜到 IoU 的计算方法。IoU 计算的是 “预测的边框” 和 “真实的边框” 的交集和并集的比值。
IOU的计算过程可以参考博客:https://blog.csdn.net/u014061630/article/details/82818112

需要计算两部分

1.并集:首先需要计算交集,然后并集通过两个边框的面积的和减去交集部分即为并集,因此 IoU 的计算的难点在于交集的计算。
2.交集:
计算过程如下:
目标检测之IOU详解_第1张图片目标检测之IOU详解_第2张图片
交集计算的关键是交集上下界点(图中蓝点)的计算。
我们假设集合 A 为 {x1,x2},集合B为{y1,y2}
然后我们来求AB交集的上下界限。
交集计算的逻辑:
(1)交集下界:z1 = max(x1,y1)
(2)交集上届:z2 = min(x2,y2)
(3)如果z2-z1小于0,则说明集合 A 和集合 B 没有交集。

IOU计算代码

(1)两个一维集合的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

(2)可得到两个框 IoU 计算的程序

def iou(box1, box2):
    '''
    两个框(二维)的 iou 计算
    注意:边框以左上为原点
    box:[top, left, bottom, right]
    '''
    in_h = min(box1[2], box2[2]) - max(box1[0], box2[0])
    in_w = min(box1[3], box2[3]) - max(box1[1], box2[1])
    inter = 0 if in_h<0 or in_w<0 else 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

你可能感兴趣的:(目标检测)