在这个函数中,boxA
和 boxB
是包含四个整数的列表,代表边界框的四个坐标: [开始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。