DeepSORT 改进点改进一IOU 匹配容忍丢失帧数–iou-match-tolerance1. 源码位置文件:deep_sort/sort/tracker.py 函数:_match# Associate remaining tracks together with unconfirmed tracks using IOU.iou_track_candidatesunconfirmed_tracks[kforkinunmatched_tracks_aifself.tracks[k].time_since_update1]unmatched_tracks_a[kforkinunmatched_tracks_aifself.tracks[k].time_since_update!1]matches_b,unmatched_tracks_b,unmatched_detections\ linear_assignment.min_cost_matching(iou_matching.iou_cost,self.max_iou_distance,self.tracks,detections,iou_track_candidates,unmatched_detections)原版只允许刚丢失 1 帧time_since_update 1的轨迹进入 IoU 营救轮。2. 改进代码文件:deep_sort/sort/tracker.py 函数:_matchiou_track_candidatesunconfirmed_tracks[kforkinunmatched_tracks_aifself.tracks[k].time_since_updateself.iou_match_tolerance]unmatched_tracks_a[kforkinunmatched_tracks_aifself.tracks[k].time_since_updateself.iou_match_tolerance]matches_b,unmatched_tracks_b,unmatched_detections\ linear_assignment.min_cost_matching(iou_matching.iou_cost,self.max_iou_distance,self.tracks,detections,iou_track_candidates,unmatched_detections,iou_match_toleranceself.iou_match_tolerance)文件:deep_sort/sort/iou_matching.py 函数:iou_cost配套添加forrow,track_idxinenumerate(track_indices):iftracks[track_idx].time_since_updateiou_match_tolerance:cost_matrix[row,:]linear_assignment.INFTY_COSTcontinue 1改为 iou_match_tolerance默认 3并在 iou_cost 内把超过容忍值的轨迹代价置 INFTY防止 tentative 轨绕过候选过滤。3. 测试视频与结果对比测试视频:video/dense.mp41280×72029.97fps394 帧帧间隔 5共 78 个处理帧。改进组: python .\test\test_deepsort.py --frame-interval5 --iou-match-tolerance3 基线组: python .\test\test_deepsort.py --frame-interval5 --iou-match-tolerance1两组除该参数外完全一致其余均用默认值基线组即原版行为。指标改进(3)原版(1)轨迹总 ID7692从未确认轨迹❤️ 次命中1528平均轨迹长度次16.914.0长轨迹≥10 次44432~3 处理帧空窗保住同 ID28 处11 处4. 对比分析意义丢失 2~3 帧的轨迹在外观级联失败后原版只能断裂成两个 ID检测重新出现时新建轨迹改进后可凭纯几何 IoU 续接。本视频上少产生 16 个碎片 ID、13 条废轨迹17 处短空窗保住 ID。是正向改进三个参数中效果最大。改进二确认阶段容忍丢失帧数–tentative-tolerance1. 源码位置文件:deep_sort/sort/track.py 函数:mark_misseddefmark_missed(self):ifself.stateTrackState.Tentative:self.stateTrackState.Deletedelifself.time_since_updateself._max_age:self.stateTrackState.Deleted原版 tentative未确认轨迹一次丢失直接删除没有任何容忍判断。2. 改进代码文件:deep_sort/sort/track.py 函数:mark_misseddefmark_missed(self):ifself.stateTrackState.Tentative:ifself.time_since_updateself._tentative_tolerance:self.stateTrackState.Deletedelifself.time_since_updateself._max_age:self.stateTrackState.Deleted添加time_since_update tentative_tolerance判断默认 3未确认轨迹可容忍短暂漏检不死。3. 测试视频与结果对比测试视频:video/dense.mp4同上。改进组: python .\test\test_deepsort.py --frame-interval5 --tentative-tolerance3 基线组: python .\test\test_deepsort.py --frame-interval5 --tentative-tolerance0两组除该参数外完全一致其余均用默认值基线组即原版行为。指标改进(3)原版(0)轨迹总 ID7685从未确认轨迹1524平均轨迹长度次16.915.2长轨迹≥10 次44434. 对比分析意义tentative 轨迹需要连续 3 次命中才能确认原版丢一帧即删导致“2 命中 短暂漏检”的目标被拆成两个 ID 且碎片永远无法上屏。改进后这类目标保住 ID、更早确认上屏轨迹总 ID 从 85 降到 76。是正向改进效果次于改进一。改进三轨迹输出允许的最大丢失帧数–max-output-age1. 源码位置文件:deep_sort/deep_sort.py 函数:updatefortrackinself.tracker.tracks:ifnottrack.is_confirmed()ortrack.time_since_update1:continue原版输出门控固定time_since_update 1跳过即只允许丢失后1 帧惯性输出。2. 改进代码文件:deep_sort/deep_sort.py 函数:updatefortrackinself.tracker.tracks:ifnottrack.is_confirmed()ortrack.time_since_updateself.max_output_age:continue固定值 1 替换为max_output_age默认 3丢失后最多 3 帧继续输出卡尔曼预测框。3. 测试视频与结果对比测试视频:video/dense.mp4同上。改进组: python .\test\test_deepsort.py --frame-interval5 --max-output-age3 基线组: python .\test\test_deepsort.py --frame-interval5 --max-output-age1指标改进(3)原版(1)匹配/轨迹结果txt 正文完全一致完全一致确认轨迹匹配输出框11471147惯性输出框卡尔曼预测182754. 对比分析意义该参数只作用于输出组装不参与预测/匹配/轨迹生命周期是纯输出层参数——两份 txt 正文逐字节一致即为证明。改进后多 107 个惯性预测框短暂遮挡时画面框不闪断代价是目标真正离开后“幽灵框”最多多显示 2 个处理帧。达到设计目的正向改进。3个参数改进的总结改进参数原版行为改进默认值核心收益判定--iou-match-tolerance仅丢失 1 帧的轨迹进 IoU 轮3少 16 碎片 ID、17 处空窗续接正向效果最大--tentative-tolerancetentative 丢 1 帧即删3少 9 碎片 ID、更早确认上屏正向--max-output-age只允许 1 帧惯性输出3多 107 惯性框填平显示空窗正向纯输出层三个改进全部有效且方向正确。注意改进一与改进二的效果部分重叠tentative 阶段的检测空窗需要“活着tentative 容忍 匹配上IoU 容忍”两道闸门同时打开才能救回收益不能简单相加。局限验证基于单一场景dense.mp4 车流参数值 3 的最优性未做扫描。描述链接项目基于 Ultralytics DeepSORT 多目标跟踪与改进往期回顾链接数据集数据集汇总软件开发深度学习软件开发汇总