赞
踩
一共8个视频序列,4个训练集,4个测试集。测试集的gt没有给出,因此想要得到测试集的结果需要在MOT官网上传你的结果去评估。
每个图片都是jpg格式,且命名为6个数字的文件如(000001.jpg)
平均每帧有246个行人。
除了行人,注释还包括车辆和自行车等其他类别。
如图所示:每一列分别代表,
1:该目标出现的帧号
2:该目标被分配的唯一ID号,在det(检测)文件中为-1
3:目标bbox左上角的x坐标。
4:目标bbox左上角的y坐标。
5:目标bbox的宽
6:目标bbox的高
7:置信度。det中表示该目标是行人的概率,gt中若评估该目标则设为1,忽略则设置为0
8:gt中表示该目标的类别,Det为-1
9:可见率,gt中表示该目标可见的程度,可能被遮挡或者是图像边框裁剪导致目标不完整,值为0-1。det中为-1
类别表示
det样例
gt样例
每个视频序列一个txt文本,命名为sequence.txt
,每一行表示一个目标,包含10个值,以,
分割:
<frame>, <id>, <bb_left>, <bb_top>, <bb_width>, <bb_height>, <conf>, <x>, <y>, <z>
前7个值和训练集的gt意义一样,conf
填充1,最后3个值表示3D MOT,评估2D数据集时,最后3个值x,y,z
填充为-1,同样,评估3D数据集时,将bbox4个值填充为-1
对应frame, id
和bbox坐标都是从1开始,如下:
1, 3, 794.27, 247.59, 71.245, 174.88, 1, -1, -1, -1
1, 6, 1648.1, 119.61, 66.504, 163.24, 1, -1, -1, -1
1, 8, 875.49, 399.98, 95.303, 233.93, 1, -1, -1, -1
...
提交时,需要将所有视频序列的结果打包成zip,包括训练集,只需要将训练集的gt复制过来。
评价跟踪性能的好坏,MOTchallenge提供了一个评估脚本可以直接下载使用,点击网站,截止2021-06-26官方发布的最新的评估方法
数据关联
即预测和gt进行匹配。
评估tracker性能的好坏,有两个先决条件:
通过计算GT和预测的框的IOU,当大于阈值0.5时被评估是TP,小于阈值则为FP。所有预测都没有找到gt中的目标,则被评估为FN,TN表示背景。FN和FP越少表示结果越好。
细节:
我们认为每个gt轨迹有唯一的开始和结束点,没有片段。当一个目标离开视野,又重新出现,被视为一个新的目标分配新的id。
如果 g t i gt_i gti和假设 p r e j pre_j prej在第t-1帧时匹配,即使在第t帧 g t i gt_i gti和 p r e j pre_j prej的距离低于阈值 t d t_d td,仍然将 g t i , p r e j gt_i,pre_j gti,prej匹配。
另请注意,虽然 id-sw的数量保持较低当然是可取的,但仅凭它们的绝对数量并不总是能表达评估整体性能,而应考虑恢复目标的数量。
举例说明:
4个例子表示匹配的情况。每条虚线表示一个gt的轨迹,每条实线表示不同预测的轨迹,不同颜色表示不同ID,如红线表示ID1,蓝线表示ID2。阴影部分表示gt和预测的阈值范围。阴影中的轨迹没有被涂黑的gt,表示没有预测和gt匹配被评估为FN,被涂黑的表示被跟踪到,实线连接的目标被涂成实心表示该ID和gt匹配成功,评估为TP。实线的空心被评估为FP,虚线的空心被评估为FN。
当gt在第t帧和ID2匹配成功,然而在第t-1帧和ID1匹配成功,即发生了ID转换。如(a)的4,5。
从图c可以看到,第三帧时蓝色轨迹和上面的gt轨迹距离最近但是还是将gt分配给了红色轨迹,是因为第二帧是红色轨迹和gt匹配成功,如果红色轨迹也在阈值范围内后面就优先匹配红色轨迹。对比图a,第5帧时,红色轨迹在阈值外,蓝色轨迹最靠近gt且在阈值内,将gt分配给了蓝色轨迹,发生了id-sw。
图d,表示了re-id特征不够鲁棒,第5帧蓝色轨迹更靠近gt且第4帧gt轨迹断了,没有映射,因此将蓝色轨迹分配给gt,导致id-sw。
motmetrics对应code:
def eval_frame(self, frame_id, trk_tlwhs, trk_ids, rtn_events=False): # results 预测的bbox和id trk_tlwhs = np.copy(trk_tlwhs) trk_ids = np.copy(trk_ids) # gts gt_objs = self.gt_frame_dict.get(frame_id, []) gt_tlwhs, gt_ids = unzip_objs(gt_objs)[:2] # ignore boxes ignore_objs = self.gt_ignore_frame_dict.get(frame_id, []) ignore_tlwhs = unzip_objs(ignore_objs)[0] # remove ignored results keep = np.ones(len(trk_tlwhs), dtype=bool) iou_distance = mm.distances.iou_matrix(ignore_tlwhs, trk_tlwhs, max_iou=0.5) # pdb.set_trace() # 从预测中剔除掉和需要忽略的gt相匹配的bbox if len(iou_distance) > 0: match_is, match_js = mm.lap.linear_sum_assignment(iou_distance) match_is, match_js = map(lambda a: np.asarray(a, dtype=int), [match_is, match_js]) match_ious = iou_distance[match_is, match_js] match_js = np.asarray(match_js, dtype=int) match_js = match_js[np.logical_not(np.isnan(match_ious))] # 得到和需要忽略的gt匹配的预测下标 keep[match_js] = False trk_tlwhs = trk_tlwhs[keep] trk_ids = trk_ids[keep] # get distance matrix iou_distance = mm.distances.iou_matrix(gt_tlwhs, trk_tlwhs, max_iou=0.5) # acc self.acc.update(gt_ids, trk_ids, iou_distance) if rtn_events and iou_distance.size > 0 and hasattr(self.acc, 'last_mot_events'): events = self.acc.last_mot_events # only supported by https://github.com/longcw/py-motmetrics else: events = None return events
度量
目标类别定义为沿着视野范围可达的没有物理遮挡的所有直立行走的人。
reflections,反射,在透明墙和窗户背后的人被排除。
骑自行车或者其他交通工具的人也被排除在目标类别之外。
在最终评估的时候只使用那些被标记为pedestrains的框。
MOTA
t是帧的下标,GTt表示t帧时ground truth的目标数量。MOTA的值域为(-∞, 100]
为负表示跟踪导致的错误的数量超过了场景中所有物体的总和。
MOTP
dt,i表示TP和对应的gt目标的边框重叠率,Ct,i表示t帧的匹配数量。
所以MOTP衡量的是位置精度,实际就是检测器的定位精度,所以motp和跟踪器的表现关系不大。
每个gt的轨迹可以被分为:
Dendorfer, Patrick, et al. “Mot20: A benchmark for multi object tracking in crowded scenes.” arXiv preprint arXiv:2003.09003 (2020).
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。