当前位置: 首页 > news >正文

LIBERO-plus 数据集原理速记

LIBERO-plus 数据集原理速记

面向 项目的内部说明,聚焦 OFT1_0 在 LIBERO-plus 上做评测时
最容易踩坑的几个点:

  • 训练用 40 个 task,为什么评测要跑 ~10K 任务?
  • task_classification.json是什么?7 类扰动具体长什么样?
  • 评测时模型收到的 instruction 为什么带table 15initstate 363这种后缀?
  • 评测资产为什么经常缺失,正确的目录结构应该是什么?
  • 跑评测时如何分 shard、聚合结果。

路径示例都是当前机器上的实际位置:

  • LIBERO-plus 仓库 :/data_disk1/hwl/LIBERO-plus
  • LeRobot 训练集 :/data_disk2/hwl/datasets/libero_plus_lerobot

1. LIBERO-plus = 原版 LIBERO 的"扰动放大版"

原版 LIBEROLIBERO-plus
目标测 in-distribution 性能测 OOD / robustness
Suite4 个: spatial / object / goal / 10 (LIBERO-90 略)同样 4 个
每 suite task 数102402 / 2518 / 2591 / 2519≈ ~2500
总评测任务4010030
每 task trial 数50 (原版做统计)1(变体本身就够多了)
目的训练 + 测试仅做测试 (论文 / leaderboard)

训练数据集libero_plus_lerobot/meta/info.json里看到total_tasks: 40是因为
训练只用原版 LIBERO 的 40 个 base task × ~358 demos / task = 14347 episodes。
模型从来没见过那 10030 个变体,这是测试集的特意设计。


2. 7 大类扰动 (category) + 多档难度 (difficulty_level)

LIBERO-plus 在每个 base task 上沿 7 个维度生成大量变体,每个变体记录在
task_classification.json里:

category改了什么名字后缀样例
Background Textures替换桌面 / 背景纹理_table_15,_tb_22
Object Textures物体材质纹理_objtex_*
Object Layouts同 task 内物体摆放位置_layout_*
Robot Initial States机械臂起始 EEF 位姿 / 关节角_initstate_283,_initstate_363
Camera Viewpointsagentview 相机外参_view_0_0_100_0_0
Lighting灯光强度 / 方向 / 色温_light_*
Language Instructions同义重述 prompttask name 含_language_N_

每个 category 下还分difficulty_level(1-5),数字越大扰动越剧烈。

评测脚本里聚合方式是(suite × category)二维 + overall:

# eval_libero_plus.py:_aggregate_metrics{"overall":{"episodes":...,"successes":...,"success_rate":...},"by_category":{"Background Textures":{...},"Lighting":{...},...},"by_difficulty":{1:{...},2:{...},3:{...},...},}

3. task_classification.json 文件结构

/data_disk1/hwl/LIBERO-plus/libero/libero/benchmark/task_classification.json

格式:

{"libero_spatial":[{id,name,category,difficulty_level},...2402],"libero_object":[...2518],"libero_goal":[...2591],"libero_10":[...2519]}

合计 10030 条记录,跟评测脚本里task_suite.n_tasks严格一致。

name字段直接对应 bddl 文件名(无.bddl后缀),例如:

pick_up_the_black_bowl_between_the_plate_and_the_ramekin_and_place_it_on_the_plate_table_15 └── 原版 base task ──────────────────────────────────────────────┘└ 后缀 ┘

4. ⚠️ instruction 带后缀这件事 (LIBERO-plus 的实现 quirk)

现象

评测时模型实际收到的 prompt 不是干净的指令,而是这种带后缀的字符串:

评测 task name模型收到的 instruction
pick_up_..._on_the_plate_table_15pick up ... on the plate table 15
pick_up_..._on_the_plate_tb_22pick up ... on the plate tb 22
pick_up_..._view_0_0_100_0_0_initstate_283pick up ... view 0 0 100 0 0 initstate 283

为什么

/data_disk1/hwl/LIBERO-plus/libero/libero/benchmark/__init__.py:46-72
grab_language_from_filename()当 task name不含_language_时,
直接做了:

language=" ".join(x.split("_"))# 把整段 filename 转空格returnlanguage[:language.find(".bddl")]

没有任何"剥掉 perturbation 后缀"的逻辑。所以扰动用的标识符直接成了 prompt 的一部分。

