File size: 11,641 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 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 | # 开发日志 - Development Log
> 记录项目开发历程、重要决策和关键里程碑
---
## 📅 时间线总览
```
2025-10 ━━ 项目初期探索
2025-11 ━━ 核心系统开发
2026-01 ━━ 文档完善和规模化准备
```
---
## 2026 年 1 月
### 2026-01-20: 文档系统完善
**完成工作**:
- ✅ 创建完整的代码指南(CODE_GUIDE.md)
- ✅ 创建项目状态快照(PROJECT_STATUS.md)
- ✅ 完善数据源说明(dataset_source.md)
- ✅ 创建开发日志(DEVELOPMENT_LOG.md)
**目标**:
- 为 AI Agent 提供完整的项目理解文档
- 方便后续快速上手和协作
---
## 2025 年 11 月
### 2025-11-11: Special Token v2 训练
**训练配置**:
- 模型版本:Special Token v2
- Checkpoint:checkpoint-70
- 训练数据:~100 条样本
**改进点**:
- 完整 merge 版本
- 更好的 token 格式
**输出**:
- 权重保存在:`weights_reward_sft_special_token/v2-20251110-235126/`
**决策**:
- 使用特殊 token 格式可以更好地结构化输出
- 但需要更多训练数据才能看到明显效果
---
### 2025-11-10: 改进版训练和 Special Token 实验
#### Special Token v1 训练
**训练配置**:
- 模型版本:Special Token v1
- Checkpoint:checkpoint-70
- 数据格式:使用特殊 token 标记(如 `<|stage|>`, `<|reward|>`)
**输出**:
- 权重:`weights_reward_sft_special_token/v1-20251110-234131/`
**观察**:
- Special token 格式有助于模型理解结构化输出
- 但需要在推理时正确解析 token
---
#### Special Token v0 训练
**时间**:2025-11-10 23:21
**训练配置**:
- 模型版本:Special Token v0
- Checkpoint:checkpoint-7
**输出**:
- 权重:`weights_reward_sft_special_token/v0-20251110-232149/`
---
#### 改进版 SFT 训练(v1)
**时间**:2025-11-10 23:01
**训练配置**:
- 模型版本:v1
- Checkpoint:checkpoint-7
- 数据:改进版标注数据(~100 条)
**改进点**:
- 使用滑动窗口标注的数据
- 更准确的奖励组件对齐
**输出**:
- 权重:`weights_reward_sft/v1-20251110-230134/`
**决策**:
- 确认滑动窗口标注模式的有效性
- 决定在扩大数据规模时继续使用此模式
---
### 2025-11-05: 基础版 SFT 训练(v0)
**时间**:2025-11-05 17:12
**训练配置**:
- 模型版本:v0(基础版)
- Checkpoint:checkpoint-28
- 数据:基础版标注数据(~100 条)
**输出**:
- 权重:`weights_reward_sft/v0-20251105-171242/`
**里程碑**:
- 🎉 **首次完成端到端训练**
- 验证了整个流程的可行性:数据提取 → 标注 → 训练
**观察**:
- 小规模数据训练的模型性能有限
- 需要扩大数据规模
**决策**:
- 继续改进标注系统
- 准备扩大数据规模
---
## 2025 年 10 月
### 2025-10-xx: 改进版标注系统开发
**关键改进**:
1. **动态任务描述**
- 自动从 metadata JSON 提取任务描述
- 动态插入到 GPT prompt
- 提高标注的任务相关性
2. **滑动窗口分析**
- 引入 WINDOW_SIZE 和 WINDOW_STRIDE 参数
- 连续帧分析,捕捉时序动态
- 上下文传递机制
3. **奖励指标对齐**
- 与仿真数据对齐:5 个奖励组件
- 6 个操作阶段定义
- 综合指标计算
**输出脚本**:
- `api_batch_improved.py`
- `api_batch_improved_v2.py`(Claude 版本)
**决策依据**:
- 单次标注所有帧无法捕捉运动平滑度
- 需要时序信息来判断进度和趋势
- 仿真数据的奖励定义更精确,应该对齐
---
### 2025-10-xx: 数据统计和分析
**完成工作**:
- DROID 失败轨迹统计脚本(`count_failure_trajectories.py`)
- 视频帧率统计脚本(`check_video_framerate.py`)
**发现**:
- 总共 15,157 条 failure 轨迹
- 主要数据源:AUTOLab (23.9%), PennPAL (16.5%)
- Top 任务类型:Move object into container (2,699 条)
**决策**:
- 使用 balanced 采样策略确保任务类型覆盖
- 优先处理高频任务类型
---
### 2025-10-xx: HuggingFace 数据集工具开发
**开发工具**:
- `prepare_hf_dataset.py`:数据集准备和采样
- `upload_to_huggingface.py`:上传到 HuggingFace Hub
- `quick_start.sh`:一键运行脚本
**采样策略设计**:
1. **balanced**:每个任务类别采样相同数量
2. **random**:完全随机采样
3. **proportional**:按原始分布比例采样
**决策**:
- 推荐使用 balanced 策略保证任务多样性
- 提供灵活的配置选项
**文档**:
- `data_sta/README_HF_DATASET.md`
- `data_sta/UPLOAD_GUIDE.md`
---
### 2025-10-xx: 基础标注系统开发
**开发脚本**:
- `api.py`:单视频标注(原型)
- `api_batch.py`:批量视频标注(基础版)
**功能**:
- 从视频提取帧
- 调用 GPT-4o API 进行标注
- 输出 JSONL 格式
**问题**:
- 无法捕捉时序动态
- 任务描述固定,不够灵活
- 奖励指标定义不够清晰
**决策**:
- 需要改进标注系统 → 引入滑动窗口
---
### 2025-10-xx: 数据处理流水线开发
**开发脚本**:
1. `video_process.py`:从 TFDS 提取视频
2. `extract_frames_to_images.py`:提取帧图片
3. `convert_to_sft.py`:转换为 SFT 训练格式
**设计决策**:
1. **视频提取**
- 拼接 wrist_image_left + exterior_image_1_left
- 15fps,h264 编码
- 保存元数据 JSON
2. **帧提取**
- 支持 mirror 和 flat_hash 两种存储模式
- 生成索引文件方便追溯
3. **格式转换**
- 两阶段转换:中间格式 → 最终格式
- 适配 ms-swift 训练框架
---
### 2025-10-xx: 项目启动
**初始目标**:
- 训练一个奖励模型用于机器人操作
- 输入:视频帧
- 输出:阶段、奖励、失败检测
**技术选型**:
- 基座模型:Qwen-VL(开源 + 性能平衡)
- 标注工具:GPT-4o(高质量 ground truth)
- 训练框架:ms-swift(简单易用)
- 数据集:DROID(真机数据)+ 仿真数据
**关键决策**:
1. 使用 GPT-4o 生成标注而非人工标注
- 原因:成本低、速度快、可扩展
- 风险:质量需要验证
2. 采用 SFT 而非从头训练
- 原因:数据量有限(数千条)
- 风险:基座模型的 bias
3. 真机数据 + 仿真数据混合
- 原因:仿真数据标注精确,真机数据真实
- 风险:域迁移问题
---
## 重要决策记录
### 决策 1: 使用滑动窗口标注模式
**时间**:2025-11-05
**背景**:
- 基础版一次性标注所有帧无法捕捉运动平滑度
- 需要时序信息判断进度和趋势
**决策**:
- 引入滑动窗口(WINDOW_SIZE=5, STRIDE=3)
- 上下文传递机制
**结果**:
- ✅ 标注质量明显提升
- ✅ 能够捕捉运动的连续性
- ⚠️ API 调用成本增加(但可接受)
---
### 决策 2: 对齐仿真奖励指标
**时间**:2025-10-xx
**背景**:
- 仿真数据有精确的奖励组件定义
- GPT 标注缺乏统一标准
**决策**:
- 定义 5 个奖励组件:reachout, grasp, collision, fall, smooth
- 定义 6 个操作阶段:reach, grasp, lift, move, place, retract
- 在 prompt 中明确指导 GPT 遵循此标准
**结果**:
- ✅ 标注更加结构化
- ✅ 便于与仿真数据混合训练
- ⚠️ 需要验证 GPT 理解是否准确
---
### 决策 3: 采用 Special Token 格式
**时间**:2025-11-10
**背景**:
- JSON 格式输出有时不稳定
- 需要更明确的结构化输出标记
**决策**:
- 引入特殊 token:`<|stage|>`, `<|reward|>` 等
- 在训练数据中使用此格式
**结果**:
- ⚠️ 效果待验证(数据量太小)
- ✅ 理论上应该有帮助
- ❌ 推理时需要额外的 token 解析
**后续行动**:
- 等待大规模训练后再评估效果
---
### 决策 4: HuggingFace 数据集管理
**时间**:2025-10-xx
**背景**:
- 数据分散在本地,不便管理
- 希望公开数据集供社区使用
**决策**:
- 开发 HuggingFace 数据集准备工具
- 采用 balanced 采样策略
- 提供完整的上传流程
**结果**:
- ✅ 数据管理更加规范
- ✅ 便于后续扩展
- ⏳ 尚未正式上传到 HuggingFace(等待大规模标注)
---
## 技术栈演进
### 标注工具
| 阶段 | 工具 | 原因 |
|------|------|------|
| 初期 | GPT-4o | 高质量、可扩展 |
| 中期 | + Claude | 备选方案 |
| 未来 | + 本地 Qwen-VL | 降低成本 |
### 训练框架
| 阶段 | 框架 | 原因 |
|------|------|------|
| 初期 | ms-swift | 简单易用,快速验证 |
| 未来 | 可能迁移到其他框架 | 根据需求调整 |
---
## 遇到的问题和解决方案
### 问题 1: GPT 标注不一致
**现象**:
- 同一视频多次标注结果不同
- stage 有时会跳跃或倒退
**分析**:
- GPT 理解有随机性
- prompt 不够明确
**解决方案**:
- 降低 temperature(0.1)
- 在 prompt 中强调 stage 单调性
- 使用滑动窗口 + 上下文传递
**状态**:⚠️ 部分改善,仍需人工质量评估
---
### 问题 2: 数据量不足
**现象**:
- 当前只有 ~100 条训练数据
- 模型性能有限
**分析**:
- 标注成本和时间限制
**解决方案**:
- 优先扩大标注规模(目标 2500+ 条)
- 采用 balanced 采样保证多样性
**状态**:⏳ 待执行
---
### 问题 3: Success vs Failure 不平衡
**现象**:
- 当前主要是 failure 数据
- Success 数据严重不足
**分析**:
- 项目初期聚焦于失败检测
- DROID 数据集 failure 更容易识别
**解决方案**:
- 从 DROID success 目录采样
- 目标比例:success:failure = 1:2
**状态**:📋 待执行
---
## 经验教训
### ✅ 做对的事
1. **早期建立完整流水线**
- 从数据提取到训练的端到端流程
- 便于快速迭代
2. **使用 GPT 生成标注**
- 成本低、速度快
- 质量可控(通过 prompt 工程)
3. **滑动窗口标注**
- 显著提升标注质量
- 捕捉时序动态
4. **完善的文档**
- 便于协作和知识传递
- AI Agent 可快速上手
### ⚠️ 可以改进的
1. **应该更早进行质量评估**
- 应该在标注 100 条后就进行人工抽检
- 避免大规模标注后发现质量问题
2. **应该更早扩大数据规模**
- 100 条数据训练效果有限
- 应该尽快扩展到 1000+ 条
3. **应该更早整合仿真数据**
- 仿真数据标注精确,应该充分利用
- 真机 + 仿真混合训练可能效果更好
---
## 下一步计划
详见:[NEXT_STEPS.md](./NEXT_STEPS.md)
**优先级 P0**:
1. ⏳ 扩大标注规模(100 → 2500+ 条)
2. ⏳ 人工质量评估(Golden Set)
3. ⏳ 大规模模型训练
4. ⏳ 建立评估体系
---
## 参考资料
### 相关论文
- DROID Dataset Paper
- Vision-Language Models for Robotics
- Reward Modeling for RL
### 相关项目
- OpenVLA
- RT-1, RT-2
- ALOHA
---
## 附录
### 命名约定
- `labels_*.jsonl`:标注文件
- `sft_*.json`:SFT 训练数据
- `v<N>-<YYYYMMDD>-<HHMMSS>`:模型版本命名
- `checkpoint-<N>`:训练检查点
### 目录结构约定
```
project_root/
├── api_*.py # API 调用脚本
├── video_*.py # 视频处理脚本
├── extract_*.py # 提取脚本
├── convert_*.py # 转换脚本
├── data/ # 本地数据
├── data_sta/ # 数据统计工具
├── output/ # 输出文件
├── weights_*/ # 模型权重
├── docs/ # 文档
└── caption/ # 视频描述生成
```
---
最后更新:2026-01-20
|