ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

多目标跟踪数据关联全解析:从SORT到DeepSORT的工程实践

多目标跟踪数据关联全解析:从SORT到DeepSORT的工程实践 做过多目标跟踪MOT的都知道模型训练好、检测框哗哗出真正让人头大的反而是下一步——怎么让算法知道“这一帧的这个人”和“上一帧的这个人”是同一个人。这个步骤就是数据关联Data Association可以说它是整个多目标跟踪系统的中枢神经。不少初学者一开始以为多目标跟踪的核心是检测器结果跑起来发现检测做得再好关联做得稀烂目标ID依然闪成霓虹灯。这篇文章就围绕“数据关联”这件事把方法脉络、工程实现、指标计算和一些调参心得一次性讲透。这篇文章适合三类人一是刚接触MOT、准备往这个方向做研究的同学二是已经在用SORT/DeepSORT/YOLO系列做项目的开发者三是对评价指标MOTA、IDF1、IDSW怎么算、怎么解读、怎么用于调优感到困惑的工程人员。我会先从框架讲清楚数据关联在多目标跟踪链路里的位置再按“经典方法—深度学习方法—工程实操—指标解析—问题排查”这条线展开尽量把每个方法背后的取舍说透。1. 内容整体设计与思路拆解1.1 多目标跟踪框架里数据关联到底解决什么问题多目标跟踪的输入通常是一段视频输出是每个目标的轨迹Track也就是一串带ID的框序列。一个典型的两阶段跟踪流程大概是先由检测器给出每一帧的目标框再由跟踪器把相邻帧的框串起来。整个链路一般包含四个模块检测模块Detection输出目标的边界框、类别、置信度。运动预测模块Motion Prediction常用的有卡尔曼滤波Kalman Filter、恒定速度模型Constant Velocity Model用上一帧的状态预测当前帧位置。外观特征提取模块Appearance Feature Extraction通常是一个ReID网络给每个框提取一个特征向量用来度量“长得像不像”。数据关联模块Data Association把新一帧的检测框和已有的轨迹一一对应同时决定哪些轨迹需要新建、保留或者删除。数据关联模块的任务说起来很像“配对”假设上一帧有10条已有轨迹当前帧检测器给出15个框到底哪个轨迹对应哪个检测框这本质上是一个二分图匹配问题。但难点在于检测器会漏检目标会遮挡轨迹会短暂消失还会互相交错所以这个“配对”永远带着不确定性。数据关联方法的核心就是在这种不确定性中尽可能做出正确判断。很多入门教程把跟踪简化为“检测卡尔曼滤波匈牙利匹配”这个说法没错但它模糊了一个关键点真正决定系统上限的往往是关联策略。检测器做得好只能说“看到”了目标数据关联做得好才能“记住”目标。后面要讲的SORT、DeepSORT它们的性能差异也主要体现在数据关联这一步。1.2 为什么数据关联是“难啃的骨头”数据关联之所以难核心在于歧义性Ambiguity。你面对的是非完美观测上一帧的目标这一帧可能没被检测出来这一帧出现的新框可能是老目标也可能是新出现的人。更麻烦的是当多个目标外观相似、运动模式相近的时候特征区分度会很低。想象一下满屏都穿黑衣服的人在一个密集场景里穿梭这时候外观特征几乎失效纯靠运动预测和IoU匹配也很容易串ID。这也是数据关联方法持续演进的根本动力早期方法假设场景简单、目标稀疏可以用贪婪策略后来场景变复杂就要用概率模型表达“多个假设”再后来深度学习入场用可学习的特征和端到端的关联网络直接输出匹配结果。在工程上数据关联还牵扯到一个实时性约束。很多场景机器人导航、智慧安防、自动驾驶要求在线实时处理不可能像离线方法那样做全局优化。于是“在线关联”和“离线关联”就成了一个重要的方法分水岭。在线方法只能利用当前帧及历史信息比如SORT、DeepSORT离线方法则可以把整段视频拉出来做全局优化比如一些基于图优化的方法效果更好但延迟高。2. 经典数据关联方法从最近邻到多假设跟踪2.1 最近邻数据关联NNDA最朴素也最不稳最近邻数据关联Nearest Neighbor Data Association, NNDA的思路很直接计算每个检测框与每条轨迹之间的匹配代价比如IoU距离、欧氏距离然后找最小的那个距离进行关联。问题也很明显它只做局部的、贪心的选择一旦出现两个目标靠得近或交叉只取最小距离的决策方式很容易误配而且误配之后还会累积误差后续帧会跟着错。NNDA在目标数量少、密集程度低的场景里还能凑合一旦目标多起来就基本失控。它最大价值在于提供一个最简单的基线Baseline用来对比其他方法的增益。做实验时性能比NNDA还差的方法基本上就没有继续研究的必要了。2.2 联合概率数据关联JPDA用概率加权替代硬决策JPDAJoint Probabilistic Data Association比NNDA更进一步。它不再硬性决定“某个检测框一定属于某条轨迹”而是计算“某个检测框属于某条轨迹的概率”然后按概率加权更新轨迹状态。这个思路在处理杂波False Alarm和遮挡时有天然优势因为概率表达天然能容忍不确定性。但JPDA的最大缺点是计算复杂度随目标数量呈指数增长所以它往往只适用于目标数量很少的场景比如几个目标。虽然有一些近似算法比如基于采样的JPDA但在实际工程里目标一多就很难实时跑。所以JPDA更多地出现在经典雷达/声呐多目标跟踪里在视频MOT中后来基本被SORT这类基于匈牙利匹配的方法取代。2.3 SORT简单在线实时跟踪的标杆SORTSimple Online and Realtime Tracking是2016年提出的一个极简方案。它的核心组成是两个部分卡尔曼滤波用恒定速度模型预测每个目标在下一帧的位置。匈牙利算法用检测框和预测框之间的IoU作为代价矩阵进行最优匹配。这套方案最让人惊讶的地方在于它没有用任何外观特征也没有复杂的运动模型仅凭IoU 匈牙利算法就做到了极快的速度数百FPS在当时的MOT基准上表现也很能打。实际工程里SORT的低复杂度让它在算力受限的边缘设备上依然可用。但SORT的缺陷也非常清晰因为只依赖IoU一旦目标被遮挡后再次出现IoU直接归零跟踪就断了如果目标互相靠近并发生遮挡ID很容易交换。一句话总结SORT适合检测稳定、帧率高、遮挡少的场景也是用来理解数据关联链路最好的入门范本。2.4 MHT多假设跟踪理论上限最高的经典方法MHTMultiple Hypothesis Tracking的思路是对“每个检测框可能属于哪个轨迹”产生多个假设然后在后续帧里延迟决策等更多证据出现再做最终裁决。这意味着它不急于立刻拍板而是保留一个假设树随着证据累积逐步剪枝。这个方法的优点是理论上限很高几乎能处理所有关联歧义问题缺点是计算量爆炸需要复杂的剪枝策略和假设管理机制。在工程落地中除非目标数量很少而且场景相对干净否则很难实时运行。MHT还启发了后来的许多现代方法比如图网络多假设跟踪、基于Transformer的全局关联这些本质上都是“延迟决策、全局优化”思想在不同工具下的体现。3. 深度学习时代的数据关联从DeepSORT到端到端网络3.1 DeepSORT在SORT基础上引入外观特征DeepSORT是SORT的直接改进版。它保留了卡尔曼滤波和匈牙利算法这个骨架但新增了一个关键模块外观特征提取器ReID网络。匹配时用外观特征的余弦距离代替或者结合原先的IoU距离。具体来说DeepSORT的匹配过程分两步。第一步用运动特征马氏距离过滤掉那些运动上明显不可能的匹配第二步用外观特征余弦距离计算代价矩阵再用匈牙利算法做匹配。它还有一个关键优化——级联匹配Cascade Matching优先匹配那些最近连续丢失帧数较少的轨迹再匹配丢失时间较长的轨迹。这个策略的逻辑非常朴素刚丢了一两帧的目标大概率还能找回来丢了几十帧的目标特征可靠性已经很低应该放到后面慢慢处理。我在项目里的体会是DeepSORT之所以是工业界最常用的跟踪器之一不是因为它效果最好而是因为它结构清晰、容易训练、依赖简单。你只需要一个还不错的检测器加上一个通用的ReID模型就能得到一套可用的跟踪系统。而且因为它的模块是解耦的你可以方便地替换检测器、替换ReID模型分别调优这对工程调试非常友好。3.2 图网络与注意力机制让关联决策更“全局”如果把数据关联看成是一个“全局匹配”问题那么图网络Graph Neural Network是一个很自然的表达工具。把每条轨迹和每个检测框看作图的节点把它们之间的关系看作是边边的权重可以根据运动、外观、甚至交互关系计算然后通过图的消息传递机制让节点之间交换信息最终得到匹配结果。这种方法的优势在于它能捕捉到目标之间的交互关系而不只是目标自身的特征。比如两个目标靠得很近常规方法会因为外观相似而难以区分但图网络可以考虑“这两个框是否可能属于同一个人”的上下文信息用一个“互斥约束”来避免一个检测框分配给多条轨迹。Transformer架构引入MOT后又进一步改变了关联方式。一些方法把轨迹的历史特征和当前检测特征一起编码为序列用Transformer的Self-Attention来建模它们之间的依赖关系。你可以把它理解成让所有候选框之间互相“对话”最后根据对话结果决定谁和谁匹配。这个方法在处理长期遮挡、外观剧烈变化上有不错的效果但代价是计算量更大训练数据要求更高。3.3 端到端跟踪把检测和关联放进同一个网络从DETR开始目标检测变成了一种集合预测问题跟踪也随之出现了端到端方案。比如TrackFormer、MOTR这类方法模型输入是一段视频输出直接就是带ID的轨迹序列不再显式区分检测、特征提取、关联这几个阶段。端到端方法的理念是“联合优化”把检测误差和关联误差放在同一个损失函数里让整个模型端到端学习。它在很多基准上表现确实很好尤其在做长时关联的时候。不过目前端到端方法在工业落地中还没有完全替代两阶段方法原因在于训练数据要求高、部署灵活性差而且很多场景只需要做在线跟踪端到端方法如果依赖整段视频的序列信息延迟就会成为一个负担。4. 评价指标与结果解析怎么量化“跟踪得好不好”4.1 MOTA、IDF1、IDSW这些指标到底在说什么做多目标跟踪常用的指标集中在MOT Challenge的评测体系里。简单列一下最常见的几个MOTAMulti-Object Tracking Accuracy综合考虑漏检FN、误检FP和ID切换IDSW的综合指标计算公式为MOTA 1 - (FN FP IDSW) / GT_total。它对跟踪的“稳定不中断”和“检测准不准”都很敏感。MOTPMulti-Object Tracking Precision衡量检测框和真实框的重合度距离反映定位精度和关联好坏关系不大。IDF1ID F1 Score以“ID保持”为核心同时考虑正确匹配的检测比例和轨迹比例。它比MOTA更关注关联的持续性。IDSWID Switch一条轨迹的ID从A变成B的次数。这个指标是数据关联最直接的“用户反馈”。MTMostly Tracked一个目标在大部分帧里被持续跟踪的比例。MLMostly Lost一个目标大部分帧里都没被跟踪的比例。HOTAHigher Order Tracking Accuracy这几年被提出来用于弥补MOTA和IDF1各自偏科的问题。它兼顾了定位、检测和关联的平衡公式更复杂但在论文里越来越常见。我在实际项目里看指标通常会同时看MOTA和IDF1因为只有MOTA高、IDF1低说明检测还行但关联烂ID跳变严重这个系统拿去给业务看会被骂反过来MOTA低、IDF1高说明能一直跟踪的目标跟住了但漏检严重导致整体覆盖率低。4.2 用py-motmetrics或TrackEval计算指标的具体流程在线评估MOT指标最常见的工具是py-motmetrics和TrackEval。这两个库的用法差别不大先准备两个文件一个是Ground TruthGT文件一个是跟踪结果文件格式都遵循MOT Challenge的格式。以纯Python为例用py-motmetrics评估一段简单数据集的流程如下import motmetrics as mm import numpy as np # 构造一个简单的gt和result字典 # 格式帧号, ID, 框坐标(bb_left, bb_top, bb_width, bb_height), 置信度(gt不用) gt { 1: np.array([[101, 201, 50, 100]]), # 帧1一个gt框 2: np.array([[101, 201, 50, 100], [300, 300, 40, 90]]), # 帧2两个gt框 } result { 1: np.array([[101, 201, 50, 100, 1.0]]), # 帧1一个结果框ID默认用index 2: np.array([[101, 202, 50, 100, 1.0], [298, 301, 40, 90, 1.0]]), } acc mm.utils.compare_to_gt(gt, result, fmtmotchallenge) mh mm.metrics.create() summary mh.compute(acc, metrics[num_frames, idf1, mota, motp, idsw], nameacc) print(summary)如果数据量很大推荐直接用TrackEval脚本它支持MOT17/MOT20和自定义数据集格式跑出来的指标也更公开、更可信。很多比赛榜单用的就是TrackEval所以用自己论文指标时建议也用这个免得对不上。4.3 怎么看指标背后的“故障”以IDF1和IDSW为例跑出指标之后更重要的是能通过指标反推问题。我通常的排查路径是IDF1远低于MOTA关联质量差ID切换频繁需要缩短匹配的级联间隔或提高外观特征权重。MOTA高但IDSW也高检测准确但身份连续性差建议检查ReID特征区分度、增大max_cosine_distance来保留更多候选匹配。MOTP很低说明检测框和GT重合度低可能是检测器的问题也可能是输出框坐标后处理导致的偏差跟关联方法关系不大。MT高但ML也高说明有些目标跟得很好有些目标从来没跟上过大概率是频繁出现的遮挡场景没有对应策略。用指标驱动调参比自己凭感觉调参数高效得多。每次改动后都记录指标变化特别是IDSW和IDF1这两个指标它们对关联方法改动最敏感。5. 常见问题与排查技巧实录5.1 ID Switch频繁到底该怎么查最典型的困扰就是“目标A的ID突然变成B的ID”。排查顺序我一般是这样第一先确认检测器是否漏检。如果某个目标在几帧里确实没有被检测出来卡尔曼滤波会一直外推此时如果另一个目标靠近匈牙利算法很可能直接把轨迹的ID匹配到别的检测框上。我的经验是可以暂时调低检测阈值看看漏检问题是否改善。第二看级联匹配参数。DeepSORT里有一个参数叫max_age表示一条轨迹在连续多少帧没有得到匹配后才会被删除。max_age设得太大轨迹保留时间太长容易把新检测框错误地匹配到过期轨迹上设得太小目标一旦被短暂遮挡就会被删掉之后回来就新建ID。一般场景建议先从25~30左右开始调再根据遮挡频率调整。第三检查外观特征。如果两个目标外观非常像那撞ID几乎是必然的。可以考虑更换ReID模型或者增加运动特征在代价矩阵里的权重通过马氏距离约束避免外观相似时错误匹配。5.2 遮挡后目标“丢魂”是加大max_age还是重建轨迹有一种做法我踩过坑遇到遮挡就把max_age加得很大比如70、80结果目标是找回来了但ID也乱成了一锅粥。原因很简单轨迹长时间没有得到检测框匹配卡尔曼滤波的协方差会越来越大预测位置越来越不靠谱最后全凭外观特征在“瞎认人”一旦两个目标外观接近就会产生大量错误匹配。我的经验是遮挡恢复不能只靠“等”最好叠加一个“位置门控”。也就是说就算外观特征匹配上了如果目标当前预测位置和检测框中心距离超过某个阈值比如车辆目标用5~10个像素行人用10~20个像素宁可把它当成新轨迹也不要硬接旧轨迹。这样可以避免很多“看起来像但其实不是”的错配。5.3 MOTA不涨反跌可能是检测器阈值在“捣乱”做跟踪调参时常见误区是只看跟踪模块忘了检测器阈值的影响。降低检测阈值召回率上升FN变少但FP也会增加MOTA不一定会上升因为MOTA把FP也算进分子了。尤其是数据关联这一步FP变多会引入大量虚假轨迹直接影响关联质量。我的建议是调关联算法时先固定一个合理的检测阈值只有当MOTA和IDF1都稳定后再回头去微调检测阈值。这么做的好处是你能把“检测质量的影响”和“关联质量的影响”分开观察排查起来清晰很多。5.4 一个实战调参记录供参考前阵子做一个30分钟园区行人跟踪项目车辆、行人混行遮挡频繁。初始配置是DeepSORT默认参数跑完MOTA 48.2IDF1 51.0IDSW从1200多次。一轮调整后MOTA到了54.6IDF1 60.3IDSW降到了700多次具体改动如下参数初始值调整后调整理由max_cosine_distance0.20.350.2太严格行人外观变化大时匹配不上导致大量轨迹断裂max_age3020行人被遮挡频率高但超过20帧还丢着大概率已离开场景重建轨迹更可靠nn_budget10050减少特征库累积误差提高匹配一致性的稳定性检测阈值0.40.3园区行人小目标漏检多阈值降低后召回提升明显代价是FP略增卡尔曼滤波的置信度门控无3.0用马氏距离卡掉预测位置偏移过大的候选匹配减少ID跳变这个记录不一定适合所有场景但它说明一个道理调参不是拍脑袋而是根据指标表现反向定位问题。每次只改一个参数记录MOTA、IDF1、IDSW的变化用数据说话。5.5 避坑速查表问题现象可能原因优先排查项ID跳变频繁外观特征区分度不足、max_age过大、检测漏检检查ReID特征距离分布降低max_age提检测召回轨迹断裂严重检测器漏检多、max_cosine_distance太小调低检测阈值放宽余弦距离阈值新ID爆增FP多、track确认机制过于宽松提高检测阈值增加轨迹确认帧数n_init有轨迹但一直跟着错误目标运动模型预测不准、外观特征被姿态干扰调整卡尔曼滤波噪声系数更换ReID模型实时性不够模型太大、NMS后框数量太多剪枝ReID网络限制跟踪目标数量上限6. 关于“yolo多目标跟踪的指标怎么得到”的实操补遗这个问题在社区里问得很多。由于YOLO本身只做检测不直接输出MOT指标所以要从YOLO得到MOTA/IDF1等指标路径是把YOLO作为检测器接到跟踪器比如DeepSORT后面得到带ID的轨迹然后按MOT Challenge格式保存结果文件最后用TrackEval或py-motmetrics打分。整个流程的要点在于检测框后处理是否做了尺度归一化。跟踪结果文件和GT文件必须使用同样的坐标分辨率否则MOTP计算时会差别很大。输出结果是否包含遮挡标签。MOT Challenge的GT里会标出遮挡状态、忽略区域如果完全不管这些细节指标会比实际低一些。确认最小帧数。有的跟踪器会要求轨迹超过一定帧数才算有效有的不会这会影响MT和ML的统计结果。我一般会先用一段只有几十秒、标注质量高的视频把整个评估流程跑通确认结果文件和评分逻辑无误再去跑完整数据集。这样能避免大流程跑完才发现格式错误、坐标不对的问题返工成本非常高。关于“bartender 二维码关联数据”顺带提一句它和数据关联Data Association只是中文翻译上的巧合实际指的是条形码/二维码扫码后关联后台数据记录跟MOT里的目标关联完全是两个领域。搜索资料时注意区分别被带偏。结语一点个人体会数据关联这一块看起来公式多、方法多但落到项目中你真正需要抓住的其实是三个变量运动预测准不准、外观特征能不能区分不同目标、代价矩阵和匹配策略是否匹配场景复杂度。把这三个变量摸透了很多问题不用看论文也能靠排查解决。反过来如果只看论文不动手调参很难真正理解为什么SORT这种“简陋”方法到现在还没被淘汰——因为在大量实际场景里检测稳定、帧率够高IoU匹配带来的信息量已经足够撑起一套可用的跟踪系统。最后再分享一个小技巧调试数据关联时不要只看最终指标一定要把跟踪过程可视化出来。给每个框标上ID和轨迹线然后用倍速看视频。你往往能一眼看出ID在哪里断、在哪里跳这比盯着数字猜原因高效得多。我几乎每次调参前都会先做一次可视化回看这个习惯帮我省下了大量无效实验时间。
返回列表