Skip to content

About

面向资源受限 MCU (OpenMV)的不确定性驱动计算自适应连续视觉跟踪框架

Topics

Resources

Stars

3 stars

Watchers

0 watching

Forks

Repository files navigation

EdgeSentinel — UDCAT

不确定性驱动的计算自适应连续视觉跟踪(Uncertainty-Driven Compute-Adaptive Tracking, UDCAT):在 480MHz 无 NPU 的 MCU 上,以零深度学习推理实现的高频连续视觉目标跟踪框架。

核心闭环:状态 → 不确定性 → 计算 → 观测 → 状态。把算力当预算、把目标不确定性当信号——每帧在固定计算预算内选择「单位算力收益最高」的视觉动作。

English Version

Python License Platform Inference Tests


目录


项目概述

在资源受限 MCU(OpenMV H7 Plus / STM32H743,Cortex-M7 @ 480MHz,无 NPU,~1MB SRAM)上实现实时连续视觉目标跟踪,长期受制于深度学习检测的算力瓶颈:ST-YOLOXn 真机推理 664ms/帧(≈1.5FPS),远低于连续跟踪所需帧率,且神经网络权重无法纳入 MCU 的存储与算力预算。

本项目提出 UDCAT(Uncertainty-Driven Compute-Adaptive Tracking),将目标跟踪建模为 状态 → 不确定性 → 计算 → 观测 → 状态 的闭环控制器:以不确定性为信号、算力为预算,每帧选择「单位算力收益最大」的视觉计算动作,并在信息恢复后回落至低计算强度。UDCAT 由三大机制构成:

  1. 不确定性驱动的计算自适应动作选择——以收益/成本准则 $a^* = \text{argmax}_{a}, \dfrac{\text{E}[\Delta U]}{C(a)}$ 在预算 $B_t$ 内动态选择视觉处理等级(局部小窗 / 扩展多候选 / 增强特征 / 全局重捕获);
  2. 不确定性感知的多候选关联与身份验证——将运动预测、NIS、颜色、尺度、形状等异质证据统一到状态估计,依当前状态动态调整观测源权重;
  3. 预测不确定性驱动的渐进式重捕获——按协方差、运动与失观测时间逐步扩大搜索区域,使系统从短时退化自主恢复到全局重捕获。

在 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 阈值、卡尔曼噪声、规则阈值等参数做相应微调并重新标定,切勿直接沿用默认值。


1. 背景与动机

连续视觉目标跟踪是机器人与自主系统的核心感知能力,但部署在资源受限 MCU 上面临根本性矛盾:高频反馈需要低时延感知,而高算力视觉处理无法满足时延约束。

现状与瓶颈。 深度学习目标检测在目标平台(OpenMV H7 Plus / STM32H743)上实测仅 ≈1.5FPS(ST-YOLOXn int8,664ms/帧),无法支撑连续跟踪所需的 25FPS+ 反馈率;即使降低输入分辨率或量化,时延与内存仍超预算。而纯手工视觉特征(颜色、形状、边缘)虽然算力开销低,却容易受背景干扰、光照变化与目标形态变化影响,导致跟踪漂移或丢失。

观察。 目标跟踪的难度并非恒定:目标稳定可见时,廉价的局部搜索即可胜任;目标被遮挡、快速机动或离开视野时,才需要更昂贵的全局搜索。这意味着计算强度应当随目标状态不确定性自适应分配,而非固定。

核心思想。 UDCAT 将连续跟踪建模为闭环控制器:状态估计的不确定性驱动视觉计算强度的自适应分配,观测结果回写状态。系统是「把算力当预算」的闭环控制,而非固定流水线。

主要贡献:

  1. 不确定性驱动的计算自适应跟踪框架:建立状态不确定性 ↔ 视觉搜索复杂度 ↔ 计算预算的闭环,以收益/成本准则动态选择视觉处理等级(§3.3,Fig. 1)。
  2. 不确定性感知多候选关联机制:将运动预测、NIS、颜色、尺度、形状等异质证据统一到状态估计,并依当前状态动态调整观测源权重(§3.4)。
  3. 预测不确定性驱动的渐进式重捕获机制:按协方差、运动与失观测时间逐步扩大搜索区域,使系统从短时退化自主恢复(§3.5)。
  4. 真机实证:2100 次轨迹回放消融网格 + 真机标定,全程零 NN 推理(§5)。

2. 问题定义

2.1 平台约束

约束 值
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 帧

2.2 符号

符号 含义
$s_t = (c_x, c_y, v_x, v_y, \text{area}, \text{signature})$ 目标状态(位置/速度/面积/身份签名)
$U_t \in [0,1]$ 目标不确定性
$a_t \in {\text{local, expanded, enhanced, global}}$ 视觉计算动作
$C(a)$ / $B_t$ 动作计算成本 / 帧预算
$z_t$ 预测 ROI 内生成的候选观测
NIS 归一化新息平方(马氏距离²)

3. 方法

3.1 闭环框架

UDCAT 将单帧跟踪定义为五元组闭环(Fig. 1):

