office_gzweb/docs/VLM_INTEGRATION.md

4.9 KiB
Raw Blame History

VLM GPU 视觉识别集成方案

在保留现有 YOLOv8 CPU 识别的基础上,增加运行时选项启用 GPU 本地 VLM 模型,用于 Gazebo office 场景机器人巡检与摄像头目标识别。


一、模型选型

模型 参数量 显存需求 推理速度* 中文 视觉定位 许可证
Qwen2.5-VL-3B-Instruct 3B ~8-10GB (BF16) 2-4s/帧 原生 bbox Apache-2.0
Qwen2.5-VL-3B-AWQ 3B ~3-4GB (INT4) 1.5-3s/帧 原生 bbox Apache-2.0
MiniCPM-V 2.6 8B ~17GB / ~7GB(INT4) 3-6s/帧 原生 bbox 学术/商用

*推理速度:单张 640×480 图像,生成 80-120 tokensNVIDIA T4 估算值

推荐Qwen2.5-VL-3B-Instruct (BF16)

  • 3B 参数性价比最高T4 16GB 刚好跑得动
  • 原生支持中文视觉定位(<|box_start|>(x1,y1),(x2,y2)<|box_end|>
  • 支持结构化 JSON 输出,便于解析为 ROS2 Detection2DArray
  • Apache-2.0 许可证,无商用限制

二、三种运行时模式

# 模式 AYOLOv8 CPU默认完全兼容原有行为
./run_all.sh mapping --explore --vision

# 模式 BVLM GPU异步推理避免阻塞 Nav2
VISION_BACKEND=vlm ./run_all.sh mapping --explore --vision

# 模式 C混合模式 — YOLO 持续检测 + VLM 每 10s 深度分析
VISION_BACKEND=hybrid VLM_INTERVAL=10.0 ./run_all.sh mapping --explore --vision

环境变量

变量 默认值 说明
VISION_BACKEND yolo yolo / vlm / hybrid
VLM_INTERVAL 5.0 VLM 采样间隔(秒)
VLM_MODEL Qwen/Qwen2.5-VL-3B-Instruct 模型名称
VLM_MAX_NEW_TOKENS 256 最大生成 token 数
VLM_PROMPT (内置) 自定义提示词
VLM_MIN_PIXELS 200704 图像最小像素256×28×28
VLM_MAX_PIXELS 501760 图像最大像素640×28×28

三、安装部署

3.1 安装依赖GPU 容器内执行)

bash scripts/install_vlm.sh

该脚本会自动:

  • 检测 CUDA 环境,按需安装 PyTorch 2.1.2+cu121
  • 安装 transformers、accelerate、qwen-vl-utils
  • Ampere 架构 GPU 自动安装 Flash Attention 2
  • 预下载 Qwen2.5-VL-3B-Instruct 模型(约 6-8GB缓存到 EFS

3.2 验证安装

python3 -c "import torch; print(torch.cuda.is_available(), torch.cuda.get_device_name(0))"

3.3 启动测试

# YOLO 模式(默认)
./run_all.sh mapping --explore --vision

# VLM 模式
VISION_BACKEND=vlm VLM_INTERVAL=5.0 ./run_all.sh mapping --explore --vision

# 查看 VLM 场景描述
ros2 topic echo /vision/scene_description

四、硬件与成本

推荐 GPU 实例AWS 中国)

实例 GPU 显存 按需/小时 适用性
g4dn.xlarge T4 16GB ~¥3.8 最佳性价比
g5.xlarge A10G 24GB ~¥7.2 性能冗余

显存占用

组件 显存
Qwen2.5-VL-3B BF16 权重 ~6.5GB
ViT 视觉编码器 ~1.5GB
KV Cache ~0.5GB
激活/中间结果 ~1-2GB
总计 ~10-11GB

若显存不足,可切换至 AWQ 量化版:export VLM_MODEL=Qwen/Qwen2.5-VL-3B-Instruct-AWQ


五、架构要点

VLM 异步推理

VLM 单帧推理需 2-5 秒,若在 ROS2 回调中同步执行会阻塞 Nav2。detector.py 在 VLM 模式下自动使用后台线程执行推理ROS executor 不会被阻塞。

双格式解析

VLM 输出支持两种解析策略:

  1. JSON 提取:优先匹配 {"objects": [...], "scene_description": "..."}
  2. 原生 grounding 兜底:解析 <|box_start|>(x1,y1),(x2,y2)<|box_end|>

模型缓存

  • 首次下载约 6-8GB缓存到 /workspace/.cache/huggingfaceEFS 持久化)
  • 容器重启后无需重新下载
  • 可在镜像构建时预置到 /opt/vendor/vlm_models/ 以加速启动

六、性能预期

指标 YOLOv8 CPU VLM GPU (T4)
单帧处理 ~80ms ~3-5s
频率 1Hz 0.2Hz (5s interval)
CPU ~100% (1核) ~50% (预处理)
GPU 0 ~90% (推理时)
假阳性 COCO 预训练) 低(语义理解)
语义能力 场景描述、异常检测

七、文件清单

文件 说明
src/vision_yolo/vision_yolo/detector.py 修改后的检测器(支持三模式切换)
scripts/install_vlm.sh VLM 依赖安装脚本
docs/VLM_INTEGRATION.md 本文档

八、快速验证流程

# 1. SSH 进入 GPU 实例
ssh devuser@<gpu-space>

# 2. 安装依赖
bash scripts/install_vlm.sh

# 3. 启动 Gazebo + Nav2
./run_all.sh mapping --explore

# 4. 单独测试 VLM 节点
export VISION_BACKEND=vlm
export VLM_INTERVAL=3.0
ros2 run vision_yolo detector

# 5. 观察话题
ros2 topic echo /vision/scene_description
ros2 topic hz /vision/detections