源码:SORT源码
在SORT流程中,需要对各个检测框和跟踪框对计算IoU,进而得到cost matrix,以此cost matrix作为匈牙利算法的输入,得到检测框和跟踪框之间的相应匹配。
def iou_batch(bb_test, bb_gt):
# From SORT: Computes IOU between two bboxes in the form [x1,y1,x2,y2]
# 增加维度,通常是为了确保输入具有正确的维度,以便进行广播操作
bb_gt = np.expand_dims(bb_gt, 0)
bb_test = np.expand_dims(bb_test, 1)
#这种切片语法允许函数更加通用和灵活,能够处理不同形状和维度的输入数组,而不仅仅是固定形状的二维数组。
xx1 = np.maximum(bb_test[..., 0], bb_gt[..., 0])
yy1 = np.maximum(bb_test[..., 1], bb_gt[..., 1])
xx2 = np.minimum(bb_test[..., 2], bb_gt[..., 2])
yy2 = np.minimum(bb_test[..., 3], bb_gt[..., 3])
# 确保宽高非负
w = np.maximum(0., xx2 - xx1)
h = np.maximum(0., yy2 - yy1)
wh = w * h
o = wh / ((bb_test[..., 2] - bb_test[..., 0]) * (bb_test[..., 3] - bb_test[..., 1])
+ (bb_gt[..., 2] - bb_gt[..., 0]) * (bb_gt[..., 3] - bb_gt[..., 1]) - wh)
return (o)
bb_test和bb_gt分别是检测框和追踪框,假设分别有D个和T个框,那么形状分别是(D,4)和(T,4)。
np.expand_dims增加维度后形状分别是(1,D,4)和(T,1,4)。
按照IoU计算步骤,得到交集框的左上角和右下角坐标,代码中的具体运算用到了广播机制和切片运算符,易得到四个坐标的形状均是(T,D)。(刚好是我们想要的cost matrix的形状,检测框和跟踪框两两计算)
后续步骤类似,省略,可结合上述三篇文章的链接理解。