理论
衡量锚框与真实边界框之间的相似性
计算的iou是每一个锚框(anchor box)和每一个真实边界框(gt bounding box)的交并比。
交并比的计算,此处参考《动手学》的代码,并做了详细的解释
代码
def box_iou(boxes1,boxes2):
#输入:boxes1:[boxes1数量,4],boxes2:[boxes2数量,4],boxes1是锚框,boxes2是真实gt边界框
# 输出:交并比[boxes1数量,boxes2数量]
#定义lambda表达式,计算矩形框的面积
box_area = lambda boxes:((boxes[:,2]-boxes[:,0])*(boxes[:,3]-boxes[:,1]))
#计算锚框(anchor box)的面积,[boxes1数量]
areas1 = box_area(boxes1)
#计算真实边界框gt bounding box的面积,[boxes2数量]
areas2 = box_area(boxes2)
#计算交集左上点的坐标,[boxes1数量,boxes2数量,2]见下图
inter_upperlefts = torch.max(boxes1[:,None,:2],boxes2[:,:2])
#计算交集右下点的坐标,[boxes1数量,boxes2数量,2]原理同上
inter_lowerrights = torch.min(boxes1[:,None,2:],boxes2[:,2:])
#得到交集的宽和高,[boxes1数量,boxes2数量,2],clamp限制输出最小为0(min=0)
inters = (inter_lowerrights - inter_upperlefts).clamp(min=0)
#得到交集的面积[boxes1数量,boxes2数量]
inter_areas = inters[:,:,0]*inters[:,:,1]
#得到并集的面积[boxes1数量,boxes2数量],此处又用到了广播机制
union_areas = areas1[:,None] + areas2 - inter_areas
#得到交并比[boxes1数量,boxes2数量]
return inter_areas/union_areas
inter_upperlefts = torch.max(boxes1[:,None,:2],boxes2[:,:2])
#个人觉得此处用了广播机制,boxes1:[n1,1,2],boxes2:[n2,2],所以boxes2扩充至[n1,n2,2],boxes1扩充至[n1,n2,2],也就是对每个boxes1的锚框都要和所有的gt框进行iou的计算。
#关于torch.max,在此处类同torch.maximum
a1 = torch.tensor([2,3])
a2 = torch.tensor([1,4])
torch.max(a1,a2)
>tensor([2, 4])