给定两个检测框的左上角和左下角坐标,求两个检测框之间的交并比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