# Reward Model for Robotics > 训练视觉奖励模型,为机器人 VLA Policy 训练提供奖励信号 --- ## 项目目标 训练一个**视觉奖励模型**,用于评估机器人操作视频: - **输入**:机器人操作视频帧 - **输出**:操作阶段、奖励分数、失败检测 - **应用**:为 VLA (Vision-Language-Action) 模型的强化学习提供奖励信号 --- ## 项目结构 ``` RewardModel_v2/ │ ├── scripts/ # 核心脚本 │ ├── annotate_gpt.py # GPT 视频标注(主要使用) │ ├── annotate_hf_dataset.py # HuggingFace 数据集标注 │ ├── extract_frames.py # 从视频提取帧图片 │ ├── convert_to_sft.py # 转换为 SFT 训练格式 │ ├── train_reward_model.sh # ms-swift LoRA 训练 │ └── caption/ # Qwen-VL 视频描述 │ ├── infer_caption.py │ └── infer_caption_batch.py │ ├── tools/ # 工具脚本 │ ├── count_failure_trajectories.py # 统计失败轨迹 │ ├── check_video_framerate.py # 检查视频帧率 │ ├── prepare_hf_dataset.py # 准备 HuggingFace 数据集 │ ├── upload_to_huggingface.py # 上传到 HuggingFace │ └── quick_start.sh # 快速开始脚本 │ ├── data/ # 数据目录 │ ├── raw/ # 原始数据 │ │ ├── cokecan-50/ # 仿真数据(按类型分类) │ │ └── droid/ # DROID 元数据 │ ├── training/ # 训练数据 │ │ └── sft_*.json # SFT 格式数据 │ ├── system_prompt.txt # 推理 prompt │ └── tokens.txt # 特殊 token 定义 │ ├── outputs/ # 输出目录 │ ├── labels/ # 标注结果 (.jsonl) │ ├── frames/ # 提取的帧图片 │ └── weights/ # 训练权重 │ ├── models/ # 模型权重 │ ├── weights_reward_sft/ # 标准版本 │ └── weights_reward_sft_special_token/ # Special Token 版本 │ ├── docs/ # 文档 │ ├── QUICK_START_FOR_AGENT.md # AI Agent 快速开始 │ ├── PROJECT_STATUS.md # 项目状态快照 │ ├── CODE_GUIDE.md # 代码详细说明 │ ├── PROJECT_OVERVIEW.md # 项目完整概述 │ ├── DEVELOPMENT_LOG.md # 开发历程 │ ├── dataset_source.md # 数据源说明 │ └── ... # 其他文档 │ ├── archive/ # 归档(旧版本/历史文件) │ ├── old_scripts/ # 旧脚本 │ ├── old_outputs/ # 旧输出 │ ├── statistics/ # 统计结果 │ └── droid_processed/ # 处理过的 DROID 样本 │ └── README.md # 本文件 ``` --- ## 快速开始 ### 1. 环境配置 ```bash pip install openai decord pillow python-dotenv tqdm tensorflow_datasets ``` ### 2. 运行标注 ```bash cd /home/jqliu/projects/RewardModel_v2 # 设置 API Key export OPENAI_API_KEY="your-key-here" # GPT 标注(推荐) python scripts/annotate_gpt.py # 或 Qwen-VL 标注 python scripts/caption/infer_caption_batch.py ``` ### 3. 数据处理流程 ```bash # 1. 标注视频 → outputs/labels/ python scripts/annotate_gpt.py # 2. 提取帧图片 → outputs/frames/ python scripts/extract_frames.py # 3. 转换为训练格式 → data/training/ python scripts/convert_to_sft.py ``` ### 4. 模型训练 ```bash # 安装 ms-swift(首次使用) pip install ms-swift # 标准模式训练(JSON 输出格式) bash scripts/train_reward_model.sh # Special Token 模式训练(结构化输出格式) bash scripts/train_reward_model.sh --special-token # 仅打印命令,不执行(用于检查参数) bash scripts/train_reward_model.sh --dry-run ``` #### 参数配置 通过环境变量覆盖默认参数: ```bash # 使用更大模型 MODEL=Qwen/Qwen2.5-VL-7B-Instruct bash scripts/train_reward_model.sh # 调整 LoRA 和训练参数 EPOCHS=5 LORA_RANK=16 LR=2e-5 bash scripts/train_reward_model.sh # 使用自定义数据集 DATASET=data/training/my_dataset.json bash scripts/train_reward_model.sh # 指定 GPU GPU=0,1 bash scripts/train_reward_model.sh ``` #### 关键参数说明 | 参数 | 默认值 | 说明 | |------|--------|------| | `MODEL` | Qwen2.5-VL-3B-Instruct | 基座模型 | | `DATASET` | 自动选择 | 训练数据路径(相对路径) | | `LORA_RANK` | 8 | LoRA 秩,越大容量越强 | | `LORA_ALPHA` | 32 | LoRA 缩放系数 | | `EPOCHS` | 1 | 训练轮数 | | `GRAD_ACCUM` | 16 | 梯度累积步数 | | `LR` | 1e-5 | 学习率 | | `MAX_LENGTH` | 1024 | 最大序列长度 | #### 数据量与参数建议 | 数据规模 | 建议 EPOCHS | 建议 LORA_RANK | |----------|-------------|----------------| | < 500 条 | 5 ~ 10 | 8 | | 500 ~ 5000 条 | 1 ~ 3 | 16 ~ 32 | | > 5000 条 | 1 | 8 ~ 16 | 训练权重输出到 `outputs/weights/` 目录,自动带时间戳版本号。 --- ## 核心脚本说明 | 脚本 | 功能 | 输出 | |------|------|------| | `scripts/annotate_gpt.py` | GPT 视频标注(滑动窗口) | `outputs/labels/*.jsonl` | | `scripts/annotate_hf_dataset.py` | HuggingFace 数据集标注 | `outputs/labels/*.jsonl` | | `scripts/extract_frames.py` | 提取视频帧为图片 | `outputs/frames/**/*.jpg` | | `scripts/convert_to_sft.py` | 转换为 SFT 训练格式 | `data/training/*.json` | | `scripts/train_reward_model.sh` | ms-swift LoRA 训练 | `outputs/weights/` | --- ## 项目状态 | 模块 | 状态 | |------|------| | 数据处理流水线 | ✅ 完成 | | GPT 标注系统 | ✅ 完成 | | 小规模模型训练 | ✅ 完成 | | **大规模数据标注** | ⏳ 进行中 | | **模型评估系统** | 📋 待启动 | 详见:[docs/PROJECT_STATUS.md](docs/PROJECT_STATUS.md) --- ## 文档导航 | 文档 | 用途 | |------|------| | [QUICK_START_FOR_AGENT.md](docs/QUICK_START_FOR_AGENT.md) | AI Agent 快速上手 | | [PROJECT_STATUS.md](docs/PROJECT_STATUS.md) | 项目状态快照 | | [CODE_GUIDE.md](docs/CODE_GUIDE.md) | 所有脚本详细说明 | | [dataset_source.md](docs/dataset_source.md) | 数据源位置 | --- ## 数据源 ### 真机数据 - **DROID 数据集**:`/playpen-ssd/dataset/droid_raw/1.0.1/` - **failure 轨迹**:15,157 条 ### 仿真数据 - **本地 cokecan-50**:`data/raw/cokecan-50/` - **fangyu 仿真**:`/playpen-ssd/yufang/projects/reward/` 详见:[docs/dataset_source.md](docs/dataset_source.md) --- ## 归档说明 `archive/` 目录包含旧版本文件,保留供参考: | 目录 | 内容 | |------|------| | `old_scripts/` | 早期脚本版本(api.py, api_batch.py 等)| | `old_outputs/` | 历史输出文件 | | `statistics/` | 数据统计结果 | | `droid_processed/` | 处理过的 DROID 样本数据 | --- ## 更新日志 ### v2.0.0 (2026-01-21) - 重构项目结构,更加清晰 - 重命名脚本,语义更明确 - 归档旧版本文件 - 统一输出目录 ### v1.0.0 (2025-11-10) - 完成基础功能开发 - 完成小规模模型训练