| # 改进版视频标注 API 使用说明 |
|
|
| ## 主要改进 |
|
|
| ### 1. 动态任务描述(已实现 ✓) |
|
|
| - **自动读取 metadata JSON**:根据视频路径自动查找对应的 `metadata_*.json` 文件 |
| - **提取任务描述**:从 JSON 中提取 `current_task` 字段 |
| - **动态插入 prompt**:将任务描述动态插入到 GPT prompt 中 |
|
|
| 示例: |
| ``` |
| 视频路径: PennPAL/failure/2023-10-01/Sun_Oct__1_16:56:53_2023/recordings/MP4/14436910.mp4 |
| Metadata: PennPAL/failure/2023-10-01/Sun_Oct__1_16:56:53_2023/metadata_PennPAL+c5f808b7+2023-10-01-16h-56m-53s.json |
| 任务: "Open or close hinged object (ex: hinged door, microwave, oven, book, dryer, toilet, box)" |
| ``` |
|
|
| ### 2. 视频序列帧分析(已实现 ✓) |
|
|
| 提供两种处理模式: |
|
|
| #### 模式 A:基础模式(USE_SLIDING_WINDOW = False) |
| - 一次性发送所有帧给 GPT |
| - 适合短视频(< 20 帧) |
| - 成本较低,处理速度快 |
|
|
| #### 模式 B:滑动窗口模式(USE_SLIDING_WINDOW = True)⭐ **推荐** |
| - **连续帧分析**:每次发送 WINDOW_SIZE 个连续帧 |
| - **捕捉动态关系**:GPT 可以看到连续的动作序列,判断: |
| - 运动是否平滑还是抖动 |
| - 物体是否稳定还是摇晃 |
| - 进度是前进、停滞还是倒退 |
| - **上下文传递**:前一个窗口的分析结果作为上下文传递给下一个窗口 |
| - **参数配置**: |
| - `WINDOW_SIZE = 5`:每个窗口包含 5 个连续帧 |
| - `WINDOW_STRIDE = 3`:窗口每次滑动 3 帧(允许重叠) |
|
|
| **滑动窗口示例**: |
| ``` |
| 视频帧: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] |
| |
| 窗口 1: [0, 1, 2, 3, 4] → 分析 + 上下文A |
| 窗口 2: [3, 4, 5, 6, 7] → 分析 + 上下文B(基于窗口1) |
| 窗口 3: [6, 7, 8, 9, 10] → 分析 + 上下文C(基于窗口2) |
| 窗口 4: [9, 10, 11, 12] → 分析 + 上下文D(基于窗口3) |
| ``` |
|
|
| ### 3. 对齐仿真奖励指标(已实现 ✓) |
|
|
| #### 新增字段(与仿真数据对齐) |
|
|
| ```json |
| { |
| "stage": 0, // 阶段索引 (0-5) |
| "stage_name": "reach", // 阶段名称 |
| |
| // 奖励组件(与仿真对齐) |
| "reachout": 0.8, // 接近物体的进度 (0.0-1.0) |
| "grasp": 0.0, // 抓取质量 (0.0-1.0) |
| "collision": 0.0, // 碰撞惩罚 (0.0-1.0) |
| "fall": 0.0, // 掉落惩罚 (0.0-1.0) |
| "smooth": 0.9, // 运动平滑度 (0.0-1.0) |
| |
| // 综合指标 |
| "reward": 0.85, // 总奖励 |
| "delta": 0.05, // 奖励变化 |
| "success_prob": 0.7, // 成功概率 |
| "failure": 0, // 是否失败 (0/1) |
| |
| "explanation": "..." // 解释 |
| } |
| ``` |
|
|
| #### 阶段定义 |
|
|
| ``` |
| 0: reach - 伸手接近物体 |
| 1: grasp - 抓取物体 |
| 2: lift - 抬起物体 |
| 3: move - 移动物体 |
| 4: place - 放置物体 |
| 5: retract - 收回手臂 |
| ``` |
|
|
| #### 奖励组件说明 |
|
|
| 1. **reachout**(接近) |
| - 0.0: 机器人远离目标 |
| - 0.5: 正在接近 |
| - 1.0: 已接触或达到目标位置 |
|
|
| 2. **grasp**(抓取) |
| - 0.0: 无接触 |
| - 0.5: 接触但不稳定 |
| - 1.0: 稳固抓取 |
|
|
| 3. **collision**(碰撞惩罚) |
| - 0.0: 无碰撞 |
| - 0.5: 轻微碰撞 |
| - 1.0: 严重碰撞 |
|
|
| 4. **fall**(掉落惩罚) |
| - 0.0: 物体稳定 |
| - 1.0: 物体掉落/滚落 |
|
|
| 5. **smooth**(平滑度) |
| - 0.0-0.3: 抖动、突然运动 |
| - 0.8-1.0: 平滑、稳定运动 |
|
|
| ## 配置参数 |
|
|
| ```python |
| # 基础配置 |
| ROOT = Path("/playpen-ssd/dataset/droid_raw/1.0.1/AUTOLab/failure") |
| TARGET_NAME = "22008760.mp4" |
| OUTPUT_FILE = "./output/labels_batch_improved.jsonl" |
| FPS_SAMPLE = 2 |
| MODEL_NAME = "gpt-4o" # 推荐使用 gpt-4o |
| MAX_VIDEOS = 10 |
| START_INDEX = 0 |
| |
| # 滑动窗口配置 |
| USE_SLIDING_WINDOW = True # 推荐设为 True |
| WINDOW_SIZE = 5 # 每个窗口的帧数 |
| WINDOW_STRIDE = 3 # 窗口滑动步长 |
| ``` |
|
|
| ## 输出格式 |
|
|
| 输出 JSONL 文件,每行一个时间步的标注: |
|
|
| ```json |
| { |
| "video_path": "/playpen-ssd/dataset/.../22008760.mp4", |
| "video_id": "22008760", |
| "task": "Move object into or out of container", |
| "t": 0, |
| "frame_index": 0, |
| "total_frames": 229, |
| "native_fps": 60.0, |
| "window_idx": 0, |
| "stage": 0, |
| "stage_name": "reach", |
| "reachout": 0.3, |
| "grasp": 0.0, |
| "collision": 0.0, |
| "fall": 0.0, |
| "smooth": 0.8, |
| "reward": 0.55, |
| "delta": 0.0, |
| "success_prob": 0.5, |
| "failure": 0, |
| "explanation": "Robot arm is reaching toward the container..." |
| } |
| ``` |
|
|
| ## 使用方法 |
|
|
| ### 1. 安装依赖 |
|
|
| ```bash |
| pip install openai decord pillow python-dotenv tqdm |
| ``` |
|
|
| ### 2. 设置 API Key |
|
|
| 创建 `.env` 文件: |
| ``` |
| OPENAI_API_KEY=your_api_key_here |
| ``` |
|
|
| ### 3. 运行脚本 |
|
|
| ```bash |
| cd /home/jqliu/projects/RewardModel |
| python api_batch_improved.py |
| ``` |
|
|
| ### 4. 查看结果 |
|
|
| ```bash |
| # 查看输出文件 |
| cat output/labels_batch_improved.jsonl | jq . |
| |
| # 统计不同阶段的分布 |
| cat output/labels_batch_improved.jsonl | jq -r '.stage_name' | sort | uniq -c |
| |
| # 查看失败案例 |
| cat output/labels_batch_improved.jsonl | jq 'select(.failure == 1)' |
| ``` |
|
|
| ## 成本估算 |
|
|
| 使用 GPT-4o 的成本(2024年价格): |
| - 输入: $2.50 / 1M tokens |
| - 输出: $10.00 / 1M tokens |
|
|
| 示例视频(2秒,60fps,采样2fps): |
| - 帧数: ~4 帧 |
| - 每帧图片 token: ~1000 tokens |
| - 每视频成本: ~$0.01-0.02 |
|
|
| ## 对比原版本的改进 |
|
|
| | 特性 | 原版本 | 改进版本 | |
| |-----|--------|---------| |
| | 任务描述 | 固定 | ✓ 从 metadata 动态提取 | |
| | 帧分析方式 | 单次所有帧 | ✓ 滑动窗口 + 上下文传递 | |
| | 动态关系分析 | 有限 | ✓ 连续帧序列,捕捉运动平滑度 | |
| | 奖励指标 | 基础 | ✓ 对齐仿真(reachout, grasp, collision, fall, smooth)| |
| | 阶段定义 | 字符串 | ✓ 数值索引 + 名称(与仿真对齐)| |
| | 上下文传递 | 无 | ✓ 前一窗口结果作为上下文 | |
|
|
| ## 建议 |
|
|
| 1. **首次测试**:先设置 `MAX_VIDEOS = 1` 测试单个视频 |
| 2. **模型选择**:推荐使用 `gpt-4o`,性能最佳且成本较低 |
| 3. **窗口大小**: |
| - 短视频(<3秒):WINDOW_SIZE = 3-5 |
| - 长视频(>5秒):WINDOW_SIZE = 5-7 |
| 4. **质量检查**:定期检查输出,确保标注质量 |
| 5. **批处理**:可以使用多进程并行处理多个视频 |
|
|
| ## 故障排除 |
|
|
| ### 问题1:找不到 metadata 文件 |
| - 检查视频路径结构是否正确 |
| - 确认 metadata JSON 文件存在于轨迹根目录 |
|
|
| ### 问题2:API 超时 |
| - 减小 WINDOW_SIZE |
| - 增加重试机制 |
| - 检查网络连接 |
| |
| ### 问题3:输出格式错误 |
| - 检查 GPT 返回的 JSON 是否有效 |
| - 可能需要调整 prompt 或增加输出格式验证 |
| |
| ## 后续扩展 |
| |
| 可以进一步添加: |
| 1. 多视角融合(同时分析多个摄像头) |
| 2. 失败检测器(专门识别失败模式) |
| 3. 质量评分(评估标注的可信度) |
| 4. 人工审核界面(可视化标注结果) |
| |