只有 task name 里含_language_标记的(Language Instructions类别,
共 1537 个)才会进if分支,真正去 bddl 文件里读language_instruction
字段——那个字段是论文作者手写的同义重述,用来测 prompt robustness。

影响

  • 训练时模型看到干净的 40 条指令 (tasks.jsonl里那种)
  • 评测时模型多见到table 15/initstate 363这些训练里从未出现的 token
  • 所有 LIBERO-plus 评测者都是这样,leaderboard 上的数都受同样影响,公平
  • 想做"清洗后的 upper bound"实验:可在Sai0Policy.get_action()加正则
    _table_\d+_tb_\d+_view_[\d_]+_initstate_\d+等剥掉后再喂模型。
    ⚠️ 一定要做成可选 flag 而不是默认行为,否则跟 leaderboard 不可比。

5. 训练 vs 评测的数据范围对比

┌─ 训练阶段 ─────────────────────────────────────────────────┐ │ 数据集: libero_plus_lerobot (LeRobot 格式) │ │ - total_tasks = 40 (4 suite × 10 base task) │ │ - total_episodes= 14347 (~358 demos / task) │ │ - total_frames = 2.24M │ │ - 指令: tasks.jsonl 里 40 条, 干净自然语言 │ │ - 图像: agentview + wrist (256×256, h264 编码) │ │ hidden states 提取: FLIP_IMAGES="false" (LeRobot 已为正向)│ └────────────────────────────────────────────────────────────┘ ┌─ 评测阶段 ─────────────────────────────────────────────────┐ │ benchmark: LIBERO-plus task_classification.json │ │ - libero_spatial: 2402 任务 │ │ - libero_object : 2518 │ │ - libero_goal : 2591 │ │ - libero_10 : 2519 │ │ - 合计 10030, 每个跑 1 次 │ │ prompt: 原版指令 + perturbation 后缀 (如 "table 15") │ │ 图像: LIBERO env 直出 (OpenGL 颠倒方向) │ │ 评测脚本里 FLIP_IMAGES=true 把图像翻 180° 才与训练对齐 │ └────────────────────────────────────────────────────────────┘

6. 资产目录结构 (踩过坑)

LIBERO-plus 的assets.zip解压后会带一段巨长的服务器路径,扩展资产被埋
在深路径里,需要合并到正确位置:

错误 (assets.zip 解压后) /data_disk1/hwl/LIBERO-plus/libero/libero/inspire/hdd/.../LIBERO-plus-0/assets/ └─ scenes/(263 个), new_objects/(416 个), ... 正确 (合并后) /data_disk1/hwl/LIBERO-plus/libero/libero/assets/ ├── scenes/ 263 项 (含 tabletop250/ 子目录 517 个) ├── new_objects/ 416 个 LIBERO-plus 独有物体 ├── articulated_objects/, stable_hope_objects/, ... └── textures/ 基础 + LIBERO-plus 扩展 549 项

修复办法:setup_libero_plus.py --merge_libero_plus_assets,会:

  1. 物化指向 conda env 的 symlink → 在原位变成实目录,内部仍逐项 symlink 回 conda env
  2. 把深路径里 LIBERO-plus 独有的项 symlink 进来 (零拷贝,不污染 conda env)

未合并时的症状:评测日志里大量

⚠️ Task XX 资产/bddl 缺失, 跳过: [Errno 2] No such file or directory: '.../scenes/tabletop_table_Cobblestone01_GLOSS_6K.xml'

7. 评测时的工程要点

7.1 单卡 vs 多卡

  • 每 task 1 trial,10K 个变体 → 单卡 spatial 大约要跑 5-8h
  • 多 GPU 时按 stride 切分: shard k 的 task_ids =range(n)[k::N]
  • 每张卡独立加载完整模型 + 独立写eval_results_<suite>_shardK_of_N.json
  • 全跑完后用merge_shard_results.py合并出eval_results_<suite>_merged.json

7.2 视频保存

  • cfg.save_videos and (local_run_idx % save_every == 0)才保存
  • local_run_idx当前 shard 内已实际跑过的 task 计数(不是绝对 task_id),
    避免多 GPU stride 切分下部分 shard 永远不命中的 bug
  • 路径:${VIDEO_DIR}/task_${task_id:05d}/${DATE}/${DATE_TIME}--episode=N--success={True/False}--task=...mp4

