参考资料:
deepsort paper: https://arxiv.org/abs/1602.00763(https://arxiv.org/abs/1602.00763)
deepsort github:GitHub - ZQPei/deep_sort_pytorch: MOT tracking using deepsort and yolov3 with pytorch(https://github.com/ZQPei/deep_sort_pytorch)
当我搞清楚代码流程后,着手开始在MOT16数据集上进行复现,由于没有注册成功,就先再训练集上跑一跑,然而发现MOTA竟然只有30,要知道论文中足足有60呢:
FN达到了67763,说明有很多没有追踪到,我检查追踪结果的视频,发现了原因,很多人没有检测到。这是由于这个复现项目的检测采用了yolov3,这个模型没有在MOT16数据集上训练过,对于一些较暗,较小的目标检测不到,就无法进行追踪了。而MOT16官方使用的det文件是由DPM检测器得到的,其检测效果也很差,MOTA也在30左右。
查阅论文后我发现,作者直接使用了POI检测器的检测文件,可以在这里下载Poi检测器的检测文件(https://drive.google.com/open?id=0B5ACiy41McAHMjczS2p0dFg3emM)(百度网盘链接 链接:https://pan.baidu.com/s/1Tnq_Eqnm49_JjLe75QX86g 提取码:qwer),将检测模块替换为poi的检测结果,替换的方法也非常简单,只需要读取poi的文件后,将这一帧送入deepsort的检测信息替换即可。注意需要对坐标进行一下变换,poi检测器中的检测框坐标是左上角坐标,而deepsort处理时需要中心点坐标,代码为:
detection_data = np.loadtxt('mot02_det.txt',delimiter=',')
detection_data_frame = []
for k in detection_data :
if k[0] == idx_frame:
detection_data_frame.append(k)
detection_data_frame = np.array(detection_data_frame)
bbox_xywh = detection_data_frame[:,2:6]
bbox_xywh[:,0] = bbox_xywh[:,0] + 0.5*bbox_xywh[:,2]
bbox_xywh[:,1] = bbox_xywh[:,1] + 0.5*bbox_xywh[:,3]
cls_conf = detection_data_frame[:,6]
# do tracking
outputs = self.deepsort.update(bbox_xywh, cls_conf, im)
果然替换后MOTA达到了55,很接近论文中的结果
我调皮的读取了ground truth的检测文件,结果也非常amazing啊,MOTA达到了68,可以看到当前MOT任务的MOTA与检测的质量还是息息相关的。
Deepsort作为一个经典的DBT算法,在工业界,简单稳定快速,精度也还可以,落地还是可以的。在学术界,还是有一些out了,改进也挺难的,毕竟从sort到Deepsort才提了1.6个点(本人尝试用fastreid替换了特征提取模块,效果也很一般)。希望大佬们批评指正。