1. 定义
对于生成的锚框,我们应当采取一种量化手段来评价当前锚框对于真实边界框的匹配度,等价于衡量锚框与真实边界框之间的相似性。因此,引入了交并比的概念。(即通过像素集的杰卡德系数来测量锚框和真实边框的相似性)。交并比的取值范围为[0, 1] , 0表示完全不重合, 1表示完全重合。
图示:
2. 实现思路
- 计算锚框与真实框各自的面积;
- 计算锚框与真实框相交部分左上角点和右下角点的位置坐标;
- 计算每一个锚框与每一个真实框的交集和并集面积;
- 将得到的交集面积与并集面积相除从而得到 IOU 值矩阵;
3. 实现代码
def box_iou(anchor_boxes, gt_boxes):
"""
:param anchor_boxes: anchor_boxes 坐标列表, 形状为 [anchor_boxes number, 4] -> [m, 4]
:param gt_boxes: gt_boxes 坐标列表, 形状为 [gt_boxes number, 4] -> [n, 4]
:return: anchor_boxes 和 gt_boxes 一一对应的 IOU 矩阵, 形状为 [anchor_boxes number, gt_boxes number]
"""
# 矩形框面积的计算函数
box_area = lambda boxes: (boxes[:, 2] - boxes[:, 0]) * (boxes[:, 3] - boxes[:, 1])
# 求解 anchor_boxes 和 gt_boxes 的面积
# anchor_boxes_area 形状为 [m, ]
# gt_boxes_area 形状为 [n, ]
anchor_boxes_area = box_area(anchor_boxes)
gt_boxes_area = box_area(gt_boxes)
# 求解 anchor_boxes 和 gt_boxes 交集左上角点和右下角点的坐标
# 利用广播机制一次性完成 每一个 anchor 与 每一个 gt_box 交集坐标的求解
# anchor_boxes[:, None, :2] -> [m, 1, 2]; gt_boxes[:, :2] -> [n, 2] 广播机制下分别都被填充为 -> [m, n, 2], 然后求对应位置元素最大或最小值
# inter_upperlefts -> [m, n, 2]; inter_lowerrights -> [m, n, 2]
inter_upperlefts = torch.max(anchor_boxes[:, None, :2], gt_boxes[:, :2])
inter_lowerrights = torch.min(anchor_boxes[:, None, 2:], gt_boxes[:, 2:])
# 计算交集、并集面积
# inters -> [m, n, 2] , 其中 ‘2’ 是交集的w和h
# inters_area -> [m, n, 1]
inters = (inter_lowerrights - inter_upperlefts).clamp(min=0)
inters_area = inters[:, :, 0] * inters[:, :, 1]
# 利用广播机制一次性完成 每一个 anchor 与 每一个 gt_box 并集面积的求解
# union_area -> [m, n, 1]
union_area = anchor_boxes_area[:, None] + gt_boxes_area - inters_area
return inters_area / union_area