DeepSORT算法

  谈及DeepSORT算法之前,希望你对【SORT算法】系列之深度解读已经熟悉流程。如果还未理解SORT算法流程,建议先理解整个SORT算法流程。在解释DeepSORT算法之前,有一些相关算法希望先知悉一下。

1. 数据关联之KM算法,可以参考博客【学习总结匈牙利算法到KM算法】及其相关资料学习;

2. 状态滤波估计算法KalmanFilter,可以参考博客【OpenCV学习系列】之KalmanFilter或者【状态估计滤波学习系列】之ExtendKalmanFilter等相关资料学习;

3. SORT算法流程学习,可以参考博客【SORT算法】系列之深度解读及其相关资料进行学习;

4. 在熟悉上述相关算法后,推荐延伸理解一下数据关联概念,推荐阅读博客多目标追踪之数据关联进行学习;

  如果你对上述列举算法熟悉之后,基本上DeepSORT算法相对比较容易很多。当然,在阅读完本文你也可以参考一下文末链接相关博文对DeepSORT算法解读。这些博文对我理解该DeepSORT算法也受益匪浅。

抛出一个问题,DeepSORT算法出现主要解决什么问题?

1. 相对于SORT算法改善目标跟踪过程中ID切换问题;

2. 通过神经网络学习出特征进行级联数据关联,提升关联准确性同时满足实时性要求;

DeepSORT算法流程图

在学习DeepSORT算法之前,我们先看看SORT算法的流程图,如下:

  简单说下SORT算法流程,首先对Trackers使用卡尔曼滤波进行预测,然后将预测后的Trackers与检测Dets进行计算代价匹配矩阵,然后使用匈牙利算法求解出MatchUnMatch_DetsUnMatch_Trackers。随后,对Match上使用卡尔曼滤波进行状态更新,UnMatch_Dets新建生成新的Trackers,对UnMatch_Trackers进行后处理,主要看起是否丢失很长时间。具体详细流程可参考博文【SORT算法】系列之深度解读

Now,下面我们来看看DeepSORT算法的流程图,如下:

  上述流程图大体描述了DeepSORT算法,其中最为核心的是级联匹配环节。先采取深度外观特征进行匹配,随后进行IoU二次匹配。关于深度外观特征循环30帧迭代匹配环节,可以参考下面的问题一代码解读。至于为什么需要按照时间顺序先后排序匹配与级联IoU匹配等,在参考目录博文里面有详细解说,我这里就不在赘述了。

DeepSORT算法代码解读

知晓该算法流程之后,还需要你实践一下该代码。原因由于里面会存在很多实现细节,这样能够更加深你对该算法理解。

代码源于DeepSORT实践代码链接

代码源于DeepSORT模型训练代码链接

模型训练教程可参考:【DeepSORT系列之】Cosine Metric Learning训练与demo可视化

解读该代码中一些实现细节,及为什么如此实现?

1.级联匹配中的代码片段:解释一下这个循环功能,主要是对confirmed_tracks按照时间由近及远排序进行数据关联。这里有个要点:【追踪列表中当track变成confirmed之后,除非它的time_since_update大于max_age将会删除,否则都会在这个循环进行数据关联操作】。主要区别在于循环遍历tracks时候丢失由近及远来进行级联匹配。(就是time_since_update的值越小越优先进行关联),说到底这里还是强依赖深度特征计算距离约束区分度要高。

    for level in range(cascade_depth):
        if len(unmatched_detections) == 0:  # No detections left
            break

        track_indices_l = [
            k for k in track_indices
            if tracks[k].time_since_update == 1 + level
        ]  # 由于tracks传入的track_indices是confirmed_tracks的索引
        # 这里的confirmed_tracks可能time_since_update不是max_age的话,它的状态不会改变
        if len(track_indices_l) == 0:  # Nothing to match at this level
            continue
        # 这里可以看出,先对最近时间的confirmed_tracks进行关联,逐步到久时间的未关联的confirmed_tracks
        # 注意:这里的unmatched_detections是逐渐变少的
        matches_l, _, unmatched_detections = \
            min_cost_matching(
                distance_metric, max_distance, tracks, detections,
                track_indices_l, unmatched_detections)
        matches += matches_l # 将过去max_age帧的confirmed_tracks进行关联成功的tracks相加即可

上述级联匹配之后的cost_matrix还需要进入下面的gated_metric函数进行运动观测阈值约束。进一步提升精确关联度,同时采取马氏距离来进行计算。

        # 将tracks与dets进行深度外观特征关联与匹配生成cost_matrix.
        def gated_metric(tracks, dets, track_indices, detection_indices):
            features = np.array([dets[i].feature for i in detection_indices]) # 外观特征维度
            targets = np.array([tracks[i].track_id for i in track_indices]) # 跟踪列表目标
            cost_matrix = self.metric.distance(features, targets) # nn_matching.NearestNeighborDistanceMetric()
            cost_matrix = linear_assignment.gate_cost_matrix(
                self.kf, cost_matrix, tracks, dets, track_indices,
                detection_indices)

            return cost_matrix

2. 在_match()函数里面,级联匹配之后会进一步使用IoU进行关联匹配。为什么这里还要使用IoU进一步关联,可以参考关于 Deep Sort 的一些理解。其实主要就是通过IoU来看检测器与跟踪器之间的置信度。

        # Associate remaining tracks together with unconfirmed tracks using IOU.
        # unconfirmed_tracks与tracks列表里面time_since_update==1的进入iou候选匹配列表
        iou_track_candidates = unconfirmed_tracks + [
            k for k in unmatched_tracks_a if
            self.tracks[k].time_since_update == 1]
        # 就是未关联成功的tracks列表同时其time_since_update != 1
        unmatched_tracks_a = [
            k for k in unmatched_tracks_a if
            self.tracks[k].time_since_update != 1]
        matches_b, unmatched_tracks_b, unmatched_detections = \
            # min_cost_matching使用的是iou匹配
            linear_assignment.min_cost_matching(
                iou_matching.iou_cost, self.max_iou_distance, self.tracks,
                detections, iou_track_candidates, unmatched_detections)
小结

  关于SORT算法逐帧进行匹配会导致ID switch现象在DeepSORT算法中得到了有效的降低。究其主要原因还是在于数据关联阶段采用深度表观特征进行匹配,极大提升了前后帧直接目标匹配精度。当然,DeepSORT算法在设计流程中也采用很多有效的方式,比如级联匹配策略中余弦距离、马氏距离、IoU数据关联的先后顺序,针对丢失目标根据周期长短在级联匹配中排序等等。虽然,DeepSORT算法不是端到端的目标跟踪算法,但是,其提出极大改进目标跟踪在工业界应用。

参考

Deep sort算法代码解读
论文翻译DeepSORT
目标跟踪初探(DeepSORT)

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