详细的原理参考:Deep SORT多目标跟踪算法代码解析 - pprp - 博客园?Deep?SORT多目标跟踪算法代码解析 讲的很详细&画图也很认真。
0. demo_mot_vis.py 多目标跟踪demo的函数调用关系图call graph
- ?DeepSORT类有4个成员变量:detector、reid、motion、tracker
- DeepSORT负责推理,simple_test, tracker负责轨迹维护。
- simple_test去获取detector的检测框。
- with_motion的意思,是否需要运动模型的cost_matrix。实际上是计算了costs的,但是在分配时没有使用。
- 检测、reID、运动、跟踪器。
- track的部分,是tracker在维护。且是SortTracker类型的对象。
?
- ?demo_mot_vis.py的inference_mot调用model(data),这个Model为Model类型。
- 调用model时,会去调用相应模型的forward_test。调用的是BaseMultiObjectTracker基类的forward_test函数。然后调用派生类的同名函数simple_test()
即调用了deepsort的simplt_test()函数 - 主要的流程在DeepSORT的simple_test()函数中。
- 特征提取
- 获取检测框
- 跟踪和检测框匹配
- kalman预测;cost马氏距离计算(这个称为距离模型)
- 根据IOU进行分配
- kalman correct
inference_mot
result = model(data)
# base.py
forward_test(img, img_metas, **kwargs)
# deep_sort.py aimple_test()
simple_test(img, img_metas, rescale, public_bboxes, **kwawrgs):
x = self.detector.extract_feat(img) # 提取特征
# 获取检测框:rpn的proposal + detector的获取检测框
det_bboxes, det_labels = self.detector.....()
# 跟踪
track_bboxes, track_labels, track_ids = self.tracker.track(img, feats, det_bboxes)
# sort_tracker.py #163 计算cost马氏距离矩阵
①self.tracks, costs = model.motion.track(self.tracks, self.xyxy2xyah(bboxes))
① kalman.predict
② gating_distance # 马氏距离的计算
costs[costs > self.gating_threshold] = np.nan # 注意有一个距离阈值,为5.9915
# 这里使用的分配方式为:基于IOU的分配。然后分配后去track更新
②row, col = linear_sum_assignment(dists)
# track和detection的就算IOU,作为Dists进入到分配中
③self.update(ids, bboxes, scores, labels)
①update_track # 轨迹更新
②init_track # 新建轨迹
?
1. 可参考的内容
就检测(background?modeling、yolo模型检测)+?kalman预测?+?匈牙利分配的技术路线而言:
|