| # 开发日志 - 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 |
|
|