尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

Face-Track-Detect-Extract的卡尔曼滤波深入解读:7维状态向量与匀速运动模型从原理到代码

Face-Track-Detect-Extract的卡尔曼滤波深入解读:7维状态向量与匀速运动模型从原理到代码 Face-Track-Detect-Extract的卡尔曼滤波深入解读7维状态向量与匀速运动模型从原理到代码【免费下载链接】Face-Track-Detect-Extract Detect , track and extract the optimal face in multi-target faces (exclude side face and select the optimal face).项目地址: https://gitcode.com/gh_mirrors/fa/Face-Track-Detect-ExtractFace-Track-Detect-Extract 是一个基于 SORT 算法 MTCNN 的人脸检测、追踪与提取开源项目能在多人视频里锁定目标并抠出最佳正脸。 本文带你从零基础上手读懂它的核心引擎——卡尔曼滤波器Kalman Filter什么是7 维状态向量、为什么用匀速运动模型预测人脸轨迹以及如何把这些原理逐行落到项目代码里让你真正搞懂跳帧检测时追踪依然不飘的秘密。为什么人脸追踪离不开卡尔曼滤波先想一个场景MTCNN 检测器算力开销不小项目里可以设置detect_interval让检测器每隔几帧才工作一次中间帧全靠猜。猜的依据是什么目标在下一帧大概还在原位置附近且运动是连续的。卡尔曼滤波干的就是这件事预测predict没有新检测时用运动模型外推出目标应该在哪更新update有新检测时把预测值和观测值按各自可信度加权融合。结果就是检测稀疏、目标短暂被遮挡时追踪框依然平滑连续这正是 start.py 里每隔若干帧才调用一次 MTCNN、追踪框却不掉链子的原因。SORT 算法全景检测 → 关联 → 预测SORTSimple Online and Realtime Tracking由三步组成项目中的分工如下步骤做什么对应源码① 人脸检测MTCNN 输出人脸框align/detect_face.py② 数据关联用 IoU 匈牙利算法把检测框和已有轨迹配对src/data_association.py③ 状态预测/更新卡尔曼滤波维护每个目标轨迹src/kalman_tracker.py关联逻辑在src/sort.py的Sort.update中先让所有现有追踪器predict()一步再和本帧检测算 IoU 矩阵IoU 高于 0.25 的配对成功配对失败的检测框会新建追踪器即分配新 ID长期失联的轨迹则被剔除并落盘保存。7 维状态向量怎么读[cx, cy, s, r, vx, vy, vs]打开src/kalman_tracker.pyKalmanBoxTracker的第一行关键代码是self.kf KalmanFilter(dim_x7, dim_z4)dim_x7表示内部状态向量有 7 维dim_z4表示观测向量只有 4 维——检测器只能看到位置速度是看不见的必须靠模型推出来。7 个分量分别是什么下标分量含义0cx人脸框中心点 x坐标1cy人脸框中心点 y坐标2s面积宽 × 高代表人脸大小/远近3r宽高比w / h代表人脸姿态4vx中心点水平速度5vy中心点垂直速度6vs面积变化率靠近/远离镜头检测框[x1, y1, x2, y2]会先经convert_bbox_to_z转成中心表示[cx, cy, s, r]这就是 4 维观测向量的来源反向转换由convert_x_to_bbox完成用w sqrt(s*r)、h s/w还原宽高。为什么用面积宽高比而不是宽高面积 s单调、非负能直接表达人走近了/走远了比宽高两个独立量更紧凑宽高比 r对人脸这种形状相对稳定还能隐含姿态信息侧脸时 r 会明显变化两量相乘/相除即可无损还原宽高信息没有损失表达更优雅。观测矩阵 H为什么只有 4 维可观测H 矩阵是一个 4×7 的矩阵左上角是单位阵、其余补零self.kf.H np.array( [[1, 0, 0, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0, 0], [0, 0, 1, 0, 0, 0, 0], [0, 0, 0, 1, 0, 0, 0]])它的含义一句话观测 状态向量的前 4 维位置与形状后 3 维速度是隐变量。这也是为什么初始时项目要人为放大速度维的不确定性后文详述。匀速运动模型状态转移矩阵 FSORT 采用匀速恒速模型Constant Velocity Model假设相邻两帧之间目标以恒定速度平移、面积以恒定速率变化。对应到代码里的 F 矩阵7×7self.kf.F np.array( [[1, 0, 0, 0, 1, 0, 0], [0, 1, 0, 0, 0, 1, 0], [0, 0, 1, 0, 0, 0, 1], [0, 0, 0, 1, 0, 0, 0], [0, 0, 0, 0, 1, 0, 0], [0, 0, 0, 0, 0, 1, 0], [0, 0, 0, 0, 0, 0, 1]])逐行翻译成人话第 1、2 行cx cx vx、cy cy vy→ 位置 旧位置 速度 × 时间步时间步取 1 帧第 3 行s s vs→ 面积按变化率增减人走近时 s 增大第 4 行r r→ 宽高比假设不变人脸比例短期稳定第 5~7 行速度分量保持不变 → 这正是匀速二字的数学表达。 人脸在视频里通常缓慢平移匀速假设误差很小模型的不确定性则交给过程噪声 Q 去兜底。卡尔曼滤波两大步predict 与 updateKalmanBoxTracker只暴露两个核心方法对应滤波器的两个循环阶段① predict每帧必做def predict(self): if (self.kf.x[6] self.kf.x[2]) 0: self.kf.x[6] * 0.0 self.kf.predict() ... return self.history[-1][0]先用 F 矩阵外推状态、用 Q 更新协方差 P第一处if是个巧妙的防退化保护若当前面积 面积变化率 ≤ 0说明模型正在预测人脸缩成一个点目标即将消失此时把 vs 清零避免面积变负导致宽高计算出现 NaN外推出的框会存入history供关联阶段使用。② update有匹配检测才做def update(self, bbox): self.time_since_update 0 self.hits 1 self.hit_streak 1 if bbox ! []: self.kf.update(convert_bbox_to_z(bbox))当某帧没检测到该目标bbox []只做空更新重置连续命中计数hit_streak累加time_since_update。在src/sort.py里time_since_update max_age默认 1的轨迹会被直接淘汰——所以人脸一旦离开画面ID 很快就会释放。项目里三处关键调参初值不确定性、R 与 Q新手最容易困惑的是__init__里这几行魔数它们全部服务于冷启动self.kf.R[2:, 2:] * 10. # 观测噪声 self.kf.P[4:, 4:] * 1000. # 速度初值不确定性 self.kf.P * 10. # 位置初值不确定性 self.kf.Q[-1, -1] * 0.01 self.kf.Q[4:, 4:] * 0.01 # 过程噪声P[4:, 4:] * 1000追踪器刚创建时速度完全未知故意把速度维协方差放大 1000 倍表示我对速度一无所知。这样前几帧的观测就能快速把速度拽出来收敛更快R[2:, 2:] * 10面积和宽高比的观测噪声比位置大检测框抖动主要发生在边缘s、r 是二阶量对位置更信观测Q[4:, 4:] * 0.01过程噪声压得很小 强烈相信速度是恒定的模型平滑、抗抖。另外项目还加了一个predict_num字段注释解决画面中无人脸检测到时而导致的原有追踪器人像预测漂移 bug连续detect_interval帧都靠纯预测撑着的轨迹会被强制删除防止幽灵轨迹越飘越远——这是对原版 SORT 的一处实用修正。快速上手运行人脸追踪与最佳人脸提取环境依赖见requirements.txtPython 3.5、TensorFlow、MTCNN、FilterPy、NumPy、OpenCV 等克隆仓库git clone https://gitcode.com/gh_mirrors/fa/Face-Track-Detect-Extract默认处理videos/目录下的视频一行命令启动python3 start.py常用参数均在start.py的parse_args中定义--detect_interval每隔几帧检测一次性能与流畅度的平衡旋钮默认 1--face_score_threshold人脸置信度阈值0~1默认 0.85--margin人脸框外扩边距视频里脸大时可调大方便追踪--face_landmarks在提取的人脸上绘制 5 点关键点--no_display无界面模式适合服务器批量跑。跑完后每条轨迹的最佳正脸lib/utils.py的save_to_file会按dist_rate 1.4等指标过滤侧脸会保存为 JPEG 到facepics/目录可直接作为 CNN 训练集或送入后端做人脸识别。常见问题 FAQQ1为什么速度维初始不确定性要乘 1000 这么大因为速度不可观测H 矩阵看不到它。初始 P 太小会让滤波器固执地相信一个错误的随机初值放大后前几次观测即可把速度估计拉到合理范围。Q2detect_interval 调大追踪会崩吗间隔越大纯预测帧越多轨迹越依赖匀速假设。项目用predict_num上限兜底连续预测超过检测间隔就删轨迹所以宁可丢 ID 也不留幽灵框。Q3和 DeepSORT 有什么区别SORT 仅用运动模型卡尔曼 IoU 关联DeepSORT 额外引入外观特征做深度关联遮挡后 ID 保持能力更强。本项目场景是人脸检测提取MTCNN 本身检测稳定SORT 已足够且更快。Q4想改状态空间怎么办只需同步修改src/kalman_tracker.py中的dim_x、F、H 和两个转换函数convert_bbox_to_z/convert_x_to_bbox例如把宽高比 r 的恒定假设改成匀速变化就是给 r 增加一个速度分量维度升到 8。总结卡尔曼滤波在 Face-Track-Detect-Extract 中是追踪的记忆与预测核心检测稀疏时靠匀速模型外推检测到来时靠贝叶斯式加权融合7 维状态向量 位置 形状 速度其中 4 维可观测位置、面积、宽高比、3 维靠推vx、vy、vsF 矩阵编码匀速平移 面积匀速变化 宽高比恒定三个假设是整条平滑轨迹的数学根基项目对原版 SORT 的两处修正——面积非负保护与predict_num 防漂移——都是生产环境里踩过坑的痕迹值得借鉴。读懂这一套你就掌握了 SORT / DeepSORT 乃至大多数检测 滤波追踪框架的通用骨架后续拓展到行人、车辆追踪同理可推。【免费下载链接】Face-Track-Detect-Extract Detect , track and extract the optimal face in multi-target faces (exclude side face and select the optimal face).项目地址: https://gitcode.com/gh_mirrors/fa/Face-Track-Detect-Extract创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表