记录手撕iou面试代码

在这个函数中,boxAboxB 是包含四个整数的列表,代表边界框的四个坐标: [开始x, 开始y, 结束x, 结束y]。

这个函数首先计算两个边界框的交集面积,然后计算每个边界框的面积和两个边界框的并集面积,最后用交集面积除以并集面积,得到的结果就是IOU。

def bbox_intersection_over_union(boxA, boxB):
    # 确定每个边界框的 (y, x) 的 (开始,结束) 坐标
    xA = max(boxA[0], boxB[0])
    yA = max(boxA[1], boxB[1])
    xB = min(boxA[2], boxB[2])
    yB = min(boxA[3], boxB[3])

    # 计算交集的面积
    interArea = max(0, xB - xA + 1) * max(0, yB - yA + 1)

    # 计算每个边界框的面积
    boxAArea = (boxA[2] - boxA[0] + 1) * (boxA[3] - boxA[1] + 1)
    boxBArea = (boxB[2] - boxB[0] + 1) * (boxB[3] - boxB[1] + 1)

    # 计算并集的面积
    unionArea = boxAArea + boxBArea - interArea

    # 计算交并比
    iou = interArea / float(unionArea)

    # 返回交并比
    return iou
  • xA 是两个边界框左上角 x 坐标的较大值,表示交集的左上角 x 坐标。
  • yA 是两个边界框左上角 y 坐标的较大值,表示交集的左上角 y 坐标。
  • xB 是两个边界框右下角 x 坐标的较小值,表示交集的右下角 x 坐标。
  • yB 是两个边界框右下角 y 坐标的较小值,表示交集的右下角 y 坐标。

这些计算是为了找到两个边界框的交集部分的坐标范围,这将用于计算交集的面积。如果 xA 大于 xB 或者 yA 大于 yB,说明两个边界框没有交集,此时交集的面积将为0。

 

猜你喜欢

转载自blog.csdn.net/weixin_64043217/article/details/130966538