← 返回文章详情

2025.07 - 2025.09 · 嵌入式开发实习生(算法方向)

基于 OpenCV + YOLO 的动态检测-追踪-预测算法

该项目聚焦动态目标追踪:单独用传统视觉算法容易误检,单独用深度模型则时延高。通过混合架构把“速度”和“准确率”结合起来,并输出可直接驱动下位机的控制指令。方案里我重点实现了状态机切换、周期复核和惯性航行,保证短时丢目标时系统不抖死。

  • Python
  • OpenCV
  • YOLO
  • CSRT Tracker
  • ROS2
  • 边缘部署

1. 预测窗口:约 400ms(用于预测性拦截控制) 2. 惯性航行:约 0.5s(目标短时丢失时维持运动) 3. 周期复核:每 10 帧(YOLO 进行身份再确认) 4. 视觉丢失容忍:最多 10 帧(避免短时抖动误重置)

查看仓库

项目背景

1. 来源于机器人实习项目,运行环境存在算力受限和场景动态变化。 2. 目标是让机器人在复杂背景下稳定检测、追踪并预测拦截目标。 3. 代码同时适配开发板与 PC 调试环境,便于联调和复现问题。

相关文档预览

要解决的问题

1. 纯光流响应快但误触发高,容易对无关运动产生反应。 2. 纯 YOLO 检测精度高但推理成本较大,难以保持实时追踪。 3. 目标短时遮挡或丢失后,系统容易出现追踪漂移和控制抖动。

我负责的部分

1. 设计混合检测-追踪方案并封装为可复用 Python 状态机模块。 2. 实现目标丢失容忍、边界检查和周期复核等鲁棒机制。 3. 将视觉输出转换为麦克纳姆轮控制指令,支持预测性拦截。

系统架构

1. 检测阶段:稠密光流做运动区域海选,ROI 内再调用 YOLO 精确识别。 2. 追踪阶段:使用 CSRT 持续跟踪并定期进行 YOLO 身份复核。 3. 控制阶段:基于目标速度向量预测未来位置,输出电机控制映射。 4. 容错阶段:目标短暂丢失时触发惯性航行,提升重新捕获概率。

模块拆解

1. 目标发现模块(_detect_new_target) - 通过稠密光流提取运动掩码并定位候选区域。 - 仅对候选 ROI 运行 YOLO,减少全图推理开销。 2. 目标追踪模块(_track_target) - 使用 CSRT 提供高鲁棒追踪,适应外观变化和部分遮挡。 - 引入视觉丢失容忍、边界静止检查和周期复核三重机制。 3. 控制决策模块(_calculate_mecanum_control) - 引入死区抑制中心抖动,并通过 P 控制器将误差映射为速度分量。 - 完成麦克纳姆轮逆运动学计算,输出标准化速度指令。 4. 状态机主循环(process_frame) - 统一调度检测、追踪、预测、惯性航行等状态切换逻辑。 - 确保每帧都输出可执行的最终控制映射。

关键流程

1. 实时追踪主流程 - 若未进入追踪态,先通过光流定位 ROI,再用 YOLO 确认目标身份。 - 确认目标后切换 CSRT 追踪并持续更新目标速度向量。 - 根据预测时间窗口计算未来目标位置并输出拦截控制指令。 - 若目标短时丢失,启用惯性航行维持上一条有效运动指令。 - 当触发失败检测条件时重置追踪并重新进入发现阶段。

代码级实现要点

1. 状态机封装 把检测、追踪、预测、容错组合到单一入口 process_frame,使外部调用端无需感知复杂内部状态。 2. 三重失败检测 同时监控丢失帧数、边界粘连、周期身份复核,避免追踪框长期“粘”在背景目标上。 3. 预测性控制 不是追当前位置,而是基于速度预测未来约 400ms 落点,提升动态拦截命中概率。

核心亮点

1. 光流海选 + ROI 检测兼顾实时性与精度。 2. CSRT + 周期复核提升复杂场景鲁棒性。 3. 惯性航行机制降低短时丢目标导致的系统抖动。

难点与取舍

1. 高速目标导致极端运动模糊,任何外观匹配方法都会受限。 2. 模型泛化不足时,在复杂背景和光照变化下误检风险上升。

结果与收获

1. 形成可直接复用的独立追踪控制模块,便于接入不同机器人平台。 2. 在边缘设备场景下实现更稳定的实时追踪与控制输出。

后续优化方向

1. 引入更高帧率相机或运动去模糊策略改善极端速度场景。 2. 补充目标重识别策略,提升长时间遮挡后的恢复能力。 3. 建立标准化评测集,对追踪成功率和时延做量化评估。

返回顶部