7.3 图像方向

  • LIBERO env 直出的obs["agentview_image"]是 OpenGL 渲染原方向 (颠倒)
  • 训练时 LeRobot 数据集已经是正向方向
  • 评测必须flip_images=True,backbone 内部翻 180° 才能跟训练对齐
  • 视频保存方向由独立的video_flip控制,跟flip_images解耦

7.4 Resume

评测 JSON 累计写入,中断后再跑会跳过episodes >= num_trials_per_task的 task。


8. 关键代码索引

功能文件关键行
benchmark 加载 / instruction 生成LIBERO-plus/libero/libero/benchmark/__init__.pygrab_language_from_filename()(line 46-72)
4 个 suite 的 task 数同上task_num = [2402, 2518, 2591, 2519, 90](line 102)
OFT1_0 评测主循环eval/Sai0_1/libero_plus/OFT1_0/eval_libero_plus.pyfor task_id in pbar:(~ line 940)
TaskClassificationInfo 加载同上line 400-434
metrics 聚合同上_aggregate_metrics()
任务 stride 切分同上_filter_task_ids()
多卡 launchereval/Sai0_1/libero_plus/OFT1_0/scripts/run_eval_libero_plus_multi_gpu.shfor SHARD_INDEX in ...循环
资产合并eval/Sai0_1/libero_plus/OFT1_0/setup_libero_plus.pymerge_libero_plus_assets()
录原始方向视频eval/Sai0_1/libero_plus/OFT1_0/tools/record_raw_env_video.py全文件

9. 一句话总结

LIBERO-plus = “把原版 LIBERO 的 40 个 task 沿 7 个扰动维度复制 250 倍 → 10030 个评测任务”,
专门用来看模型在新桌面、新光照、新初始位姿、新相机角度、新指令重述下还能不能完成同样的 base task,
模型仍然只用原版 40 task 的训练数据训。比 leaderboard 公平的代价是 prompt 里会带一些
filename 残留的 perturbation 标识符,所有人都受同样影响。

http://www.jsqmd.com/news/717996/

相关文章:

  • 【MATLAB源码】近场 XL-MIMO 一体化接入检测、信道估计与协作定位仿真平台
  • 一键克隆开发环境:告别重复搭建
  • 聊聊2026年GEO推广哪家效果好,杭州国技互联值得关注 - 工业推荐榜
  • 高通Snapdragon X75:5G Advanced技术解析与应用
  • DC‑1 靶机完整渗透思路 + 详细步骤(可直接复现)
  • 原力企业虾城市巡游——武汉站本周启幕!
  • 有没有懂电脑的
  • Hypnos-i1-8B开发环境配置:VSCode远程连接与调试教程
  • 文生图模型迭代洞察:共性与差异视角下,GPT-Image-2 的技术优势拆解
  • 429超过接口限频次数
  • LFM2.5-1.2B-Instruct实战指南:Gradio界面添加语音输入/输出扩展接口
  • XUnity.AutoTranslator:三步快速上手,轻松实现Unity游戏实时翻译
  • 2026年杭州有官方授权的小红书代运营机构费用多少钱 - 工业推荐榜
  • 盘点全球十大海底光缆,数字孪生赋能资产展示
  • GMI Cloud Inference Engine × OpenCode 配置秘籍奉上,拿捏 AI Coding!
  • 05华夏之光永存・开源:黄大年茶思屋榜文解法「23期 5题」 【分布式收发机设计专项完整解法】
  • 深聊2026年无人值守称重系统选购,郑州哪家公司口碑佳 - 工业推荐榜
  • 从效应思考一切
  • 表面贴装电阻热管理:原理、优化与实践
  • 终极指南:3步构建你的Windows微信智能助手,工作效率提升300%
  • Sliding Window(滑动窗口)
  • AI MV 高清无水印生成工具有哪些?零基础在线把歌曲做成 MV 的工具选择指南
  • 【稀缺首发】2024 Dev Containers兼容性矩阵图:Node.js 20/Python 3.12/Rust 1.78全版本支持状态+已验证镜像清单
  • 通过受管控的控制平面加速商品陈列优化
  • Cache映射计算
  • 2026年热门会议纪要神器实测对比转写整理全维度比拼,差距竟然这么大
  • 树莓派打造信息亭或工控面板?深度评测5款虚拟键盘(Matchbox/XVKBD等)的稳定性与定制化
  • Rust 操作 Redis 从入门到生产级应用
  • 5分钟终极指南:FF14过场动画跳过插件高效使用全解析
  • 记忆碎片化测试标准:软件测试领域的新兴挑战与应对框架