File size: 6,824 Bytes
a741a7c | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 | # 改进版视频标注 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. 人工审核界面(可视化标注结果)
|