图 1:UDCAT 闭环。 状态 → 不确定性 → 计算 → 观测 → 状态,动作用例 $a^* = \text{argmax}_{a}, \dfrac{\text{E}[\Delta U]}{C(a)}$,约束 $C(a) \leq B_t$,输出 $y_t = (c_x^{\text{off}}, \det, A)$。

Fig. 1 — UDCAT 闭环

环节 定义
State 目标状态 $s_t$,由自适应卡尔曼滤波维护
Uncertainty 目标不确定性 $U_t \in [0,1]$,由位置协方差、运动突变、观测置信度与连续无观测程度共同刻画
Compute 视觉动作 $a_t$,按单位算力收益在预算内选择
Observation 预测 ROI 内生成的候选 $z_t$,经关联后回写状态

3.2 状态估计与不确定性

状态由自适应卡尔曼滤波(NSA-KF)维护。测量噪声随不确定性自适应放大,使滤波器在高不确定性下更信任预测、在低不确定性下更信任观测:

$$R_t = R_{\text{base}},(1 + k_R,U_t)$$

目标不确定性由四项异质证据加权合成:

$$U_t = w_p,U_t^{\text{pos}} + w_m,U_t^{\text{motion}} + w_o,U_t^{\text{obs}} + w_l,U_t^{\text{lost}}$$

其中 $U_t^{\text{pos}}$ 来自位置协方差、$U_t^{\text{motion}}$ 来自运动突变(NIS)、$U_t^{\text{obs}}$ 来自观测置信度、$U_t^{\text{lost}}$ 来自连续失观测帧数。

3.3 计算自适应动作选择(贡献 1)

视觉动作分为四个等级,各具搜索半径与成本(表 1)。系统每帧在预算 $B_t$ 内选择「单位成本不确定性下降最大」的动作:

$$a_t^* = \text{argmax}_{a}, \frac{\text{E}[\Delta U(a \mid U_t)]}{C(a)} \quad \text{s.t.}\quad C(a) \leq B_t$$

表 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 分量场景歧义 $U_t^{\text{scene}}=f(N_{\text{cand}}, N_{\text{false}})$ 并纳入自适应 NIS 门限 $\tau_t = \tau_0\left(1 + k_u U_t + k_v \Delta v_t + k_s U_t^{\text{scene}}\right)$;动作成本挂硬件 profile $C(a,H)$(重标定成本即重算最优策略)。详细见 docs/udcat-method.md。

3.4 多候选关联与身份验证(贡献 2)

预测 ROI 内生成多个候选观测后,以马氏门控(NIS ≤ $\tau_g$)筛除离群候选,再以综合关联概率聚合异质证据:

$$P_{\text{assoc}}(j) = \sum_{k} w_k(U_t,; \text{motion},; \text{occlusion}),e_k^{(j)}$$

其中 $e_k$ 为各证据(位置 / 运动 / 尺度 / 外观)的关联似然,权重 $w_k$ 依当前不确定性、运动状态与遮挡程度动态调整(如遮挡时降低位置权重、提高外观权重)。

对重捕获/目标切换场景,附加身份验证:候选的颜色/形状签名与目标参考签名一致性低于阈值即拒绝,防止背景干扰物或相似目标抢占轨迹。

3.5 渐进式重捕获(贡献 3)

目标失观测后,系统不立即判定丢失,而是进入渐进式重捕获状态机(track → degraded → reacquire → lost)。搜索半径随协方差、速度与失观测时间增长:

$$r_t = k,\sqrt{\text{tr}(P_t)} + \lambda_v,|v_t| + \lambda_l,N_{\text{lost}}$$

重捕获候选须通过身份 + 运动一致性双重验证才回注轨迹,避免误恢复。当失观测超过窗口 $W_{\max}$ 时进入全局重捕获(global 动作),仍失败则判为 LOST 等待重新初始化。


4. 系统与实现

4.1 硬件与数据流

摄像头采集 → 预测 ROI 内生成 CV 候选(HSV 分割/形态学/轮廓/面积)
→ 多特征关联(NIS 门控 + 动态权重 + 身份验证)
→ 自适应卡尔曼状态估计 → 输出 (cx_offset, detected, area) → UART → STM32
→ 丢失时渐进式重捕获(搜索半径随协方差/速度/失观测时间增长)

4.2 模块架构

依赖方向为有向无环图:perception → association → tracking → symbolic → decision → output,compute 与 reacquisition 旁挂于闭环。核心包见 §9。

4.3 无 numpy 固件移植

固件端(firmware/openmv/)为 MicroPython 无 numpy 移植,与 PC 端语义对齐:

  • MiniKF:4 态常速 KF(对角协方差近似,速度 EMA),含自适应 R、NIS 计算、遮挡期外推;
  • MiniKF_CA:6 态二阶(恒定加速度)KF,每轴 3×3 对称协方差上三角存储,供平滑运动场景切换验证;
  • MiniRules / fuse:STL 规则 R1–R7 的鲁棒性计算与融合(与 PC 端 symbolic 对齐)。

5. 实验

