office_gzweb/docs/VLM_INTEGRATION.md

181 lines
5.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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 许可证,无商用限制
---
## 二、三种运行时模式
```bash
# 模式 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
# 国内环境(默认):自动使用阿里云 pip 镜像 + 魔搭 ModelScope 下载模型
bash scripts/install_vlm.sh
# 境外环境(官方源)
USE_CHINA_MIRROR=false bash scripts/install_vlm.sh
```
该脚本会自动:
- 检测 CUDA 环境,按需安装 PyTorch 2.1.2+cu121国内优先阿里云镜像失败则回退官方源
- pip 包使用阿里云镜像加速transformers、accelerate、qwen-vl-utils 等)
- Ampere 架构 GPU 自动安装 Flash Attention 2
- **国内默认通过魔搭 ModelScope 下载模型**(无需 HuggingFace 连通性)
- 预下载 Qwen2.5-VL-3B-Instruct 模型(约 6-8GB缓存到 EFS
### 3.2 验证安装
```bash
python3 -c "import torch; print(torch.cuda.is_available(), torch.cuda.get_device_name(0))"
```
### 3.3 启动测试
```bash
# 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|>`
### 模型缓存与离线加载
- **国内模式**:模型通过魔搭 ModelScope 下载到 `/workspace/.cache/modelscope/hub/...`,同时记录本地路径到 `/workspace/.vlm_model_path`
- **境外模式**:模型通过 HuggingFace 官方源下载到 `/workspace/.cache/huggingface/hub/...`,同样记录本地路径
- `run_all.sh` 启动时会自动 `source /workspace/.vlm_model_path`detector.py 直接使用本地路径加载,**无需运行时联网**
- 容器重启后无需重新下载EFS 持久化)
- 可在镜像构建时预置到 `/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` | 本文档 |
---
## 八、快速验证流程
```bash
# 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
```