RDA v0.9.7 实战报告:13 个机器人数据集的四层审计全解析
本文基于 RDA v0.9.7 对 13 个 LeRobot 公开数据集的全量审计结果,详细解读四层审计框架的每层指标含义、跨数据集对比、以及 v0.9.7 判定管线重构的工程决策。
一、背景与实验设置
1.1 为什么要做这个审计?
机器人学习领域的数据集越来越多,但数据质量评估工具严重不足。大多数研究者只检查基本的完整性(缺帧、NaN),对行为特征和训练效率的评估几乎为零。
RDA(Robot Data Audit)是一个面向 LeRobot 格式数据集的独立质量审计工具。本次实验的目标是:
- 在 13 个真实公开数据集 上运行 RDA v0.9.7
- 零调参:所有数据集使用完全相同的默认阈值
- 全量审计:4,940 个 episode 全部检查
- 分层分析:不只看 PASS/REVIEW,重点分析 L2 行为诊断和 L3 数据画像
1.2 实验环境
表格
| 项目 | 配置 |
|---|---|
| RDA 版本 | 0.9.7(PyPI) |
| 报告 schema | 1.2 |
| 数据格式 | LeRobot v3.0 |
| 执行模式 | Fast Audit(默认,含 video metrics) |
| 硬件 | 云端 CPU,无 GPU |
| 数据来源 | HuggingFace Hub 直接下载 |
1.3 四层审计框架概览
┌─────────────────────────────────────────────────────┐
│ L1 — Integrity Gate(完整性门控) │
│ 9 个硬检查指标:缺帧、NaN、schema、时间戳、视频完整性... │
│ 可以设置 EXCLUDE verdict │
├─────────────────────────────────────────────────────┤
│ L2 — Trajectory Diagnostics(轨迹诊断) │
│ 8 个观测指标:动作突变、空闲比、视频冻结、视觉质量... │
│ 仅产出 finding(信号),不设置 verdict │
├─────────────────────────────────────────────────────┤
│ L3 — Dataset Profile(数据画像) │
│ 4 个效率指标:空闲比分布、状态分布、覆盖度、时序结构 │
│ 仅产出测量值 │
├─────────────────────────────────────────────────────┤
│ L4 — Dataset Summary(数据集概览) │
│ P10/P50/P90 聚合统计 │
│ 仅用于报告 │
└─────────────────────────────────────────────────────┘
核心设计原则:只有 L1 的硬检查能产生 EXCLUDE 判定;L2/L3 的诊断测量永远不自动升级为 verdict。 这是 v0.9.7 最重要的架构决策。
二、L1 完整性门控:全部通过
所有 13 个数据集的 4,940 个 episode 全部通过 L1 检查:
表格
| 检查项 | 结果 |
|---|---|
| missing_dropout | 全部通过 |
| invalid_values (NaN/Inf) | 全部通过 |
| schema_consistency | 全部通过 |
| timestamp_validity | 全部通过 |
| video_frame_integrity | 全部通过 |
| video_timestamp_alignment | 全部通过 |
| video_stream_presence | 全部通过 |
| video_stream_span_consistency | 全部通过 |
| video_stream_temporal_drift | 全部通过 |
结论:13 个公开数据集在数据完整性层面都没有硬伤。
但这只是起点。L1 通过只代表数据「没坏」,不代表数据「好用」。
三、L2 行为诊断:真正的洞察从这里开始
L2 层不做「好/坏」判断,它做的是观测和标记。每个 metric 产出的是 finding(信号),而不是 verdict(审判)。
3.1 idle_ratio:空闲比分析
idle_ratio 是 L2 层覆盖最广的指标——13 个数据集中有 12 个触发了 idle_ratio finding。
但这不是问题。空闲比高不等于数据质量差,它反映的是任务性质。
表格
| 数据集 | 空闲比中位数 | 有效运动比中位数 | finding 覆盖 |
|---|---|---|---|
| xarm_lift_medium | 20.8% | 79.2% | 72/800 (9%) |
| xarm_push_medium | 83.3% | 16.7% | 629/800 (78%) |
| svla_so101_pickplace | 86.8% | 13.4% | 49/50 (98%) |
| utokyo_pr2_tabletop | 83.6% | 16.4% | 237/240 (99%) |
| pusht | 81.7% | 18.3% | 202/206 (98%) |
| cmu_stretch | 66.7% | 33.3% | 135/135 (100%) |
| libero_10 | 71.7% | 28.3% | 379/379 (100%) |
| droid_100 | 70.8% | 29.4% | 97/100 (97%) |
| jaco_play | 74.1% | 25.9% | 1085/1085 (100%) |
| aloha_sim_transfer_cube_human | 71.2% | 28.8% | 50/50 (100%) |
| aloha_sim_insertion_human | 70.7% | 29.3% | 50/50 (100%) |
| aloha_sim_transfer_cube_scripted | 64.2% | 36.1% | 40/50 (80%) |
| aloha_sim_insertion_scripted | 63.7% | 36.3% | 49/50 (98%) |
关键观察:
- 11/13 数据集的中位空闲比超过 63% ——训练时 loss 会被结构性地偏向「预测不动」
- xarm_lift vs xarm_push:同一平台、同一实验室,空闲比从 20.8% 到 83.3%,差了 4 倍。lift 是大幅度动作,push 是小力+等待,任务性质决定行为模式
- finding 不等于 verdict:在 v0.9.7 中,idle_ratio finding 不会自动将 episode 标记为 REVIEW
3.2 action_discontinuity:动作突变分析
动作突变检测使用 MAD(Median Absolute Deviation)方法识别动作序列中的异常阶跃。
表格
| 数据集 | 突变 episodes | 占比 | 中位突变次数/ep | 特征 |
|---|---|---|---|---|
| aloha_sim_insertion_scripted | 50 | 100% | 33 | 脚本控制器的离散指令切换 |
| aloha_sim_transfer_cube_scripted | 50 | 100% | 49 | 同上 |
| aloha_sim_insertion_human | 38 | 76% | 26 | 遥操作的频繁修正 |
| aloha_sim_transfer_cube_human | 47 | 94% | 31 | 遥操作的频繁修正 |
| cmu_stretch | 72 | 53% | 22 | 二值夹爪 0↔1 翻转 |
| jaco_play | 176 | 16% | 10 | 大部分 episode 平滑 |
| droid_100 | 19 | 19% | 11 | 大部分 episode 平滑 |
| libero_10 | 0 | 0% | 10 | 无突变 finding |
| pusht | 0 | 0% | 5 | 无突变 finding |
| xarm_lift_medium | 0 | 0% | 0 | 极其平滑 |
| xarm_push_medium | 0 | 0% | 1 | 几乎无突变 |
关键观察:
- ALPHA scripted 数据 100% 有动作突变:脚本控制器的离散指令切换天然产生阶跃信号,不是数据损坏
- cmu_stretch 的突变来源:二值夹爪的 0↔1 翻转,是编码特征而非真实物理突变
- xarm 数据集极其平滑:lift 中位 0 次、push 中位 1 次
- 如果你的策略使用平滑正则化(smoothness regularization),这个数字直接决定课程学习策略
3.3 video_freeze:视频冻结检测
v0.9.7 新增了视频冻结检测(video_freeze),通过分析连续帧间像素差异识别冻结段。
libero_10 结果: 6/379 episodes 触发 video_freeze finding
表格
| Episode | 帧数 | 任务描述 | 冻结时长 |
|---|---|---|---|
| 90 | 223 | turn on the stove and put the moka pot on it | ~0.5s |
| 198 | 235 | pick up the book and place it in the back compartment | ~0.7s |
| 240 | 289 | put the white mug on the plate and put the chocolate pudding | ~0.8s |
| 254 | 227 | put both the cream cheese box and the butter in the basket | ~0.6s |
| 255 | 291 | put both the cream cheese box and the butter in the basket | ~0.9s |
| 300 | 237 | put both the cream cheese box and the butter in the basket | ~0.7s |
交叉验证: 通过 ffmpeg 逐帧提取两个独立摄像头(agentview + wrist_image)的画面,确认冻结帧同时出现在两个摄像头上,且位于 episode 边界位置。这更可能是机器人自然静止,而非摄像头硬件故障。
RDA 将这些 episode 标记为 REVIEW(「训练前请检查」),而非 EXCLUDE(「数据损坏」)。
3.4 速度/加速度分析
velocity_p95 的跨数据集差异极大,主要受动作空间尺度影响:
表格
| 数据集 | velocity_p95 中位数 | 特征 |
|---|---|---|
| pusht | 208.1 | 2-DOF 仿真,像素空间速度 |
| svla_so101_pickplace | 190.3 | SO-100 原始关节值 |
| utokyo_pr2_tabletop | 118.2 | PR2 未归一化 RLDS 原始值 |
| xarm_lift_medium | 9.1 | xArm 归一化关节 |
| aloha_sim_insertion_scripted | 1.7 | ALOHA 仿真双臂 |
| libero_10 | 0.32 | Panda 仿真臂 |
| jaco_play | 0.09 | Jaco 低速大范围运动 |
注意: 这些速度值的绝对数字不能跨平台比较。pusht 的 208 不代表「运动更快」——它使用的是像素空间坐标,而 libero_10 使用的是归一化关节角度。RDA 在 MVP Spec v0.2.0 §1.5 中将 velocity 归为 Tier-2 normalizable 指标,需要平台缩放因子才能跨平台对比。
四、L3 数据画像:训练效率的隐形维度
4.1 状态空间占用率(State Occupancy)
通过 10×10 网格离散化状态空间,计算 episode 覆盖的网格占比:
表格
| 数据集 | 占用率中位数 | P10 | P90 |
|---|---|---|---|
| pusht | 39.0% | 28.0% | 51.0% |
| libero_10 | 6.6% | 4.7% | 8.3% |
| utokyo_pr2_tabletop | 5.0% | 4.4% | 5.8% |
| aloha_sim_transfer_cube_scripted | 5.0% | 5.0% | 5.0% |
| droid_100 | 4.8% | 3.2% | 11.0% |
| svla_so101_pickplace | 4.5% | 4.0% | 5.0% |
| aloha_sim_insertion_scripted | 4.2% | 3.8% | 4.4% |
| aloha_sim_transfer_cube_human | 3.8% | 3.2% | 4.6% |
| aloha_sim_insertion_human | 3.8% | 3.3% | 4.4% |
| jaco_play | 2.8% | 2.2% | 3.4% |
| xarm_lift_medium | 2.4% | 2.1% | 2.5% |
| cmu_stretch | 1.9% | 1.9% | 2.0% |
| xarm_push_medium | 1.7% | 1.4% | 2.1% |
除 pusht 外,所有数据集的占用率中位数在 1.7%-6.6% 之间。 这意味着同一数据集内的 episodes 在状态空间中高度重叠——探索多样性有限。
如果你的模型需要泛化到未见过的状态,这个指标直接告诉你当前数据集的覆盖是否足够。
4.2 时序结构分析
表格
| 数据集 | 持续时长中位数(s) | 状态转移中位数 | 活跃段 P50 |
|---|---|---|---|
| cmu_stretch | 37.6 | 23 | — |
| utokyo_pr2_tabletop | 27.0 | 10 | — |
| libero_10 | 25.8 | 29 | — |
| pusht | 12.1 | 8 | — |
| droid_100 | 15.0 | 24 | — |
| svla_so101_pickplace | 7.7 | 7 | — |
| jaco_play | 6.9 | 6 | — |
| aloha_sim_insertion_human | 10.0 | 11 | — |
| aloha_sim_transfer_cube_human | 8.0 | 11 | — |
| aloha_sim_insertion_scripted | 8.0 | 4 | — |
| aloha_sim_transfer_cube_scripted | 8.0 | 4 | — |
| xarm_lift_medium | 1.6 | 4 | — |
| xarm_push_medium | 1.6 | 2 | — |
持续时长从 1.6s 到 37.6s 不等,状态转移从 2 次到 29 次不等。 这些指标影响序列模型的时间窗口设计和注意力机制的跨度选择。
五、v0.9.7 判定管线重构:为什么 findings 不再自动升级为 verdicts
5.1 旧管线的问题
在 v0.5.x 版本中,idle_ratio 超过阈值会自动将 episode 标记为 REVIEW:
表格
| 数据集 | v0.5.x REVIEW 数 | 实际原因 |
|---|---|---|
| libero_10 | 247/379 (65%) | 低运动任务是正常现象 |
| pusht | 163/206 (79%) | 低运动任务是正常现象 |
| cmu_stretch | 大量 | 低运动任务是正常现象 |
交叉验证表明,这些 REVIEW 大多是假阳性——idle_ratio 高是因为任务本身的运动幅度小,不是数据质量差。
5.2 新管线的三层聚合模型
v0.9.7 将判定管线重构为三层聚合:
- L1 Hard Checks → 直接决定 PASS / EXCLUDE
- L2/L3 Findings → 标记为 RISK_SIGNAL / RISK_LEVEL,不改变 verdict
- L4 Summary → 聚合统计,仅用于报告
5.3 效果对比
表格
| 数据集 | v0.5.x 结果 | v0.9.7 结果 | 变化 |
|---|---|---|---|
| libero_10 | 132 PASS / 247 REVIEW | 373 PASS / 6 REVIEW | REVIEW 减少 97.6% |
| pusht | 43 PASS / 163 REVIEW | 206 PASS / 0 REVIEW | REVIEW 减少 100% |
| jaco_play | 部分 REVIEW | 1085 PASS / 0 REVIEW | 全部 PASS |
| 其他 10 个数据集 | 各有 REVIEW | 全部 100% PASS | 全部 PASS |
libero_10 仅剩的 6 个 REVIEW 全部来自 video_freeze 检测——这是一个独立的、更可靠的视频质量信号。
六、盲测验证
6.1 实验设计
- 数据集:lerobot/pusht(206 episodes)
- 注入:5 类缺陷 × 10 episodes = 50 个缺陷 episode
- 对照:156 个未修改 episode
- 模式:
--no-video(Fast Audit) - 调参:零调参,全部默认阈值
6.2 注入方法
表格
| 缺陷类 | 操作 | 预期检出方式 |
|---|---|---|
| empty | 删除 data parquet 所有行,保留 meta/episodes | _zero_frame_guard |
| nan_state | 15 帧 × 2 维 = 30 NaN/episode | invalid_values |
| timestamp_reverse | 后半段 timestamps 反转 | timestamp_validity |
| frozen | state + action 冻结为首帧值 | idle_ratio finding |
| duplicate_frames | 5 帧复制追加到尾部 | timestamp_validit |
6.3 结果
表格
| 缺陷类 | EXCLUDE | REVIEW | 严格检出 | 宽松检出 |
|---|---|---|---|---|
| empty | 10/10 | 0 | 10/10 | 10/10 |
| nan_state | 10/10 | 0 | 10/10 | 10/10 |
| timestamp_reverse | 10/10 | 0 | 10/10 | 10/10 |
| frozen | 0/10 | 0/10 | 0/10 | 0/10 |
| duplicate_frames | 10/10 | 0 | 10/10 | 10/10 |
严格混淆矩阵:TP=40, FN=10, FP=0, TN=156
- 精确率:1.000(40/40,零误报)
- 召回率:0.800(40/50)
6.4 已知回归
frozen episode 检测是 v0.9.7 的已知回归。idle_ratio 仍然检测到 RISK_SIGNAL,但不再自动升级为 REVIEW verdict。这是一个需要在后续版本中解决的问题。
复现命令:
pip install robot-data-audit==0.9.7
rda audit <dataset_path> --no-video -v
七、实践建议
基于本次审计结果,对不同使用场景的建议:
7.1 数据集选择
- 不要只看 L1 完整性,L2/L3 的行为画像直接影响训练效果
- 空闲比高的数据集需要配合适当的 loss weighting 或 curriculum strategy
- 状态占用率低的数据集可能需要补充更多样化的采集
7.2 训练策略
- scripted 数据(如 ALOHA scripted)动作突变率高,建议增加平滑正则化
- 空闲比 > 70% 的数据集,考虑对「不动」动作降权
- velocity 指标跨平台不可比,需先做平台归一化
7.3 审计流程
- 默认使用 Fast Audit(
rda audit),覆盖 L1/L2/L3 的大部分指标 - 需要视频质量检测时加
--video-quality - 只需要视频检查时用
--video-only - JSON 报告中每个 metric 都有
has_finding字段,可用于自定义过滤
RDA v0.9.7 已在 PyPI 发布:pip install robot-data-audit==0.9.7
GitHub:github.com/liesliy/rda
完整 benchmark 数据:docs/benchmark.md
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐



所有评论(0)