计算机视觉高频面试题——求两个检测框的IOU

给定两个检测框的左上角和左下角坐标,求两个检测框之间的交并比IOU。

首先求两个检测框的交集

def intersection(a_box, b_box):
    """
    计算两个矩形框的交集面积。
    Args:
        a_box: (list or tuple) 矩形框 A 的坐标,格式为 [x1, y1, x2, y2]
        b_box: (list or tuple) 矩形框 B 的坐标,格式为 [x1, y1, x2, y2]
    Returns:
        float: 两个矩形框的交集面积,如果没有交集则返回 0.0
    """
    # 计算交集区域左上角和右下角的坐标
    x1 = max(a_box[0], b_box[0])  # 交集区域左上角的 x 坐标
    y1 = max(a_box[1], b_box[1])  # 交集区域左上角的 y 坐标
    x2 = min(a_box[2], b_box[2])  # 交集区域右下角的 x 坐标
    y2 = min(a_box[3], b_box[3])  # 交集区域右下角的 y 坐标

    # 如果交集区域的宽度或高度小于等于 0,则说明没有交集
    if x1 >= x2 or y1 >= y2:
        return 0.0

    a_b_inter = float((x2 - x1 + 1.0) * (y2 - y1 + 1.0))    

    # 计算交集区域的面积
    return a_b_inter 

然后求两个检测框的IOU

def IoU(a_box, b_box):
    """
    计算矩形框 A 和 B 的交并比(Intersection over Union),
    即交集面积占联合区域(交集 + 独立部分)的比例。
    Args:
        a_box: (list or tuple) 矩形框 A 的坐标,格式为 [x1, y1, x2, y2]
        b_box: (list or tuple) 矩形框 B 的坐标,格式为 [x1, y1, x2, y2]
    Returns:
        float: 交并比值,如果联合区域面积为 0,则返回 0.0
    """
    # 计算交集面积
    a_b_inter = intersection(a_box, b_box)
    # 计算矩形框 A 的面积
    a_box_area = (a_box[2] - a_box[0] + 1) * (a_box[3] - a_box[1] + 1)
    # 计算矩形框 B 的面积
    b_box_area = (b_box[2] - b_box[0] + 1) * (b_box[3] - b_box[1] + 1)
    # 计算联合区域的面积
    a_b_union = a_box_area + b_box_area - a_b_inter
    # 计算交并比,并避免分母为 0 的情况
    return a_b_inter / max(a_b_union, 1.0)

输入:a_box = [45,45,155,155],b_box = [50,50,150,150]

输出:0.8