不确定性驱动的计算自适应连续视觉跟踪(Uncertainty-Driven Compute-Adaptive Tracking, UDCAT):在 480MHz 无 NPU 的 MCU 上,以零深度学习推理实现的高频连续视觉目标跟踪框架。
核心闭环:
状态 → 不确定性 → 计算 → 观测 → 状态。把算力当预算、把目标不确定性当信号——每帧在固定计算预算内选择「单位算力收益最高」的视觉动作。
在资源受限 MCU(OpenMV H7 Plus / STM32H743,Cortex-M7 @ 480MHz,无 NPU,~1MB SRAM)上实现实时连续视觉目标跟踪,长期受制于深度学习检测的算力瓶颈:ST-YOLOXn 真机推理 664ms/帧(≈1.5FPS),远低于连续跟踪所需帧率,且神经网络权重无法纳入 MCU 的存储与算力预算。
本项目提出 UDCAT(Uncertainty-Driven Compute-Adaptive Tracking),将目标跟踪建模为 状态 → 不确定性 → 计算 → 观测 → 状态 的闭环控制器:以不确定性为信号、算力为预算,每帧选择「单位算力收益最大」的视觉计算动作,并在信息恢复后回落至低计算强度。UDCAT 由三大机制构成:
-
不确定性驱动的计算自适应动作选择——以收益/成本准则
$a^* = \text{argmax}_{a}, \dfrac{\text{E}[\Delta U]}{C(a)}$ 在预算$B_t$ 内动态选择视觉处理等级(局部小窗 / 扩展多候选 / 增强特征 / 全局重捕获); - 不确定性感知的多候选关联与身份验证——将运动预测、NIS、颜色、尺度、形状等异质证据统一到状态估计,依当前状态动态调整观测源权重;
- 预测不确定性驱动的渐进式重捕获——按协方差、运动与失观测时间逐步扩大搜索区域,使系统从短时退化自主恢复到全局重捕获。
在 2100 次真机轨迹回放实验(4 条真机轨迹 × 5 场景 × 5 预算 × 7 消融阶段 × 3 随机种子)上,UDCAT 将跟踪误差从朴素基线的 54.2px 降至 5.8px(−89%),在遮挡、目标切换等挑战场景保持 ≥0.86 的轨迹保持率;B=5ms 预算下系统退化(保持率 0.715),B≥10ms 饱和(保持率 0.869);全过程零深度学习推理、零神经网络训练,核心参数全部由真机数据离线标定。
硬件适用范围:本项目所有标定参数、实验数据与运行结果均基于本地硬件环境(OpenMV H7 Plus / STM32H743,Cortex-M7 @ 480MHz,固件 v5.0.0,OV5640 csi 摄像头)。若迁移到其他 MCU、摄像头或软件栈,需根据实际硬件与软件对 HSV 阈值、卡尔曼噪声、规则阈值等参数做相应微调并重新标定,切勿直接沿用默认值。
连续视觉目标跟踪是机器人与自主系统的核心感知能力,但部署在资源受限 MCU 上面临根本性矛盾:高频反馈需要低时延感知,而高算力视觉处理无法满足时延约束。
现状与瓶颈。 深度学习目标检测在目标平台(OpenMV H7 Plus / STM32H743)上实测仅 ≈1.5FPS(ST-YOLOXn int8,664ms/帧),无法支撑连续跟踪所需的 25FPS+ 反馈率;即使降低输入分辨率或量化,时延与内存仍超预算。而纯手工视觉特征(颜色、形状、边缘)虽然算力开销低,却容易受背景干扰、光照变化与目标形态变化影响,导致跟踪漂移或丢失。
观察。 目标跟踪的难度并非恒定:目标稳定可见时,廉价的局部搜索即可胜任;目标被遮挡、快速机动或离开视野时,才需要更昂贵的全局搜索。这意味着计算强度应当随目标状态不确定性自适应分配,而非固定。
核心思想。 UDCAT 将连续跟踪建模为闭环控制器:状态估计的不确定性驱动视觉计算强度的自适应分配,观测结果回写状态。系统是「把算力当预算」的闭环控制,而非固定流水线。
主要贡献:
- 不确定性驱动的计算自适应跟踪框架:建立状态不确定性 ↔ 视觉搜索复杂度 ↔ 计算预算的闭环,以收益/成本准则动态选择视觉处理等级(§3.3,Fig. 1)。
- 不确定性感知多候选关联机制:将运动预测、NIS、颜色、尺度、形状等异质证据统一到状态估计,并依当前状态动态调整观测源权重(§3.4)。
- 预测不确定性驱动的渐进式重捕获机制:按协方差、运动与失观测时间逐步扩大搜索区域,使系统从短时退化自主恢复(§3.5)。
- 真机实证:2100 次轨迹回放消融网格 + 真机标定,全程零 NN 推理(§5)。
| 约束 | 值 |
|---|---|
| MCU | Cortex-M7 @ 480MHz,无 NPU |
| 内存 | ~1MB SRAM + 32MB SDRAM |
| 帧率目标 | ≥ 25 FPS(40ms/帧预算) |
| 视觉预算 | 5–20 ms/帧(留给 CV 处理) |
| 数值约束 | 固件端无 numpy(纯 Python/MicroPython 标量运算) |
| 输出接口 | 冻结三元组 (cx_offset, detected, area) 经 7 字节 UART 帧 |
| 符号 | 含义 |
|---|---|
| 目标状态(位置/速度/面积/身份签名) | |
| 目标不确定性 | |
| 视觉计算动作 | |
|
|
动作计算成本 / 帧预算 |
| 预测 ROI 内生成的候选观测 | |
NIS |
归一化新息平方(马氏距离²) |
UDCAT 将单帧跟踪定义为五元组闭环(Fig. 1):
图 1:UDCAT 闭环。 状态 → 不确定性 → 计算 → 观测 → 状态,动作用例
| 环节 | 定义 |
|---|---|
| State | 目标状态 |
| Uncertainty | 目标不确定性 |
| Compute | 视觉动作 |
| Observation | 预测 ROI 内生成的候选 |
状态由自适应卡尔曼滤波(NSA-KF)维护。测量噪声随不确定性自适应放大,使滤波器在高不确定性下更信任预测、在低不确定性下更信任观测:
目标不确定性由四项异质证据加权合成:
其中
视觉动作分为四个等级,各具搜索半径与成本(表 1)。系统每帧在预算
表 1:计算动作等级。
| 动作 | 搜索半径 | 成本 |
|---|---|---|
| local | 15px | 1ms |
| expanded | 30px | 3ms |
| enhanced | 60px | 8ms |
| global | 120px | 15ms |
动作的选择同时约束视觉搜索范围(ACTION_MAX_RADIUS 上限),形成「预算 → 动作 → 搜索半径」的耦合:预算不足时选择器只能执行廉价动作,搜索半径受限,重捕获失败;预算充足时按价值最优选择。该机制的收益/成本表由真机数据离线标定(§6)。
计算—感知协同自适应(2026-08-23 扩展):不确定性进一步协同驱动感知验证深度与重捕获策略——感知按三级渐进(L1 HSV 快速筛选 / L2 几何验证 / L3 多证据评分)随动作升级;不确定性加入第 5 分量场景歧义 docs/udcat-method.md。
预测 ROI 内生成多个候选观测后,以马氏门控(NIS ≤
其中
对重捕获/目标切换场景,附加身份验证:候选的颜色/形状签名与目标参考签名一致性低于阈值即拒绝,防止背景干扰物或相似目标抢占轨迹。
目标失观测后,系统不立即判定丢失,而是进入渐进式重捕获状态机(track → degraded → reacquire → lost)。搜索半径随协方差、速度与失观测时间增长:
重捕获候选须通过身份 + 运动一致性双重验证才回注轨迹,避免误恢复。当失观测超过窗口 global 动作),仍失败则判为 LOST 等待重新初始化。
摄像头采集 → 预测 ROI 内生成 CV 候选(HSV 分割/形态学/轮廓/面积)
→ 多特征关联(NIS 门控 + 动态权重 + 身份验证)
→ 自适应卡尔曼状态估计 → 输出 (cx_offset, detected, area) → UART → STM32
→ 丢失时渐进式重捕获(搜索半径随协方差/速度/失观测时间增长)
依赖方向为有向无环图:perception → association → tracking → symbolic → decision → output,compute 与 reacquisition 旁挂于闭环。核心包见 §9。
固件端(firmware/openmv/)为 MicroPython 无 numpy 移植,与 PC 端语义对齐:
- MiniKF:4 态常速 KF(对角协方差近似,速度 EMA),含自适应 R、NIS 计算、遮挡期外推;
- MiniKF_CA:6 态二阶(恒定加速度)KF,每轴 3×3 对称协方差上三角存储,供平滑运动场景切换验证;
- MiniRules / fuse:STL 规则 R1–R7 的鲁棒性计算与融合(与 PC 端
symbolic对齐)。
数据。 1000 张红球静态图(data/ball_dataset/,6 场景)用于 HSV 标定与感知鲁棒性测试;1033 帧真机滚动球时序(data/ball_video/,4 条真机轨迹)用于连续跟踪与消融实验。
协议。 消融网格为 4 轨迹 × 5 场景 × 5 预算 × 7 阶段 × 3 种子 = 2100 次独立运行;每次运行落盘完整 6 文件数据契约(experiments/storage.py)。消融在各阶段**同一设计预算(B=20ms)**下对齐比较(避免混入预算维度)。
诚实性。 回放实验的真值轨迹为脚本化代理(proxy labels,非人工标注),但候选测量统计来自真机数据;本文档如实标注(§8)。
指标。 轨迹保持率 retention(关联成功帧占比)、跟踪误差 RMSE (px)、丢失帧数、平均计算成本、平均不确定性、配对 Wilcoxon 显著性。
图 2:消融研究。 (a) 精度-鲁棒性帕累托前沿(x=RMSE,y=保持率,理想区左上);(b) RMSE 柱状;(c) 轨迹保持率;(d) 平均不确定性。误差棒为 ±SEM。
表 2:消融结果(B=20ms,每阶段 60 次运行)。
| 阶段 | 保持率 | RMSE (px) | 平均不确定性 | 说明 |
|---|---|---|---|---|
| B0 最大 blob | 0.947 | 54.2 | 0.500 | 锁定背景干扰物,误差大 |
| B1 +KF | 0.947 | 55.5 | 0.500 | 平滑了错误目标 |
| B2 +关联 | 0.388 | 13.95 | 0.249 | 拒绝干扰物,但丢失轨迹 |
| B3 +身份 | 0.372 | 11.00 | 0.274 | 拒绝相似目标,仍无恢复 |
| B4 +自适应 ROI | 0.820 | 6.37 | 0.158 | 恢复部分轨迹 |
| B5 +渐进重捕获 | 0.884 | 5.62 | 0.150 | 失观测增长半径,恢复提升 |
| Full UDCAT | 0.869 | 5.77 | 0.151 | 计算自适应 + 全机制 |
结论。 B0/B1 保持率高但误差大——它们锁定的是背景干扰物而非目标;UDCAT 组件依次消解该问题:关联把误差降到 11–14px 但丢失轨迹,身份与渐进重捕获在保持低误差的同时把保持率恢复到 0.87–0.88。B0 与 Full 的 RMSE 配对 Wilcoxon 检验 p = 5.3×10⁻¹⁴(高度显著)。
图 3:预算敏感性。 Full UDCAT 在 B=5/10/15/20ms 下的 RMSE、保持率、丢失帧数与平均计算成本(灰色竖条标记 B=5「饥饿」区)。
表 3:预算敏感性(Full UDCAT)。
| 预算 | RMSE (px) | 保持率 | 丢失帧 | 计算成本 (ms) |
|---|---|---|---|---|
| 5 ms | 8.60 | 0.715 | 70.5 | 2.0 |
| 10 ms | 5.77 | 0.869 | 27.9 | 2.15 |
| 15 ms | 5.77 | 0.869 | 27.9 | 2.15 |
| 20 ms | 5.77 | 0.869 | 27.9 | 2.15 |
结论。 B=5ms 时预算「饥饿」选择器:仅廉价动作可行,搜索半径被 ACTION_MAX_RADIUS 上限卡死,重捕获失败(保持率 0.715);B≥10ms 时选择器以最低成本动作(local,2ms)即达价值最优,指标饱和。机制级证据见 Fig. 8/9——同一条遮挡轨迹上,B=5ms 半径被限制在 15px 无法恢复,B=10ms 半径增长至 30px 后成功重捕获。
图 4:场景鲁棒性。 Full UDCAT(B=20ms)在 5 种挑战场景下的轨迹保持率与 RMSE。
表 4:场景鲁棒性(Full UDCAT @ B=20ms)。
| 场景 | 保持率 | RMSE (px) |
|---|---|---|
| Smooth | 0.991 | 4.34 |
| Switch | 0.959 | 4.35 |
| Occlusion | 0.893 | 5.05 |
| Mixed | 0.861 | 5.27 |
| Noise | 0.642 | 9.84 |
结论。 平滑与目标切换场景保持率 ≥0.95;遮挡(周期性不可见)保持 0.89;混合场景 0.86;噪声场景(额外虚假候选 + 大测量抖动)下降到 0.64——识别的失效模式,为渐进重捕获参数标定提供依据。
图 5:感知基准。 6 种红球静态场景的平均候选数与空帧率。
结论。 平均候选数 2.9–6.8(充足的多候选池);仅多光照场景(p5)存在 13% 空帧率——HSV 颜色分割的物理极限;其余场景空帧率 0。
图 6:NIS 一致性标定。 (a) 1312 帧真机数据在 R=8(预标定)与 R=32(标定后)下的 NIS 分布对比 χ²(2) 理论密度与门限 τ_g=15;(b) 一致性率随 R 的扫描曲线。
结论。 恒速模型在滚动球动力学下 NIS p95≈15,门控从理论
运动模型对比。 二阶模型 MiniKF_CA(修复
图 7:遮挡轨迹定性。 (a) 二维轨迹:GT 与 UDACT 估计在遮挡期间外推漂移、遮挡结束后重捕获;(b) 逐帧跟踪误差与遮挡窗口。
图 8:闭环自适应机制。 同一条遮挡轨迹(B=10ms)上,失观测导致不确定性上升 → 计算动作从 local(2ms) 升级到 expanded(6ms) → 搜索半径从 15px 增长至 30px → 帧 55 重捕获后回落(虚线标记升级/恢复时刻)。
图 9:恢复机制对比。 同一条遮挡轨迹:B=5ms(预算饥饿)搜索半径被限制在 15px 无法恢复;B=10ms 半径增长至 30px 并成功重捕获——预算—动作—半径耦合的直接证据。
所有核心参数均由真机数据离线标定,标定集与评估集严格分离:
| 参数 | 值 | 标定依据 |
|---|---|---|
| 32 | 1312 帧真机滚动球数据 NIS 扫描(§5.6) | |
| 15 | 真机 NIS p95(理论 χ²₀.₉₅(2)=5.991 不适用) | |
| 20 | 55 次真实丢失事件 p90 恢复时长 | |
| 90 | run_102 长遮挡重捕获跳变 p95=60px,取 1.5× 裕量 | |
| 60 | 帧间跳变容忍 | |
hsv_s_min / v_min |
40 | 多光照低饱和球召回标定 |
costs_ms |
local 1 / exp 3 / enh 8 / global 15 | 视觉动作实测成本 |
数据契约。 每次实验运行落盘 6 文件原子契约(experiments/storage.py):run_meta.json、experiment_meta.json(含 git revision + config hash)、data_schema.json、frame_log.csv/.jsonl(逐帧 70+ 字段)、summary_statistics.json、anomalies.json。回放网格聚合见 experiments/runs/<batch>/analysis_grid_summary.json。
渲染论文图。 9 张图由 experiments/plot_paper.py 生成(PYTHONPATH=src python -m experiments.plot_paper),关键数字可在其 stdout 审计输出中复核。
重跑消融网格:
PYTHONPATH=src python -m experiments.realdata --data-dir data/ball_video \
--experiments b0_blob,b1_blob_kalman,b2_association,b3_identity,b4_adaptive_roi,b5_progressive_reacquisition,full_udcat \
--budgets 5,10,15,20 --scenarios smooth,occlusion,switch,noise,mixed --seeds 42,7,2024- 输出接口冻结:
(cx_offset, detected, area)+ 7 字节 UART 帧,output/uart.py标 FROZEN 不可改。 - 代理轨迹:消融/预算/场景实验的真值为脚本化代理(proxy labels),但候选测量统计来自真机数据;引用本项目数据时须如实标注。
- NIS 一致性上限:推力滚动球为非平稳过程,χ² 一致性率无法达到 0.9 理论目标(实测上限约 0.73)。
- 场景标定依赖:多光照空帧率 13% 为 HSV 颜色分割物理极限,需 LAB 空间或深度特征补足(超出当前实时约束)。
- 数据泄漏禁止:标定集与评估集严格分离,由
storage.py契约强制。 - 硬件/软件相关:标定参数与实验结果基于本地硬件(OpenMV H7 Plus,固件 v5.0.0);迁移到其他 MCU、摄像头或软件栈时,需按实际环境微调阈值与参数并重新标定。
| 子包 | 职责 | 关键符号 |
|---|---|---|
core |
类型/常量/配置/日志/状态/不确定性 | TrackEstimate, Uncertainty, config.py |
perception |
经典 CV 候选生成(HSV/形态学/轮廓/面积/评分) | area_estimator, color_score, shape_score, cv_fallback |
association |
多候选关联:NIS 门控 + 动态权重 + 身份验证 | Candidate, MultiCandidateAssociator |
tracking |
自适应卡尔曼(NSA-KF)+ 门控 + 遮挡外推 | AdaptiveKalmanFilter, gating.py |
compute |
计算动作选择器(贡献 1) | ComputeAction, ComputeActionSelector |
reacquisition |
渐进式重捕获(贡献 3) | ReacquisitionStage, ProgressiveReacquisition |
symbolic |
五维离散化 + STL 规则 R1-R7 + 融合 | rules.py, fusion.py, target_switch.py |
decision |
五层过滤 + FSM + APF 避障 | five_layer_filter.py, fsm.py, apf.py |
output |
UART 输出(冻结协议) | UARTProtocol, FrameEncoder |
calibration |
红球 HSV/规则阈值标定 + NIS 一致性 + KF 参数 | calibrate_r.py, nis_consistency.py |
pipeline.py |
UDCAT 顶层编排 | UDCATPipeline, PipelineConfig, ACTION_MAX_RADIUS |
main.py(入口)/ mini_pipeline.py(MiniKF/MiniKF_CA/MiniRules/fuse)/ hybrid_tracker.py / data_collector.py / camera.py / board_config.py / uart_protocol.py / scenarios.py / heartbeat.py / calib_collect.py。
| 目录 | 职责 |
|---|---|
tools/device/ |
设备操作(openmv_repl.py) |
tools/capture/ |
数据采集(VCP 直传 openmv_capture.py) |
tools/parsing/ |
解析(sd_parser.py) |
tools/deployment/ |
部署(deploy_modules.py / deploy_firmware.py) |
tools/validation/ |
跨平台冒烟测试 |
experiments/ |
runner.py / realdata.py / storage.py / analyze_grid.py / plot_paper.py + plot_style.py |
configs/ |
thresholds.yaml(唯一权威参数源) |
figures/ |
论文图集(PDF 矢量 + PNG 300dpi) |
tests/ |
182 项单元/集成/兼容/回归测试 |
# 安装 PC 侧开发包(含可视化绘图依赖)
python -m pip install -e ".[dev,vision,plot]"
# 全量测试
python -m pytest -q
# 渲染 9 张论文图(输出到 figures/)
PYTHONPATH=src python -m experiments.plot_paper
# OpenMV 设备操作(用 OPENMV_PORT 环境变量指向你的设备串口)
OPENMV_PORT=<serial-port> python tools/device/openmv_repl.py probe
OPENMV_PORT=<serial-port> python tools/deployment/deploy_modules.pyMCU 端运行配置(firmware/openmv/main.py 顶部):RUN_MODE(heartbeat/debug/collect)、SCENARIO(smooth/occlusion/noise/switch/mixed)、MODE(synthetic/real)。
MIT License,Copyright (c) 2026 Lycorius03。








