[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"solution-scenes-menu":3,"tech-detail-2585":4},true,{"id":5,"title":6,"content":7,"picUrl":8,"tagIds":9,"keyWords":10,"htmlDescribe":11,"htmlUrl":12,"gmtCreate":13,"gmtModified":13,"articleInfoId":14},"2585","畅联云平台丨06-Kalman隔帧轨迹预测","\u003Ch1 style=\"line-height:2\">Kalman 滤波与隔帧检测：轨迹如何在「无测量帧」上继续走\u003C\u002Fh1>\u003Cp style=\"line-height:2\">本文只讲一件事：当检测隔几帧才跑一次时，中间帧没有新的人体框测量，跟踪仍能给出连续轨迹，靠的是 Kalman 预测；有测量时再做 更新。\u003C\u002Fp>\u003Cp style=\"line-height:2\">读完后应能独立想清：隔 3 帧检测、25 帧\u002F秒时，中间帧的框从哪来；为何检测间隔变大时匹配阈值要放宽；过程噪声与测量噪声拧反了，跟拍会变成什么样。\u003C\u002Fp>\u003Chr \u002F>\u003Ch1 style=\"line-height:2\">一、问题：检测贵，跟拍不能停\u003C\u002Fh1>\u003Cp style=\"line-height:2\">人体检测（YOLO）是扫描阶段最重的算子之一。若 25fps 全帧都跑，算力与延迟都会顶满。折中是 隔帧检测：\u003C\u002Fp>\u003Cul>\u003Cli style=\"line-height:2\">\u003Cspan style=\"color:rgb(225, 60, 57)\">detect_stride = 1\u003C\u002Fspan>：每帧都检测；\u003C\u002Fli>\u003Cli style=\"line-height:2\">\u003Cspan style=\"color:rgb(225, 60, 57)\">detect_stride = 3\u003C\u002Fspan>（默认常见配置）：每 3 帧检测一次，中间两帧 不产生新测量。\u003C\u002Fli>\u003C\u002Ful>\u003Cp style=\"line-height:2\">跟拍与轨迹却必须 每帧都有位置。否则圆镜\u002F裁切窗会在检测帧跳一下、中间帧卡住，观感像坏云台。\u003C\u002Fp>\u003Cp style=\"text-align:center;line-height:2\">\u003Cimg src=\"https:\u002F\u002Fqu-link.oss-cn-hangzhou.aliyuncs.com\u002F2026\u002F09\u002F01\u002Fc4cb4603-f22a-402b-9173-558d8902d5cd.png\" alt=\"\" loading=\"lazy\" \u002F>\u003C\u002Fp>\u003Cp style=\"text-align:center;line-height:2\">\u003Cspan style=\"font-size:12px\">图：检测帧把框当测量做 Update；隔帧只靠运动模型 Predict。\u003C\u002Fspan>\u003C\u002Fp>\u003Chr \u002F>\u003Ch1 style=\"line-height:2\">二、本项目如何决定「本帧要不要检测」\u003C\u002Fh1>\u003Cp style=\"line-height:2\">配置里有检测步长检测步长。每一帧进入跟踪时，先按帧号门控，再把（可能为空的）检测列表交给 ByteTrack：\u003C\u002Fp>\u003Cpre>\u003Ccode>const bool do_detect = (ctx.cfg.detect_stride &lt;= 1) || (idx % ctx.cfg.detect_stride == 0);\nstd::vector&lt;PfByteTrackFaceBox&gt; boxes;\nif (do_detect) {\n \u002F\u002F YOLO → boxes\n}\nconst std::vector&lt;PfByteTrackFaceState&gt; tracks = bt.update(boxes); \u002F\u002F 空 boxes 仍 Predict\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp style=\"text-align:center;line-height:2\">\u003Cimg src=\"https:\u002F\u002Fqu-link.oss-cn-hangzhou.aliyuncs.com\u002F2026\u002F09\u002F01\u002Ff467feea-980b-44d4-8ad5-895324d1df4b.png\" alt=\"\" loading=\"lazy\" \u002F>\u003C\u002Fp>\u003Cp style=\"line-height:2\">也就是说：检测列表为空时不是跳过跟踪，而是做「无测量的一步」。\u003C\u002Fp>\u003Cp style=\"line-height:2\">默认与兜底帧率：探测不到合法 源帧率（或配置帧率非法）时，一律按 25.0 帧\u002F秒 处理；ByteTrack 构造也用该帧率。后文数值例子一律按 25fps。\u003C\u002Fp>\u003Chr \u002F>\u003Ch1 style=\"line-height:2\">三、时间轴：stride=3 时每一帧在干什么\u003C\u002Fh1>\u003Cp style=\"line-height:2\">设帧号 idx = 0,1,2,3,…，检测步长 = 3：\u003C\u002Fp>\u003Cp style=\"text-align:center;line-height:2\">\u003Cimg src=\"https:\u002F\u002Fqu-link.oss-cn-hangzhou.aliyuncs.com\u002F2026\u002F09\u002F01\u002Fd39cbf6a-99fb-46d7-8e78-cceea7112197.png\" alt=\"\" loading=\"lazy\" \u002F>\u003C\u002Fp>\u003Cp style=\"text-align:center;line-height:2\">\u003Cimg src=\"https:\u002F\u002Fqu-link.oss-cn-hangzhou.aliyuncs.com\u002F2026\u002F09\u002F01\u002F704cce90-71ba-4d80-bb02-3f611f460ee7.png\" alt=\"\" loading=\"lazy\" \u002F>\u003C\u002Fp>\u003Cp style=\"text-align:center;line-height:2\">\u003Cspan style=\"font-size:12px\">图：实心点为检测帧，空心为仅预测帧；轨迹折线在中间帧仍前进。\u003C\u002Fspan>\u003C\u002Fp>\u003Cp style=\"line-height:2\">\u003Cspan style=\"font-size:19px\">\u003Cstrong>数值例子（25fps）\u003C\u002Fstrong>\u003C\u002Fspan>\u003C\u002Fp>\u003Cul>\u003Cli style=\"line-height:2\">帧间隔 Δt = 1\u002F25 = 0.04 s。\u003C\u002Fli>\u003Cli style=\"line-height:2\">两次检测之间的墙钟时间：3 × 0.04 = 0.12 s。\u003C\u002Fli>\u003Cli style=\"line-height:2\">若人横向速度约 v_x = 80 px\u002Fs（慢走横穿 720p），两次检测间位移期望：\u003C\u002Fli>\u003C\u002Ful>\u003Cp style=\"line-height:2\">Δx ≈ vx × 0.12 = 9.6 像素\u003C\u002Fp>\u003Cp style=\"line-height:2\">中间两帧若完全不预测，圆镜会落后约 3～6 px 再瞬移追上；有匀速预测则每帧挪约 80×0.04=3.2 px，观感连续。\u003C\u002Fp>\u003Chr \u002F>\u003Ch1 style=\"line-height:2\">四、ByteTrack 里的 Kalman：状态与模型\u003C\u002Fh1>\u003Cp style=\"line-height:2\">ByteTrack 使用经典 8 维匀速模型（中心 + 宽高比\u002F高 + 速度），直觉上可把状态写成（符号与论文\u002F实现细节略有差异，便于心算）：\u003C\u002Fp>\u003Cp style=\"line-height:2\">x = [cx, cy, a, h, vx, vy, va, vh]ᵀ\u003C\u002Fp>\u003Cp style=\"line-height:2\">匀速离散预测（Δt=1 帧）：\u003C\u002Fp>\u003Cp style=\"line-height:2\">cx ← cx + vx\u003C\u002Fp>\u003Cp style=\"line-height:2\">cy ← cy + vy\u003C\u002Fp>\u003Cp style=\"line-height:2\">a ← a + va\u003C\u002Fp>\u003Cp style=\"line-height:2\">h ← h + vh\u003C\u002Fp>\u003Cp style=\"line-height:2\">协方差同步传播：\u003C\u002Fp>\u003Cp style=\"line-height:2\">P ← F P Fᵀ + Q\u003C\u002Fp>\u003Cp style=\"line-height:2\">有测量 z（检测框）时：\u003C\u002Fp>\u003Cp style=\"line-height:2\">卡尔曼增益 K 由预测不确定度与测量噪声共同决定；\u003C\u002Fp>\u003Cp style=\"line-height:2\">状态按「预测值 + 增益 × 残差」更新；\u003C\u002Fp>\u003Cp style=\"line-height:2\">更新后不确定度通常变小。\u003C\u002Fp>\u003Cul>\u003Cli style=\"line-height:2\">Q：过程噪声（相信运动模型的程度；大 → 更信测量）；\u003C\u002Fli>\u003Cli style=\"line-height:2\">R：测量噪声（相信检测框的程度；大 → 更信预测）。\u003C\u002Fli>\u003C\u002Ful>\u003Cp style=\"text-align:center;line-height:2\">\u003Cimg src=\"https:\u002F\u002Fqu-link.oss-cn-hangzhou.aliyuncs.com\u002F2026\u002F09\u002F01\u002Ff4ab761c-2957-4408-92d6-e161b53f0e8c.png\" alt=\"\" loading=\"lazy\" \u002F>\u003C\u002Fp>\u003Cp style=\"text-align:center;line-height:2\">\u003Cspan style=\"font-size:12px\">图：R 过大跟手慢；Q 过大框抖；隔帧场景要在两者间找平衡。\u003C\u002Fspan>\u003C\u002Fp>\u003Cp style=\"line-height:2\">位置噪声大致按框高比例取值，速度噪声更小——符合「人不会瞬间瞬移」的先验。\u003C\u002Fp>\u003Chr \u002F>\u003Ch1 style=\"line-height:2\">五、封装层：如何把 YOLO 框喂进跟踪器\u003C\u002Fh1>\u003Cp style=\"line-height:2\">封装层把检测框转成跟踪器输入；\u003C\u002Fp>\u003Cp style=\"line-height:2\">当\u003Cspan style=\"color:rgb(225, 60, 57)\"> detections \u003C\u002Fspan>为空时，\u003Cspan style=\"color:rgb(225, 60, 57)\">objects \u003C\u002Fspan>为空向量——底层对每条已有轨迹仍执行 predict，丢失缓冲（轨迹缓冲）继续倒数。本项目默认\u003Cspan style=\"color:rgb(225, 60, 57)\"> track_buffer = 30\u003C\u002Fspan>（约 30 帧 ≈ 1.2 s @25fps）。\u003C\u002Fp>\u003Cp style=\"line-height:2\">构造时帧率取整：\u003C\u002Fp>\u003Cp style=\"line-height:2\">\u003Cspan style=\"color:rgb(225, 60, 57)\">source_fps=25\u003C\u002Fspan> → ByteTrack 内部\u003Cspan style=\"color:rgb(225, 60, 57)\"> frame_rate=25\u003C\u002Fspan>，与输出时间轴一致。\u003C\u002Fp>\u003Chr \u002F>\u003Ch1 style=\"line-height:2\">六、为何 stride 大时要放宽 match_thresh\u003C\u002Fh1>\u003Cp style=\"line-height:2\">检测变稀后，相邻两次测量之间人已走过更远。IoU 匹配若仍很严，会把「同一个人的下一检测」当成新目标，ID 切换 ，主角锁丢。\u003C\u002Fp>\u003Cp style=\"text-align:center;line-height:2\">\u003Cimg src=\"https:\u002F\u002Fqu-link.oss-cn-hangzhou.aliyuncs.com\u002F2026\u002F09\u002F01\u002F82b11dd9-1621-410d-9744-a43dc2b051f8.png\" alt=\"\" loading=\"lazy\" \u002F>\u003C\u002Fp>\u003Cp style=\"line-height:2\">跟踪分数下界 \u002F 高分阈值 仍对齐 YOLO 分数阈值（high 至少 score+0.05 且 ≥0.30），与 stride 解耦——放宽的是关联距离门，不是检测分数门。\u003C\u002Fp>\u003Cp style=\"line-height:2\">\u003Cspan style=\"font-size:19px\">\u003Cstrong>数值例子：IoU 与位移\u003C\u002Fstrong>\u003C\u002Fspan>\u003C\u002Fp>\u003Cp style=\"line-height:2\">设上一检测框 640×360 画面中人框为 x=400,y=200,w=120,h=280。0.12 s 后中心右移 30 px（快跑），新框 x=430,y=200,w=120,h=280。\u003C\u002Fp>\u003Cp style=\"line-height:2\">轴对齐 IoU 近似：\u003C\u002Fp>\u003Cp style=\"line-height:2\">IoU = 交集面积 ÷ 并集面积\u003C\u002Fp>\u003Cp style=\"line-height:2\">交集宽 90、高 280，交集面积 25200；并集 2×33600−25200=42000；\u003C\u002Fp>\u003Cp style=\"line-height:2\">IoU ≈ 25200\u002F42000 = 0.60\u003C\u002Fp>\u003Cp style=\"line-height:2\">在\u003Cspan style=\"color:rgb(225, 60, 57)\"> match_thresh=0.70 \u003C\u002Fspan>下可能匹配失败；在\u003Cspan style=\"color:rgb(225, 60, 57)\"> 0.55 \u003C\u002Fspan>下可通过。这正是 stride≥3 放宽的动机。\u003C\u002Fp>\u003Cp style=\"line-height:2\">扫描启动日志会打印实际阈值：\u003C\u002Fp>\u003Cp style=\"line-height:2\">step= … 匹配阈值=0.55 检测步长=3\u003C\u002Fp>\u003Chr \u002F>\u003Ch1 style=\"line-height:2\">七、与 hold \u002F 离线平滑的分工\u003C\u002Fh1>\u003Cp style=\"line-height:2\">Kalman 解决的是 扫描期逐帧状态（ByteTrack 输出的人体框序列）。成片跟拍还有后处理：\u003C\u002Fp>\u003Cp style=\"line-height:2\">短时丢检时轨迹会保持一段时间（与检测步长相关，通常可达数十帧）；\u003C\u002Fp>\u003Cul>\u003Cli style=\"line-height:2\">离线高斯平滑（lens\u002Fcrop）在锁定轨迹上再滤一次。\u003C\u002Fli>\u003C\u002Ful>\u003Cp style=\"line-height:2\">不要把三者混为一谈：\u003C\u002Fp>\u003Cp style=\"text-align:center;line-height:2\">\u003Cimg src=\"https:\u002F\u002Fqu-link.oss-cn-hangzhou.aliyuncs.com\u002F2026\u002F09\u002F01\u002Fe2d4dc9e-75e7-41ed-b487-aeb1b23124c0.png\" alt=\"\" loading=\"lazy\" \u002F>\u003C\u002Fp>\u003Cp style=\"line-height:2\">Kalman 错了，后面平滑只能「抹平错误」，不能恢复正确身份。\u003C\u002Fp>\u003Chr \u002F>\u003Ch1 style=\"line-height:2\">八、完整一步：从帧号到轨迹点\u003C\u002Fh1>\u003Cp style=\"line-height:2\">完整一步可以概括为：\u003C\u002Fp>\u003Col>\u003Cli style=\"line-height:2\">判断本帧要不要跑检测；\u003C\u002Fli>\u003Cli style=\"line-height:2\">要检测则得到人体框，否则检测列表为空；\u003C\u002Fli>\u003Cli style=\"line-height:2\">无论是否检测都调用 bt.update(boxes)（空列表表示只预测）；\u003C\u002Fli>\u003Cli style=\"line-height:2\">对每条轨迹：做人脸识别与相似度，记录历史；\u003C\u002Fli>\u003Cli style=\"line-height:2\">主角锁定后写入定位结果中的跟拍轨迹。\u003C\u002Fli>\u003C\u002Fol>\u003Cp style=\"line-height:2\">因此调试「中间帧框从哪来」时：看 ByteTrack 输出即可，不必指望中间帧有 YOLO 日志。\u003C\u002Fp>\u003Chr \u002F>\u003Ch1 style=\"line-height:2\">九、 Q\u002FR 与隔帧的失效模式\u003C\u002Fh1>\u003Ch2 style=\"line-height:2\">9.1 测量过信（R 过小 \u002F 等效）\u003C\u002Fh2>\u003Cp style=\"line-height:2\">检测框抖 → 更新后状态猛跟抖 → 中间帧预测带着错误速度冲出去 → 下一检测再拉回来 → 锯齿。\u003C\u002Fp>\u003Ch2 style=\"line-height:2\">9.2 模型过信（Q 过小 \u002F R 过大）\u003C\u002Fh2>\u003Cp style=\"line-height:2\">人突然加速或转向，预测仍沿旧速度走；下一检测 IoU 掉到 match 阈值以下 → 切 ID。stride 越大越危险，所以本项目用放宽 匹配阈值 补偿。\u003C\u002Fp>\u003Ch2 style=\"line-height:2\">9.3 长时间无测量\u003C\u002Fh2>\u003Cp style=\"line-height:2\">若 轨迹缓冲 耗尽仍无检测，轨迹删除。检测步长=3、buffer=30 时，约可跨过 30 帧无更新（含中间预测帧），墙钟约 1.2 s。极端遮挡仍会丢轨——这是设计边界，不是 bug 。\u003C\u002Fp>\u003Ch2 style=\"line-height:2\">9.4 数值演练：错误速度的积累\u003C\u002Fh2>\u003Cp style=\"line-height:2\">假设更新后误估 v_x = 15 px\u002F帧（实际应为 3）。stride=3 下两次检测间预测位移：\u003C\u002Fp>\u003Cp style=\"line-height:2\">15 × 3 = 45 像素\u003C\u002Fp>\u003Cp style=\"line-height:2\">真实位移 9 px，误差 36 px。下一框 IoU 可能从 0.6 掉到 0.3 以下，触发 ID 切换。离线平滑无法修复切 ID，只能让错误轨迹「更圆滑地错」。\u003C\u002Fp>\u003Chr \u002F>\u003Ch1 style=\"line-height:2\">十、source_fps=25 为何重要\u003C\u002Fh1>\u003Cp style=\"line-height:2\">Kalman \u002F ByteTrack 的 帧率 影响内部缓冲与部分时间相关逻辑。本项目：\u003C\u002Fp>\u003Cul>\u003Cli style=\"line-height:2\">探测不到合法 fps → 25.0；\u003C\u002Fli>\u003Cli style=\"line-height:2\">成片滤镜图大量写死 fps=25；\u003C\u002Fli>\u003Cli style=\"line-height:2\">质量稳定性把运动除以检测步长做等效。\u003C\u002Fli>\u003C\u002Ful>\u003Cp style=\"line-height:2\">心算时固定：\u003C\u002Fp>\u003Cp style=\"line-height:2\">时间（秒）≈ 帧号 \u002F 25\u003C\u002Fp>\u003Cp style=\"line-height:2\">隔帧检测的「物理秒」间隔是 detect_stride\u002F25，不是「跳过了 stride 个神秘单位」。\u003C\u002Fp>\u003Chr \u002F>\u003Ch1 style=\"line-height:2\">十一、调参清单（只动跟踪相关）\u003C\u002Fh1>\u003Cp style=\"text-align:center;line-height:2\">\u003Cimg src=\"https:\u002F\u002Fqu-link.oss-cn-hangzhou.aliyuncs.com\u002F2026\u002F09\u002F01\u002F08e28e9f-daba-4a51-9d47-d65bc5e7862b.png\" alt=\"\" loading=\"lazy\" \u002F>\u003C\u002Fp>\u003Cp style=\"line-height:2\">建议：先定 stride，再接受自动 match_thresh；不要在 stride=3 时强行把 match 拧回 0.70。\u003C\u002Fp>\u003Chr \u002F>\u003Ch1 style=\"line-height:2\">十二、 小结公式卡\u003C\u002Fh1>\u003Cp style=\"line-height:2\">隔帧门控：\u003C\u002Fp>\u003Cp style=\"line-height:2\">\u003Cspan style=\"color:rgb(225, 60, 57)\">do_detect = (stride≤1) || (idx % stride == 0)\u003C\u002Fspan>\u003C\u002Fp>\u003Cp style=\"line-height:2\">空测量仍更新跟踪器：\u003C\u002Fp>\u003Cp style=\"line-height:2\">每一帧都调用\u003Cspan style=\"color:rgb(225, 60, 57)\"> bt.update(boxes)\u003C\u002Fspan>：有检测就关联并校正，无检测就只预测。\u003C\u002Fp>\u003Cp style=\"line-height:2\">匹配阈值（本项目）：\u003C\u002Fp>\u003Cp style=\"line-height:2\">检测步长=1 时匹配阈值约 0.70；步长=2 时约 0.62；步长≥3 时约 0.55。\u003C\u002Fp>\u003Cp style=\"line-height:2\">预测位移量级：\u003C\u002Fp>\u003Cp style=\"line-height:2\">两次检测间位移 ≈ 速度 ×（检测步长 \u002F 帧率）\u003C\u002Fp>\u003Cp style=\"line-height:2\">把这四条背熟，就可以在日志里区分「检测没跑」与「跟踪没跑」，并解释为何中间帧仍有框。\u003C\u002Fp>\u003Cp style=\"line-height:2\">\u003Cbr \u002F>\u003C\u002Fp>","https:\u002F\u002Fqu-link.oss-cn-hangzhou.aliyuncs.com\u002F2026\u002F09\u002F01\u002F3fd3f28e-a8a0-41f2-9d6c-12624af697cb.jpg","84,85","美畅，美畅物联，畅联，畅联云平台，视频监控云平台，云视频监控，视频云平台，视频开放平台，视频感知云，视频接入网关，AIoT综合接入网关，视频中台，物联网中台，视频上云网关，Ehome，I连锁行业，智慧交通，AI算法","原创技术分享丨美畅物联向工","https:\u002F\u002Fwww.24hlink.cn\u002Ftech\u002F2585","2026-09-01 15:21:37","867"]