MimicGen 子任务标注实战:用annotate_subtasks.py解决演示轨迹手动切分的难题
【免费下载链接】mimicgen_environmentsThis code corresponds to simulation environments used as part of the MimicGen project.项目地址: https://gitcode.com/gh_mirrors/mi/mimicgen_environments
MimicGen 是用人类演示轨迹批量生成机器人操作数据的系统,而一切的基础是子任务切分:只有知道每条演示里"抓取结束""放置结束"发生在哪一帧,数据生成才能把演示拆成子任务再拼接成新场景。对于难以用规则判断边界的任务,annotate_subtasks.py提供了"边看视频边标注"的手动切分方案,几分钟就能搞定一条演示。
为什么需要手动标注子任务?
MimicGen 数据生成要求每条源演示都带有子任务终止信号(subtask termination signals):一组 0/1 二值数组,信号从 0 跳变到 1 的第一帧,就定义了该子任务的结束位置。
以叠方块任务为例,一条演示会被切成 4 段:
1. grasp_1 抓取方块A → 信号在 50 帧 0→1 2. place_1 A 放到 B 上 → 信号在 94 帧 0→1 3. grasp_2 抓取方块C → 信号在 148 帧 0→1 4. (无信号) C 放到 A 上 → 演示结束信号有两条获取途径:
- 规则推断:通过 prepare_src_dataset.py 调用任务接口的
get_subtask_term_signals方法,靠任务内物体位姿等启发式规则自动计算; - 人工标注:用本文的主角 annotate_subtasks.py 回放演示视频,用键盘手动标注每个子任务的结束帧。
什么时候选第 2 条路?当任务的子任务边界依赖视觉细节(比如"盖子盖上了没有""螺母拧到位了没有"),难以写成可靠规则时,人工标注是最直接可靠的选择。这时在环境接口中让get_subtask_term_signals返回空字典即可,其余交给标注脚本。
一键启动:标注命令与参数速查
脚本会打开一个播放窗口,逐帧回放演示中的图像观测(支持多视角横向拼接),你只需按键完成标注。完整说明可参考官方文档 subtask_termination_signals.md。
核心启动命令:
python mimicgen/scripts/annotate_subtasks.py --dataset /path/to/demo.hdf5 \ --signals grasp_1 insert_1 grasp_2 \ --render_image_names agentview_image robot0_eye_in_hand_image常用参数一览:
| 参数 | 说明 | 建议用法 |
|---|---|---|
--dataset | 要修改的 hdf5 数据集路径(就地写入) | 必填,先用备份文件试 |
--signals | 子任务终止信号名称序列,不含最后一个子任务 | 名称要与 TaskSpec 配置一致 |
--render_image_names | 回放时显示的相机观测 | 省略则按环境类型自动选默认相机 |
--n/--start | 标注前 n 条 / 从第几条开始 | 新手先用--n 2试水 |
--video_skip | 每 n 步渲染一帧 | 默认 1,嫌卡可调大 |
--image_scale | 屏幕渲染放大倍数 | 默认 5,看不清可调 10 |
⚠️ 两个前置条件:数据集必须先经过prepare_src_dataset.py处理(脚本会校验datagen_info字段);标注窗口依赖pygame,安装后不会自动带上,需要pip install pygame。
键盘操作指南:5 个按键完成切分
脚本启动后会自动打印按键说明,核心就 5 个:
| 按键 | 作用 |
|---|---|
↑/↓ | 加减速(在 1/5/10/20/40 Hz 之间切换) |
←/→ | 前后快退/快进 10 帧 |
空格 | 按下并松开:标注当前子任务结束 |
f | 本条演示标注完成,保存并进入下一条 |
r | 重播本条演示,清空本次标注 |
操作节奏很简单:
- 正常速度看一遍演示,心里记下每个动作的切换点;
- 重播到第一段子任务结束处(如抓起物体的瞬间),按空格;
- 继续播到下一段结束,再按空格……直到所有信号都标完;
- 按
f保存。脚本会自动校验标注数量是否等于--signals数量,数量不对会强制重标,不用担心漏标。
每次标注后画面边框会切换红框提示,方便确认进度;标错了就按r重播整条重新标。
标注结果存到哪里?
标注完成后,脚本以"追加写入"方式把结果直接写进原数据集,位置在:
data/<demo_key>/datagen_info/subtask_term_signals/<信号名>每个信号存为一个与轨迹等长的二值数组:结束帧之前为 0,之后为 1——与规则推断生成的信号结构完全一致,后续数据生成流程无需任何改动。
建议随时用两个工具验证结果:
- get_source_info.py:打印数据集的结构与信号形状,确认
subtask_term_signals已正确写入; - visualize_subtasks.py:按信号+偏移把每条演示的子任务段可视化成视频(红框交替显示各段),直观检查切分点是否合理。
验证命令示例:
python mimicgen/scripts/get_source_info.py --dataset datasets/source/square.hdf5 python mimicgen/scripts/visualize_subtasks.py --dataset /path/to/demo.hdf5 \ --signals grasp_1 insert_1 grasp_2 --offsets 10 10 10 --render常见问题与技巧
- 信号命名必须前后一致:
--signals里写的名字,就是写进数据集的信号名,必须与任务配置中 TaskSpec 的subtask_term_signal字段一一对应,否则数据生成时找不到信号。 - 最后一个子任务不要标:它的边界默认是演示结束帧,所以
--signals数量 = 子任务总数 - 1。 - 切分点偏早/偏晚?不用重新标注。配置里的
subtask_term_offset_range可以整体平移边界,例如设 (5, 10) 让子任务在信号跳变 5~10 帧后才算结束,适合"抓起后继续抬升再结束"这类场景。 - 先试水再全量:用
--n 2只标前两条,配合visualize_subtasks.py确认切分质量满意后,再跑全量。 - 想改某一条:用
--start N --n 1精确定位到指定演示重新标注,脚本会覆盖该演示已有的信号。
写在最后
手动切分听起来费时,但annotate_subtasks.py把这件事压缩成了"看视频 + 按空格"的流畅体验:回放、快退、重播一应俱全,标注即写盘。当规则推断搞不定边界时,它就是你打通 MimicGen 数据生成流程的最后一块拼图——标好信号,剩下的交给 generate_dataset.py 即可。
【免费下载链接】mimicgen_environmentsThis code corresponds to simulation environments used as part of the MimicGen project.项目地址: https://gitcode.com/gh_mirrors/mi/mimicgen_environments
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考