本节摘要:检测只给当前帧,跟踪把跨帧目标关联起来。本节讲多目标跟踪——自动驾驶理解目标时序行为的基础。
阅读完本节,你应当能够:
检测每帧独立,不知道"这帧的车 A 是上帧的车 A 吗"。跟踪把跨帧同一目标关联,给每个目标一个 ID,形成时序轨迹,用于:

MOT 流程:
关联是核心,用两种信息:
匈牙利算法做匹配。
| 算法 | 特点 |
|---|---|
| SORT | 简单,仅卡尔曼+IoU 匹配 |
| DeepSORT | SORT + 外观 ReID 特征 |
| ByteTrack | 用低分检测,减少漏检 |
| FairMOT | 检测+ReID 联合 |
| MOTR | Transformer 端到端跟踪 |
自动驾驶常用 ByteTrack(高召回)或 DeepSORT(稳定)。
自动驾驶多在 3D 空间跟踪(BEV 或点云):
跟踪输出历史轨迹,是行为预测(2.8 节)的输入:历史轨迹 → 预测未来路径。
⚠️ ID 跳变:目标遮挡后重新出现,跟踪可能给新 ID,轨迹断。自动驾驶要处理 ID 跳变,或用更长时序记忆。
💡 关键直觉:跟踪把跨帧目标关联给 ID,形成时序轨迹,用于速度估计和行为预测。MOT 流程:检测→特征→关联(卡尔曼+ReID)→轨迹管理。代表 SORT/DeepSORT/ByteTrack。挑战是遮挡和 ID 跳变。
下一节讲车道线检测。
多目标跟踪里,卡尔曼滤波承担"预测加修正"两件事。对每个已有轨迹,用运动模型(通常是匀速模型)预测下一帧的目标状态(位置、速度、框尺寸);拿到检测结果后,用检测修正预测,得到更平滑的估计。预测值还能用来计算关联代价——检测框与预测框的 IoU 或马氏距离越小,越可能是同一个目标。匀速模型在高速公路上够用,但遇到急刹、变道,预测会滞后,这也是 SORT 类方法在复杂场景性能下降的主因。
# 伪代码:卡尔曼预测与更新(SORT 风格) for track in tracks: pred = kf.predict(track) # 匀速模型预测 cost = iou_matrix(pred.boxes, detections) # 关联代价 matches = hungarian(cost) # 匈牙利算法最优匹配 for track, det in matches: kf.update(track, det) # 修正状态
评价多目标跟踪不能用检测的 mAP。主流指标是 MOTA(多目标跟踪准确率),它把三类错误(漏检、误检、ID 跳变)折算成一个分数;还有 IDF1,它统计匹配对的准确率和召回率,更侧重跟踪的 ID 一致性。两者经常互相矛盾:一个系统可能 MOTA 高但 ID 频繁跳变,另一个系统 ID 很稳但漏检多。量产调优时要根据场景定优先级——十字路口场景更看重 IDF1(ID 稳定才好做轨迹预测),高速巡航则更看重 MOTA 的召回。实际工程里还有一个常用技巧:置信度分档关联。ByteTrack 把检测分成高置信度和低置信度两档,先用高置信度检测做匹配,未匹配的轨迹再用低置信度检测兜底。低分检测往往出现在遮挡边缘或目标刚出现的瞬间,兜底这一步能显著减少遮挡导致的轨迹断裂,实现简单、收益大,是跟踪模块里性价比最高的改动之一。
补充一个实际部署中的经验:跟踪模块的输入质量往往比跟踪算法本身更重要。检测的抖动、漏帧、类别误判都会直接传导到跟踪里,所以上线前要先做"检测到跟踪"的联调——给检测输出加最小置信度门槛和类别置信度过滤,在跟踪入口做一帧缓冲去抖。另一方面,跟踪结果的输出频率通常低于检测(检测 30Hz,跟踪 10Hz),中间用运动外推补齐,这样下游规划拿到的目标轨迹始终是连续的。把跟踪当成一个"检测后处理加状态管理"的模块来对待,比孤立调跟踪算法更能解决实际问题。