资讯详情

【StrongSort 03】多轨迹算法StrongSort改进点

📅 2026/10/29 2:03:57 | 华诺云谱 👁 阅读
【StrongSort 03】多轨迹算法StrongSort改进点
Strongsort改进点StrongSORT论文StrongSORT: Make DeepSORT Great Again在 DeepSORT 基础上提出的四项在线改进 一项相机运动补偿。本工程全部实现为可开关参数五项统一默认开启测试脚本加对应--no-nsa/--no-ema/--no-mc/--no-wo-c/--no-ecc关闭。全部改进都在线逐帧完成无离线后处理原版 StrongSORT 的 AFLink、GSI 未引入。一、NSA——卡尔曼观测噪声按置信度自适应针对的问题DeepSORT 的卡尔曼滤波对所有检测一视同仁观测噪声 R 固定。但检测置信度有高有低——低置信度框位置往往更不准用同样的 R 去修正状态会把不可靠的观测当真污染预测。改进做法观测噪声随检测置信度缩放置信度越低、观测噪声越大、这帧观测的话语权越小。R N S A ( 1 − c k ) 2 ⋅ R R_{NSA} (1 - c_k)^2 \cdot RRNSA​(1−ck​)2⋅R其中c k c_kck​是当前帧检测置信度。置信度 0.9 的框噪声缩到 0.01 倍修正力度大置信度 0.3 的框噪声缩到 0.49 倍修正力度小。源码位置strong_sort/sort/kalman_filter.py函数行为project(mean, covariance, confidence, nsa)第 150-151 行if nsa: std [(1 - confidence) * x for x in std]噪声标准差逐项乘 (1−置信度)R diag(std²)update(mean, covariance, measurement, confidence, nsa)第 184 行把 confidence 和 nsa 透传给 project新息协方差 S HPHᵀ R_NSA链路检测置信度从Track.update()track.py 第 169-171 行透传给kf.update再传入kf.project。置信度一路从检测走到滤波核无额外存储。开关与参数--no-nsa关闭默认开启。二、EMA——特征指数滑动平均替代特征库针对的问题DeepSORT 每条轨迹维护一个特征库Gallery最多 nn_budget 条匹配时取与库内所有特征的最小距离。问题有二① 库里积攒了目标早期可能已被遮挡前的外观外观变化后老特征拖后腿② 库存取和逐条比对有开销且库容超限后踢掉最老的策略并不可靠。改进做法轨迹特征不再攒库而是每帧与检测特征做指数滑动平均只保留一条不断更新的平滑特征e f α ⋅ e f − 1 ( 1 − α ) ⋅ f k α 0.9 e_f \alpha \cdot e_{f-1} (1 - \alpha) \cdot f_k \qquad \alpha 0.9ef​α⋅ef−1​(1−α)⋅fk​α0.9新特征只占 10% 的权重——单帧错检、光照突变不会立刻带偏轨迹特征而目标外观的真实渐变转动、缩放会随时间平滑跟进。平滑结果重新归一化。源码位置strong_sort/sort/track.pyTrack.update()第 173-179 行featuredetection.feature/np.linalg.norm(detection.feature)ifself._ema:smooth_featself._ema_alpha*self.features[-1](1-self._ema_alpha)*feature smooth_feat/np.linalg.norm(smooth_feat)self.features[smooth_feat]# 库里永远只有这一条平滑特征else:self.features.append(feature)# 关闭时退回 DeepSORT 的 Gallery 攒库配套改动EMA 模式下特征库容量自动置 1strong_sort/__init__.py工厂函数nn_budget 1 if args.ema else args.nn_budget——库里本来就只有一条容量无需更大NearestNeighborDistanceMetric.distance与库内单条特征做一次余弦即为代价。开关与参数--no-ema关闭默认开启--ema-alpha调平滑系数默认 0.9。三、MC——关联代价融合外观与运动针对的问题DeepSORT 的外观关联只看特征余弦距离马氏距离只用来一刀切门控超阈值直接禁止配对阈值内不参与代价。两个候选检测外观都很像、又都在门控内时目标运动趋势的信息被浪费了。改进做法把马氏运动距离按权重揉进关联代价两路信息加权融合c i j λ ⋅ c a p p e a r a n c e ( 1 − λ ) ⋅ d M a h a l a n o b i s λ 0.98 c_{ij} \lambda \cdot c_{appearance} (1 - \lambda) \cdot d_{Mahalanobis} \qquad \lambda 0.98cij​λ⋅cappearance​(1−λ)⋅dMahalanobis​λ0.98外观仍是主导0.98运动距离作为细微裁决项——外观打平时预测位置更近的那个检测胜出。源码位置strong_sort/sort/linear_assignment.pygate_cost_matrix()第 220-227 行gating_thresholdkalman_filter.chi2inv95[4]...cost_matrix[row,gating_distancegating_threshold]gated_cost# 先门控物理上不可能的配对写死 1e5ifmc:# 再融合λ·外观 (1−λ)·马氏cost_matrix[row]mc_lambda*cost_matrix[row](1-mc_lambda)*gating_distance注意顺序先门控后融合——被门控的格子 1e5 也会被融合拉低一点但量级仍远超配对上限 max_distance不会造成错误配对。开关与参数--no-mc关闭默认开启--mc-lambda调融合系数默认 0.98。四、woC——去掉匹配级联单轮全局匹配针对的问题DeepSORT 的外观匹配是级联的按轨迹丢失帧数分层刚丢 1 帧的先匹配丢 2 帧的下一层……一层一轮匈牙利算法。设计初衷是让新检测优先分给最近见过的轨迹但代价是① 分层后每层只跟一部分轨迹比全局最优可能被层序拆散② 多层循环多轮匈牙利开销更大。改进做法不分层全部确认轨迹与全部检测一轮全局匈牙利匹配比完级联深度等效为 1。StrongSORT 论文的消融实验显示检测质量足够好时级联的优先级并不必要单轮全局匹配反而又快又准。源码位置strong_sort/sort/linear_assignment.pymatching_cascade()第 149-158 行wo_c分支ifwo_c:track_indices_l[kforkintrack_indices]# 全部轨迹同一轮不分层matches_l,_,unmatched_detections\ min_cost_matching(distance_metric,max_distance,tracks,detections,track_indices_l,unmatched_detections)matchesmatches_lelse:# 原版级联按 time_since_update 分层逐层匹配forlevelinrange(cascade_depth):...关闭 woC 时走else分支行为与 DeepSORT 原版级联完全一致第 160-175 行。开关与参数--no-wo-c关闭默认开启。五、ECC——相机运动补偿默认开启针对的问题卡尔曼预测假设相机静止——上一帧在 (100, 200) 的目标这一帧预测外推就画在附近。相机一动云台转动、车载全部轨迹的预测框整体偏移马氏门控和 IoU 匹配双双失效ID 跳变。改进做法逐帧在线估计相机运动矩阵先把上一帧的轨迹框搬到当前帧坐标系再做卡尔曼预测和匹配①_camera_motionstrong_sort/strong_sort.py当前帧 vs 上一帧灰度图缩到 0.1 倍加速调 ECC 算法估计欧氏变换矩阵旋转平移2x3变换畸变过大矩阵范数异常时视为无运动。ECC 参数eps1e-5、max_iter100、scale0.1。②Tracker.camera_update→Track.camera_updatestrong_sort/sort/track.py每条轨迹的 tlbr 两角做仿射变换重写卡尔曼状态均值前 4 维——轨迹框先跟上相机再进入本帧预测-匹配流程。源码位置ecc.py的ECC()函数工程适配版仅保留在线逐帧计算所需的 ECC 函数核心是cv2.findTransformECC。开关与参数--no-ecc关闭默认开启。ECC 在缩到 0.1 倍的小图上迭代开销很小720p 实测约 2-3 毫秒/帧静止相机的小幅抖动会被匹配容错吸收开着对跟踪结果没有可见改善介意可关闭运动相机场景持续平移/旋转才能体现价值。六、改进项速查表改进全称作用环节源码位置默认开关参数NSANoise Scale Adaptive Kalman Filter卡尔曼修正观测噪声strong_sort/sort/kalman_filter.pyproject/update开启--no-nsa关EMAExponential Moving Average特征更新轨迹外观记忆strong_sort/sort/track.pyTrack.update开启--no-ema关MCMotion-aware Cost外观匹配代价融合马氏距离strong_sort/sort/linear_assignment.pygate_cost_matrix开启--no-mc关woCwithout Cascade外观匹配策略去级联strong_sort/sort/linear_assignment.pymatching_cascade开启--no-wo-c关ECCEnhanced Correlation Coefficient相机运动补偿预测前校正ecc.pyECC strong_sort/strong_sort.py_camera_motion开启--no-ecc关各项相互独立、可任意组合如只测 NSA 单项贡献跑--no-ema --no-mc --no-wo-c --no-ecc保留 NSA基线全关、等价 DeepSORT跑--no-nsa --no-ema --no-mc --no-wo-c --no-ecc。对比分析方法见 test/analyze_track_compare.py 。描述链接项目基于 Ultralytics StrongSort 多目标跟踪与改进往期回顾链接数据集数据集汇总软件开发深度学习软件开发汇总
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