5.1 实验设置

数据。 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 显著性。

5.2 消融研究(Fig. 2)

图 2:消融研究。 (a) 精度-鲁棒性帕累托前沿(x=RMSE,y=保持率,理想区左上);(b) RMSE 柱状;(c) 轨迹保持率;(d) 平均不确定性。误差棒为 ±SEM。

Fig. 2 — 消融研究

表 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⁻¹⁴(高度显著)。

5.3 计算预算敏感性(Fig. 3)

图 3:预算敏感性。 Full UDCAT 在 B=5/10/15/20ms 下的 RMSE、保持率、丢失帧数与平均计算成本(灰色竖条标记 B=5「饥饿」区)。

Fig. 3 — 预算敏感性

表 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 后成功重捕获。

5.4 场景鲁棒性(Fig. 4)

图 4:场景鲁棒性。 Full UDCAT(B=20ms)在 5 种挑战场景下的轨迹保持率与 RMSE。

Fig. 4 — 场景鲁棒性

表 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.5 感知候选基准(Fig. 5)

图 5:感知基准。 6 种红球静态场景的平均候选数与空帧率。

Fig. 5 — 感知基准

结论。 平均候选数 2.9–6.8(充足的多候选池);仅多光照场景(p5)存在 13% 空帧率——HSV 颜色分割的物理极限;其余场景空帧率 0。

5.6 NIS 一致性标定(Fig. 6)

图 6:NIS 一致性标定。 (a) 1312 帧真机数据在 R=8(预标定)与 R=32(标定后)下的 NIS 分布对比 χ²(2) 理论密度与门限 τ_g=15;(b) 一致性率随 R 的扫描曲线。

Fig. 6 — NIS 一致性标定

结论。 恒速模型在滚动球动力学下 NIS p95≈15,门控从理论 $\chi^2_{0.95}(2)=5.991$ 放宽到 15,$R_{\text{base}}$ 从 8 标定到 32。诚实报告:推力滚动球为非平稳过程,χ² 一致性率上限约 0.73,无法达到 0.9 的理论目标。

运动模型对比。 二阶模型 MiniKF_CA(修复 $F P F^{\mathsf{T}}$ 与协方差解包后重测):gate 通过率 0.767 vs 恒速 0.757,中位 |估计−测量| 2.02 vs 8.65px——CA 全面不劣且主要指标更优;PC 侧消融网格仍以恒速为默认,CA 供更平滑运动(真车直线段)验证。

5.7 定性分析(Fig. 7–9)

图 7:遮挡轨迹定性。 (a) 二维轨迹:GT 与 UDACT 估计在遮挡期间外推漂移、遮挡结束后重捕获;(b) 逐帧跟踪误差与遮挡窗口。

Fig. 7 — 遮挡轨迹

图 8:闭环自适应机制。 同一条遮挡轨迹(B=10ms)上,失观测导致不确定性上升 → 计算动作从 local(2ms) 升级到 expanded(6ms) → 搜索半径从 15px 增长至 30px → 帧 55 重捕获后回落(虚线标记升级/恢复时刻)。

Fig. 8 — 闭环自适应

图 9:恢复机制对比。 同一条遮挡轨迹:B=5ms(预算饥饿)搜索半径被限制在 15px 无法恢复;B=10ms 半径增长至 30px 并成功重捕获——预算—动作—半径耦合的直接证据。

Fig. 9 — 恢复机制对比


6. 参数标定

所有核心参数均由真机数据离线标定,标定集与评估集严格分离:

参数 值 标定依据
$R_{\text{base}}$ 32 1312 帧真机滚动球数据 NIS 扫描(§5.6)
$\tau_g$ 15 真机 NIS p95(理论 χ²₀.₉₅(2)=5.991 不适用)
$W_{\max}$ 20 55 次真实丢失事件 p90 恢复时长
$\varepsilon_{\text{reacq}}$ 90 run_102 长遮挡重捕获跳变 p95=60px,取 1.5× 裕量
$J_{\max}$ 60 帧间跳变容忍
hsv_s_min / v_min 40 多光照低饱和球召回标定
costs_ms local 1 / exp 3 / enh 8 / global 15 视觉动作实测成本

7. 复现

数据契约。 每次实验运行落盘 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

8. 局限性与诚实声明

  • 输出接口冻结:(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、摄像头或软件栈时,需按实际环境微调阈值与参数并重新标定。

9. 仓库结构

算法核心(src/udcat/)

子包 职责 关键符号
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

固件(firmware/openmv/,MicroPython 无 numpy)

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 项单元/集成/兼容/回归测试

10. 快速开始

# 安装 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.py

MCU 端运行配置(firmware/openmv/main.py 顶部):RUN_MODE(heartbeat/debug/collect)、SCENARIO(smooth/occlusion/noise/switch/mixed)、MODE(synthetic/real)。


11. 许可

MIT License,Copyright (c) 2026 Lycorius03。

About

面向资源受限 MCU (OpenMV)的不确定性驱动计算自适应连续视觉跟踪框架

Topics

Resources

Stars

3 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages