资讯动态

遮挡跟踪中的卡尔曼滤波:协方差膨胀、门控与状态机实战

发布时间:2026/10/29 23:22:34 来源:尧图企业网站定制
简介面向遮挡与重叠场景的单目标跟踪项目适合具备一定计算机视觉与机器学习基础、希望理解卡尔曼滤波落地实现的学习者。项目以卡尔曼滤波结合最大IOU匹配完成连续视频帧中的目标定位重点处理部分目标不可见时的跟踪丢失问题并利用运动模型预测与观测更新提升稳定性、平滑噪声。压缩包共338个文件约25.87MB其中327个txt为目标标签数据2个py为核心算法与辅助工具代码另有4个xml配置、2个pyc及1个mp4测试视频便于直接运行验证与评估跟踪效果。已有513人学习下载。读者可据此梳理预测—更新流程、状态转移与测量矩阵设置理解IOU关联与卡尔曼预测在遮挡恢复中的配合并借助标签与测试视频复现实验、观察跟踪曲线形成从算法实现到效果验证的完整认识。1. 卡尔曼滤波不是滤波器遮挡场景下真正被求解的是什么问题遮挡发生的第 3 帧检测器交回一个空结果而跟踪器仍然得把框画在屏幕上。这时候决定成败的往往不是检测模型有多强而是卡尔曼滤波给出的那个预测框以及它背后那个 8×8 的协方差矩阵。在遮挡与重叠环境下的单目标跟踪里把卡尔曼滤波当成“平滑抖动框的后处理”是最大的误解它的真正身份是一个带不确定性度量的状态外推器输出的 8 维状态和协方差矩阵决定了下一帧谁敢跟、谁该放弃、谁能被重新捡回来。检测器负责“看见”卡尔曼滤波负责“看不见的时候还敢不敢说、说的时候有多心虚”。搞懂协方差怎么膨胀、怎么收缩遮挡跟踪的绝大部分异常行为就有了统一的解释。2. 状态量与运动模型卡尔曼滤波的“世界观”是怎么写死的卡尔曼滤波不是一个可以直接调用的黑箱它是一套关于“目标如何运动、观测如何出错”的假设。这些假设全部被编码进三个矩阵状态转移矩阵 F、过程噪声 Q、观测矩阵 H 和观测噪声 R。目标被遮挡时滤波器能做的所有事情都被这四个矩阵提前限定死了。写错一个数量级遮挡 10 帧之后的预测框就会飘到画面外而你还在怀疑检测器。2.1 状态向量为什么是 8 维而不是 4 维最直觉的做法是把检测框(x1, y1, x2, y2)或(x, y, w, h)直接作为状态。这种 4 维状态能描述“现在在哪”但当观测缺失时它没有任何东西可以用来外推。卡尔曼滤波的预测步本质是x Fx如果状态里没有速度项那么F只能是单位矩阵预测结果就等于上一帧的位置框会原地“冻住”直到目标重新出现或者跟踪彻底失败。所以常见做法是把速度也纳入状态构成 8 维向量[cx, cy, a, h, vcx, vcy, va, vh]。多出来的 4 维让状态空间从“位置”升级为“位置 动量”遮挡期间滤波器才能沿着已有的运动方向惯性滑行。这也解释了为什么用卡尔曼滤波做跟踪时初始化通常要等上一两帧速度项需要帧间差分才能赋初值第 0 帧的速度只能是 0此时的协方差要给得足够大让它快速收敛。这里有一个容易被忽略的取舍为什么是(cx, cy, a, h)而不是(x1, y1, x2, y2)。四角坐标的问题是四个分量强相关一个目标平移时四个数同时变化协方差矩阵的非对角项很难标定而中心点加尺度把“位置”和“大小”解耦中心点的运动学与尺度的变化率可以各自用一套噪声参数描述。选宽高比a w/h而不是单独的w、h是在赌一个物理先验行人、车辆、大部分刚性目标在运动过程中形状近似不变。这个假设在遮挡期间尤其值钱因为遮挡时唯一还靠得住的先验就是“它不会突然变瘦”。a这一维的噪声通常给得极小1e-2 量级h的噪声按目标尺寸缩放这两个参数配合起来效果就是“遮挡期间尺度几乎锁死只有中心点在外推”。很多跟踪器在长遮挡后出现框“忽大忽小”的抖动根源往往就是va、vh的噪声被随手调大了。2.2 匀速模型与过程噪声Q 不是超参数是“允许自己错多少”的声明状态转移矩阵的结构极其简单只有位置与速度之间的耦合项# 状态: [cx, cy, a, h, vcx, vcy, va, vh] def build_F(dt1.0): F eye(8) for i in range(4): F[i][i 4] dt # 位置 上一帧位置 速度 * 时间间隔 return F这段代码里唯一值得讨论的是dt。绝大多数开源实现直接把它写成 1隐含假设“帧率恒定”。一旦视频源从 25fps 切到 60fps或者出现丢帧速度的物理含义就变了——vcx从“每帧位移”变成了“每 1/60 秒位移”而 Q、R 里的数值还是按老帧率标定的表现就是轨迹变得迟钝或者过冲。把dt显式传进去是让你的参数在任何帧率下都保持同一物理量纲的最低成本手段。我见过不止一个项目在这里翻车排查了半天以为是检测器漂移。过程噪声Q则是整个模型里最需要“讲道理”的地方。它的物理含义是在没有任何观测的情况下你认为匀速模型一帧会错多少。Q 给得太小滤波器会极度自信地认为“速度恒定”长遮挡外推时轨迹像用尺子画出来的直线一旦目标转弯或者相机平移预测框就一头扎进错误的方向Q 给得太大滤波器认为速度随时可能剧变于是每来一帧观测速度状态就被观测噪声牵着走框在目标周围高频抖动。常见的实现思路是按目标尺寸缩放噪声而不是用绝对像素值def build_Q(h, dt1.0, w_pos1/20, w_vel1/160): # 噪声标准差与目标高度成正比: 远小目标抖得少, 近大目标抖得多 std [w_pos * h, w_pos * h, 1e-2, w_pos * h, # 位置与尺度 w_vel * h, w_vel * h, 1e-5, w_vel * h] # 速度 return diag([(s * dt) ** 2 for s in std])w_pos 1/20表示位置的不确定性约等于框高的 5%w_vel 1/160表示速度的不确定性比位置小一个数量级。这个比例关系不是玄学它来自真实场景里的两个统计事实第一检测框的抖动幅度与目标在画面中的像素尺寸成正比远处的目标不可能抖 20 像素第二速度是从位置差分出来的慢变量一帧之内速度的增量远小于位置本身的噪声所以速度的允许变化量必须显著小于位置。参数典型取值调大后的行为调小后的行为w_pos1/20 框高位置噪声大滤波器更信观测响应快但抖更信预测遮挡期间轨迹平滑但跟不上机动w_vel1/160 框高速度可快速变化转弯跟得上但易被检测噪声带偏速度锁死长遮挡外推僵直a的噪声1e-2宽高比随检测框变化重叠时框会胀缩尺度锁死长遮挡后不会变形dt1/帧率帧率变化时轨迹尺度失真同上只是方向相反把 Q 写成随h缩放的函数还有一个隐性收益同一套参数可以同时喂给近处的大目标和远处的小目标。用固定像素值时你几乎必然要在“近处够灵敏”和“远处不抖动”之间二选一这个取舍在任何多尺度场景里都是无解的。2.3 观测矩阵 H 与观测噪声 R为什么速度不能进观测观测矩阵的作用是把 8 维状态映射到检测器能给出的 4 维观测空间def build_H(): H zeros((4, 8)) for i in range(4): H[i][i] 1.0 # 只观测 [cx, cy, a, h], 速度维不可观测 return H结构上就是[I₄ | 0]。速度不进观测不是因为检测器不想给而是因为它给不了检测框是逐帧独立的输出任何“速度”都只能靠对框做差分得到。而对噪声做差分噪声方差会被放大两倍两个独立同分布噪声相减方差相加并且放大的倍数与帧率挂钩。把这种二次加工的量当成观测量喂回去等于给滤波器灌了一份相关性极强的伪观测协方差矩阵会迅速失去意义。R的标定逻辑和Q类似也按框高缩放常见做法是取1/20框高作为观测噪声标准差def build_R(h, w_obs1/20): std [w_obs * h, w_obs * h, 1e-1, w_obs * h] return diag([s * s for s in std])宽高比那一维用绝对值 1e-1 而不是按h缩放是因为a本身是无量纲比值与人物的像素尺寸无关。注意R只能描述检测框的随机抖动描述不了系统性偏差。检测阶段的非极大值抑制把两个重叠目标合并成一个框这是偏差不是噪声调R完全无效只能靠后文的门控和状态机兜底。3. 预测—更新闭环遮挡期间滤波器到底在算什么有了状态和四个矩阵卡尔曼滤波的核心就只有两行公式。但正是这两行公式在遮挡与重叠场景下产生了几乎全部的可观测行为所以值得把每一步的中间量都摊开看先验协方差膨胀多少、卡尔曼增益怎么变、新息残差往哪个方向拉。看懂这些中间量你才能在框飘掉的时候判断是模型错了还是数据错了。3.1 预测步协方差膨胀不是副作用是主功能预测步做两件事把状态往前推一步把不确定性放大一圈。def predict(x, P, F, Q): x mv(F, x) # 状态外推: 沿速度滑行 P add(mm(mm(F, P), transpose(F)), Q) # 协方差: 传播 膨胀 return x, PFPFᵀ这一项的含义是“上一帧的不确定性经过运动模型放大后的结果”加上的Q是“模型本身引入的新不确定性”。两项叠加协方差矩阵的迹每帧都在增长。用几何语言说状态空间里那个代表“目标可能位置”的椭圆每预测一次就胖一圈长轴沿着速度方向拉伸。这个膨胀过程恰好对应现实目标被遮挡的时间越长你对它在哪的判断就越没底。位置方差从遮挡第 1 帧的几个像素到第 20 帧可能膨胀到几十个像素椭圆大到能覆盖半个画面。如果 Q 给得偏大膨胀速度会快得离谱三五帧之后协方差就大到失去区分度预测框虽然还在但已经等价于“我不知道它在哪”。所以预测步的调参目标不是“让预测框更准”而是“让膨胀速度匹配真实的不确定性增长速度”。这是个可以用数据验证的事情拿一段有标注的遮挡序列统计遮挡第 k 帧时预测中心与真值的像素误差它大致应该和sqrt(P[k][k])同量级。如果协方差涨得比真实误差快说明 Q 偏大反过来就是偏小。这条经验我一般在做新场景适配时先跑一遍比盲调参数快得多。3.2 更新步卡尔曼增益本质是一个信任分配器更新步拿到检测框之后做的事情是把预测和观测按权重融合def update(x, P, z, H, R): S add(mm(mm(H, P), transpose(H)), R) # 新息协方差 4x4 K mm(mm(P, transpose(H)), inv(S)) # 卡尔曼增益 8x4 y sub(z, mv(H, x)) # 新息: 观测 - 预测 x add(x, mv(K, y)) # 按增益修正状态 P mm(sub(eye(8), mm(K, H)), P) # 不确定性收缩 return x, P, y, S盯住增益K就够了。把 8 维问题退化成一维来理解K p / (p r)其中p是预测方差r是观测方差。这个式子的全部含义就是加权平均——K接近 1 时几乎完全采纳观测接近 0 时几乎完全相信预测。目标刚被遮挡、P还小的时候K ≈ 0.3检测框只能微调预测位置轨迹平滑。遮挡 15 帧之后P膨胀到远大于RK ≈ 0.95新来的检测框几乎直接覆盖预测值。这就是“后悔药”机制协方差膨胀到极致时滤波器会自动切换到“高度信任观测”模式让目标重新出现时能被一把拉回来而不是被历史轨迹拖住。代价是此时它对误检同样毫无抵抗力——一个背景误检落在膨胀后的椭圆里就会被瞬间吸走。这个矛盾是遮挡跟踪的核心张力后面章节的门控和状态机本质上都是在给这条机制加保险丝。y新息残差是另一个被低估的信号。它的模长在正常跟踪时很小目标被部分遮挡或检测框偏移时会突然跳大。很多工程实现直接把|y|的滑动均值当作“跟踪质量分”用于触发重检测或者降低该目标的置信度比任何额外的分类器都便宜。协方差更新的标准写法是P (I - KH)P这个形式在数值上不保证对称正定长时间迭代后可能出现负特征值进而让S不可逆、程序崩在中途。工程实现里通常改用 Joseph 形式P (I-KH)P(I-KH)ᵀ KRKᵀ代价是多两次矩阵乘法换来的是任何情况下都保持半正定。这个改动在短序列上看不出差别跑几十分钟长视频就会体现价值。3.3 遮挡期间只预测不更新这条分支决定了系统的下限遮挡帧的检测结果为空代码走的是另一条路径只调predict跳过update。看起来只是少了一行调用实际效果是协方差持续单向膨胀状态沿着恒定速度外推。if det is None: x, P predict(x, P, F, Q) # 无观测: 只外推, 不确定度持续增长 miss 1 else: x, P predict(x, P, F, Q) x, P, y, S update(x, P, det, H, R) miss 0关键参数是允许连续丢失的帧数上限。它不是一个可以拍脑袋定的常数而应该由 Q 的膨胀速度和你想容忍的最大位移误差共同决定如果 Q 让位置方差每帧增长σ²丢失n帧后标准差是σ√n而你希望外推误差不超过目标高度的一半就能反解出n。经验值通常在 15 到 30 帧之间对应 25fps 下半秒到一秒超过这个范围预测框的物理意义已经接近于零。还有一处容易写错丢失期间速度状态该不该衰减。恒定速度外推意味着目标会永远沿直线走下去这对短遮挡没问题对长遮挡就是灾难。常见做法是在丢失超过若干帧后对速度项乘一个衰减系数比如 0.95让轨迹逐渐“停下”而不是飞出去。这个技巧没有任何理论保证但在实拍数据上比纯外推稳得多属于典型的血泪经验型参数。3.4 重叠场景协方差如何参与“明确选择目标框”两个目标重叠时检测器可能给出两个几乎重合的框也可能把它们合并成一个。这时候卡尔曼滤波的作用从“外推位置”切换到“提供判据”。由于每个跟踪器都维护自己的P你可以直接算出“这个检测框落在我预测位置周围的可能性有多大”。刚刚经历过遮挡的跟踪器P很大它的接受范围就宽一直跟得很稳的跟踪器P很小接受范围就窄。这种自适应门控是多目标跟踪里区分 ID 的关键手段也是卡尔曼滤波在关联阶段真正的价值所在——它不只输出位置还输出“这个位置有多可信”。重叠还会带来一个更隐蔽的问题尺度混淆。两个目标重叠时检测框往往会比真实框大一圈把邻居也算进去了如果a和h的观测噪声给得太小滤波器会认为“目标确实变大了”把错误的尺度写进状态等目标分开框就再也缩不回来。所以尺度维的R宁可给大一点让滤波器对检测框的尺度变化保持怀疑这也是 2.1 节里强调“尺度锁死”的另一面。4. 数据关联重叠环境下“这个框到底属于谁”单目标跟踪听起来不需要关联——画面里只有一个目标检测到就更新没检测到就预测。但真实场景里重叠目标会引入大量的“非我”检测邻居的框、被遮挡后暴露的背景纹理、检测器合并产生的大框。把这些框无差别地喂给更新步就是 ID 跳变和轨迹漂移的直接来源。关联层要解决的问题是在把观测交给卡尔曼滤波之前先判断它配不配。4.1 门控用马氏距离把“物理上不可能”的检测先剔掉欧氏距离在这里不够用因为预测的不确定性是各向异性的——沿运动方向的方差大垂直方向的方差小。马氏距离把协方差矩阵当作度量正好对应这种椭圆形的置信区域CHI2_95_4DOF 9.4877 # 4 自由度卡方分布 95% 分位 def mahalanobis_gate(z, x, P, H, R): y sub(z, mv(H, x)) # 新息 4 维 S add(mm(mm(H, P), transpose(H)), R) # 新息协方差 4x4 d2 quad_form(transpose(y), inv(S), y) # 马氏距离的平方 return d2, d2 CHI2_95_4DOF门限取卡方分布的 95% 分位自由度等于观测维数4 维框对应 9.4877。这个数字的物理含义是如果预测和观测来自同一个目标那么 95% 的情况下d²会落在这个阈值以内。这套门控最有意思的性质是它是自适应的目标刚被遮挡时P小S小门控很严稍有偏移的检测就被拒掉遮挡 20 帧后P膨胀S变大同样的像素偏差算出来的d²反而更小门控自动放宽。换句话说卡尔曼滤波用自己的不确定性动态地决定了“愿意接受多远的检测”。这比用一个固定的像素阈值优雅得多也是为什么 3.3 节里对 Q 的标定值得认真对待——Q 直接决定了门控放宽的速度。4.2 代价矩阵与匹配IoU 和马氏距离怎么加权实际工程里通常把两种距离融合成一个代价矩阵。IoU 擅长处理“框与框的空间重叠”马氏距离擅长处理“结合运动先验的可能性”两者的盲区互补目标快速移动时 IoU 可能为 0两个框完全不重叠但马氏距离仍然合理目标突然停下时马氏距离可能偏大但 IoU 依然很高。LAMBDA_IOU, LAMBDA_MAHA 0.6, 0.4 def build_cost(dets, trackers): C full((len(dets), len(trackers)), 1e5) # 默认代价: 门控外的高墙 for i, z in enumerate(dets): for j, trk in enumerate(trackers): iou compute_iou(z, project(trk.x)) # 投影到观测空间 d2, ok mahalanobis_gate(z, trk.x, trk.P, H, R) if not ok: continue # 门控直接否决 C[i][j] LAMBDA_IOU * (1 - iou) LAMBDA_MAHA * (1 - exp(-d2 / 2)) return C两个细节值得说明。第一门控不通过的项直接填一个大常数1e5而不是inf因为部分求解器对无穷值不友好用一个大数在数值上等价但更稳。第二马氏距离要先经过1 - exp(-d²/2)这样的单调映射压到[0, 1]否则它和 IoU 的量纲差距太大加权系数会完全失效——d²可以轻易到 20 以上直接线性相加会让 IoU 项形同虚设。代价矩阵算出来后交给匈牙利算法求最小代价的完备匹配未匹配的检测进入新轨迹候选未匹配的轨迹累加丢失计数。这里有一个隐含前提观测与轨迹数量不等时代价矩阵不是方阵需要补零扩展成方阵。补的零会带来一个陷阱——如果把“未匹配”的代价设成 0算法会倾向于什么都不匹配。正确做法是给未匹配项设置一个显式代价通常取门控内最大代价的一半让算法在“勉强匹配”和“放弃匹配”之间做真实的权衡。4.3 状态机tentative / confirmed / removed 的迁移条件轨迹对象本身要带状态否则你无法区分“刚出生的、还没确认的轨迹”和“跟了 300 帧、刚刚被遮挡的轨迹”而这两者在门控宽度、允许丢失帧数上应该有完全不同的待遇。状态进入条件允许丢失帧数输出检测框tentative新检测首次匹配成功12否confirmed连续匹配成功达到 n_init 次max_age如 30是lost连续丢失超过阈值继续外推等待重捕获可选画虚线框removed丢失超过 max_age—否n_init的作用是抑制误检导致的虚假轨迹代价是真实目标出现后要等几帧才会被确认这几帧里检测框不输出。在用卡尔曼滤波做跟踪的系统里这个交换通常划算宁可晚 3 帧也不要让背景误检产生一堆短命轨迹。状态机的真正价值在遮挡期间才显现。目标被遮挡 10 帧时轨迹处于confirmed但连续丢失框靠预测维持如果此时一个门控内的误检出现状态机会允许它更新——因为轨迹还没进入lost。这就是 3.2 节提到的“协方差膨胀后容易被吸走”的具体表现。一个实用的加固手段是连续丢失超过若干帧后要求新观测不仅要过马氏门控还要过 IoU 门控即预测框与检测框必须有实际重叠两个门同时通过才允许更新。这条规则在重叠场景里能把 ID 跳变率压掉一大截。5. 常见问题与排查遮挡跟踪上线后最容易翻车的五处参数调好、指标漂亮一上真实视频就出问题这是遮挡跟踪的常态。下面几条都是可以复现的典型故障每一条都给出可观测的现象、机制层面的原因和具体改法方便对照排查。5.1 长遮挡后框“越跑越偏”且方向一致现象目标被柱子遮挡 15 帧重新出现时预测框已经偏到目标一侧偏差方向在整个序列里保持一致。原因w_vel给得太小滤波器对速度的信任度过高把遮挡前那一瞬间的速度当成了恒定真值。如果遮挡前目标恰好处于转弯或加速状态这个速度本身就是错的外推 15 帧后误差被线性放大。解决把w_vel从 1/160 提到 1/80 量级重跑观察长遮挡段的误差曲线是否收敛同时在丢失超过 8 帧后对速度项乘 0.95 的衰减让轨迹逐渐停下而不是一路飞出去。改完要验证短遮挡段没有被拖累——衰减系数太小会让短暂丢失后的轨迹显得迟钝。5.2 目标重新出现时框瞬间跳到背景误检上现象遮挡结束目标回到画面框却跳到了旁边一个纹理区域几帧后才慢慢回来或者干脆跟丢。原因遮挡期间P持续膨胀卡尔曼增益趋近于 1此时滤波器对新观测几乎无条件接受。如果检测器在那个区域输出了一个误检且它落在膨胀后的椭圆内就会被直接采纳并写入状态。这是 3.2 节机制的必然结果不是 bug。解决给更新加一道 IoU 复核——协方差膨胀超过阈值后要求检测框与预测框的 IoU 大于 0.1 才允许更新同时给max_age设上限不要让轨迹在完全失去物理意义之后还在等待。如果场景里误检多还可以引入短时外观特征做二次确认但那已经超出纯运动模型的范围了。5.3 远近目标共用一套参数总有一头不对现象调好参数后近处大目标跟得稳远处小目标一直抖或者反过来小目标平滑了大目标变得迟钝。原因Q 和 R 用的是绝对像素值而检测框的抖动幅度与目标在画面里的像素尺寸成正比。一个 20 像素高的小目标抖动 2 像素是 10%一个 400 像素高的大目标抖动 2 像素是 0.5%用同一组噪声参数必然失衡。解决把所有噪声标准差写成系数 × h的形式见 2.2 节的build_Q只调系数不调绝对值。改完之后参数在不同尺度的目标之间自动迁移跨场景复用的成本会低很多。5.4 相机移动或变焦时匀速模型整体失效现象手持拍摄或者云台转动的素材里目标明明没动框却往画面边缘漂变焦时尺度状态直接崩掉。原因卡尔曼滤波的状态定义在图像坐标系里匀速模型假设的是“目标在图像中的位置匀速变化”。相机平移会让这个假设失效——目标在图像上的位移来自相机运动而不是目标自身的运动速度状态被污染成了一个混合量。解决在预测之前做相机运动补偿用背景特征估计帧间的全局仿射变换把上一帧的状态先变换到当前帧坐标系再做预测。哪怕只用平移分量去掉旋转和缩放也能消掉大部分漂移。变焦场景还要把尺度分量单独补偿否则h的观测会被误认为是目标在靠近。5.5 换了个帧率的视频所有参数集体失灵现象同一套参数在 25fps 素材上正常换到 60fps 素材后跟踪变迟钝遮挡时外推距离明显不足。原因dt被硬编码成 1速度的物理含义随帧率改变。25fps 下“每帧位移 5 像素”对应 125 像素/秒60fps 下同样的物理速度只对应每帧 2 像素但状态里存的还是 5预测就会冲过头反过来 Q 的膨胀速度也按帧计帧率翻倍意味着同样的物理时间内膨胀了 2.4 倍。解决把dt 1 / fps显式传进build_F和build_Q让所有噪声项都带上时间量纲。这一条改动量最小收益却最直接尤其是需要处理多源视频的项目。6. 设计取舍为什么在遮挡场景里仍然选卡尔曼滤波把所有机制拆完有一个问题值得正面回答明明遮挡场景是非线性、非高斯的为什么不用粒子滤波或者干脆训一个端到端模型先看卡尔曼滤波在这里的真实优势。它假设状态服从单峰高斯分布这个假设在遮挡场景下其实是错的——目标被遮挡后它可能出现在柱子的左边也可能出现在右边真实的后验是双峰的。但单峰假设换来的东西很实在整个系统只有 8 维状态和一个 8×8 协方差任何一个中间量都可以打印出来看任何一个异常行为都能追溯到具体的矩阵项。协方差的迹可以直接当作“跟踪置信度”用于下游逻辑马氏距离可以直接当作门控阈值这些都是零成本获得的副产品。粒子滤波在理论上能表达多峰但要在 8 维空间里维持足够多的粒子来覆盖遮挡后的双峰粒子数会到几千量级而且粒子退化会让结果在长遮挡后变得不可复现——调不好的时候你根本不知道是模型错了还是采样运气不好。方案遮挡建模能力可解释性训练成本长遮挡稳定性卡尔曼滤波单峰高斯靠协方差膨胀近似高每个中间量可查零好误差随丢失帧数线性增长粒子滤波可表达多峰中需看粒子分布零中粒子退化导致方差大端到端序列模型强可学习遮挡模式低黑匣子高需要大量标注取决于训练分布端到端方案在数据充足时确实更强但它解决的是“如何从数据里学出遮挡模式”而卡尔曼滤波解决的是“在没有任何先验知识时如何保持物理一致”。这两件事不冲突实际系统里更常见的组合是用卡尔曼滤波做运动先验和门控用外观特征做重识别两者在关联阶段融合。纯运动模型负责短遮挡15 帧以内外观模型负责长遮挡卡尔曼滤波的协方差恰好提供了“什么时候该切换到外观模式”的判据——这就是 3.2 节那条机制的延伸用法。想验证这套东西有没有真的按你理解的方式工作不需要复杂工具。拿一段带标注的遮挡序列同时记录三条曲线预测中心与真值的像素误差、协方差矩阵位置项的迹、新息残差的模长。正常情况下误差曲线应该和协方差的平方根同量级同步上升新息残差在遮挡发生的头两帧会有一次明显跳变然后归零因为没有观测了。如果误差涨得比协方差快说明 Q 偏小、模型过度自信如果新息残差在正常跟踪段持续偏大说明 R 标定得太乐观或者检测器存在系统性偏移。这三条曲线一起看比任何一个单项指标都能定位问题。我最早做遮挡跟踪时习惯性地把 Q 调到很小觉得“模型越确定越准”结果长遮挡后框飞出去排查了两天才意识到是协方差膨胀不够、卡尔曼增益上不去目标回来时拉不回来。从那以后我每次接新场景都强制先跑一遍上面那三条曲线先确认膨胀速度和真实误差对得上再去调别的参数。希望帮到你。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