# LIBERO

  The commands below run the simulator locally. To keep its dependencies away from your policy's, serve it instead with `lerobot-env-server --config_path=docker/sim/configs/libero.yaml --sim.task= --docker=true`, where `` is the command's `--env.task`, and add `--env.server.endpoint=tcp/127.0.0.1:7448` to the command. A server runs the task it was started with (see [Simulation: local or served](./simulation)).

LIBEROは、**ロボットの生涯学習**を研究するために設計されたベンチマークです。これは、ロボットが一度だけ事前学習を受けるだけでなく、ユーザーとともに時間とともに学習し適応し続ける必要があるという考えに基づいています。LIBEROは、**知識転移**に焦点を当てた標準化された操作タスクのセットを提供します。つまり、ロボットがすでに学んだことを新しい状況にどの程度適用できるかという点です。LIBEROでの評価により、異なるアルゴリズムを公平に比較でき、研究者は互いの研究を基盤として発展させることができます。

- 論文: [Benchmarking Knowledge Transfer for Lifelong Robot Learning](https://arxiv.org/abs/2306.03310)
- GitHub: [Lifelong-Robot-Learning/LIBERO](https://github.com/Lifelong-Robot-Learning/LIBERO)
- プロジェクトウェブサイト: [libero-project.github.io](https://libero-project.github.io)

![An overview of the LIBERO benchmark](https://libero-project.github.io/assets/img/libero/fig1.png)

## 利用可能なタスク

LIBEROには、単純なオブジェクト操作から複雑なマルチステップシナリオまで、**130のタスク**をカバーする**5つのタスクスイート**が含まれています:

| スイート          | CLI名         | タスク | 説明                                        |
| -------------- | ---------------- | ----- | -------------------------------------------------- |
| LIBERO-Spatial | `libero_spatial` | 10    | 空間的な関係について推論を必要とするタスク  |
| LIBERO-Object  | `libero_object`  | 10    | 異なるオブジェクトを操作するタスク   |
| LIBERO-Goal    | `libero_goal`    | 10    | ターゲットが変化するゴール条件付きタスク       |
| LIBERO-90      | `libero_90`      | 90    | LIBERO-100コレクションからの短期間タスク |
| LIBERO-Long    | `libero_10`      | 10    | LIBERO-100コレクションからの長期ホライズンタスク  |

## インストール

LeRobotのインストール手順に従った後:

```bash
pip install -e ".[libero]"
```

LIBEROにはLinux（`sys_platform == 'linux'`）が必要です。LeRobotはシミュレーションにMuJoCoを使用します。学習または評価の前に、レンダリングバックエンドを設定してください：

```bash
export MUJOCO_GL=egl  # for headless servers (HPC, cloud)
```

## 評価

### デフォルトのローカル評価

4つの標準スイート全体で評価します（タスクごとに10エピソード）：

```bash
lerobot-eval \
  --policy.path="your-policy-id" \
  --env.type=libero \
  --env.task=libero_spatial,libero_object,libero_goal,libero_10 \
  --eval.batch_size=1 \
  --eval.n_episodes=10 \
  --env.max_parallel_tasks=1
```

### 単一スイートの評価

1つのLIBEROスイートで評価する:

```bash
lerobot-eval \
  --policy.path="your-policy-id" \
  --env.type=libero \
  --env.task=libero_object \
  --eval.batch_size=2 \
  --eval.n_episodes=3
```

- `--env.task` はスイート（`libero_object`、`libero_spatial` など）を選択します。
- `--env.task_ids` を使用すると、特定のタスクのインデックス（`[0]`、`[1,2,3]` など）に限定できます。省略すると、スイート内のすべてのタスクが実行されます。
- `--eval.batch_size` は、並列で実行される環境の数を制御します。
- `--eval.n_episodes` は、タスクごとに実行するエピソード数を設定します。

### マルチスイート評価

カンマ区切りのリストを渡すことで、複数のスイートにまたがってポリシーをベンチマークできます:

```bash
lerobot-eval \
  --policy.path="your-policy-id" \
  --env.type=libero \
  --env.task=libero_object,libero_spatial \
  --eval.batch_size=1 \
  --eval.n_episodes=2
```

### 制御モード

LIBEROは2つの制御モードをサポートしています。`relative`（デフォルト）と`absolute`です。異なるVLAチェックポイントは異なるアクションのパラメータ化で学習されているため、ポリシーにモードが一致していることを確認してください。

```bash
--env.control_mode=relative   # or "absolute"
```

### パフォーマンスのリセット

デフォルトでは、LeRobotはLIBEROのハードリセットの動作を保持します。固定初期状態を有効にすると、エピソードごとにシミュレータモデルとレンダラーを再構築することをスキップするために、ソフトリセットを選択できます。

```bash
--env.init_states=true --env.hard_reset=false
```

ソフトリセットは高速ですが、環境の安定化ステップ以降はハードリセットとビット単位で同一にはなりません。そのため、カメラの観測値やポリシーの結果がわずかに異なる場合があります。ベンチマークの結果を再現する場合は、ハードリセットを使用してください。

### ポリシーの入力と出力

**観察結果:**

- `observation.state` — 8次元のプロプライオセプティブ特徴量（eef位置、軸角方向、グリップa qpos）
- `observation.images.image` — メインカメラの映像（`agentview_image`）、HWC uint8
- `observation.images.image2` — 手首カメラの映像（`robot0_eye_in_hand_image`）、HWC uint8

  LeRobot は視覚特徴に対して `.images.*` プレフィックスを強制します。ポリシー設定の `input_features` が同じ命名キーを使用していること、およびデータセットのメタデータキーがこの規約に従っていることを確認してください。データに異なるキーが含まれている場合は、命名キーは正規化統計層にエンコードされているため、ポリシーが期待するものに合わせて観測値の名前を変更する必要があります。

**アクション:**

- `Box(-1, 1, shape=(7,))` における連続制御 — 6次元のエンドエフェクターのデルタ + 1次元のグリップ

### 推奨される評価エピソード

再現可能なベンチマークのために、4つの標準スイート（Spatial、Object、Goal、Long）すべてで、**タスクごとに10エピソード**を使用してください。これにより合計400エピソードとなり、公開された結果で使用されたプロトコルと一致します。成功率は評価シードによって数パーセント変動する可能性があるため、3つのシードで平均を取ることをお勧めします。

`lerobot-eval` は、すべての成功率の隣に 95% の Wilson 信頼区間（`pc_success_ci95`）を報告します。10 エピソードでタスクのスコアが 9/10 の場合、区間はおよそ 60% から 98% となり、400 エピソードのスーートの合計が 80% の場合、区間はおよそ 76% から 84% となります。あるタスクで信頼区間が重なる 2 つのポリシーは、その実行ではそのタスクで差があるとは示されていません。この区間は、どのエピソードが抽出されたかをカバーしますが、ポリシーの学習シードはカバーしません。学習シードを測定するには、1 回以上の学習実行が必要です。

  同じエピソードで2つのポリシーを比較するには、同じ`--seed`を使用し、`--env.init_states=true`を維持したまま、各タスクを単一のバッチで実行します（`--eval.batch_size`を各タスクのエピソード数に等しくします）。

## トレーニング

### データセット

前処理済みのLIBEROデータセット2つは、LeRobotと完全に互換性があります。これらは同じスキーマを持つ同じデモを含んでおり、カメラフレームの保存方法が異なります:

|                           | [lerobot/libero](https://huggingface.co/datasets/lerobot/libero) | [HuggingFaceVLA/libero](https://huggingface.co/datasets/HuggingFaceVLA/libero) |
| ------------------------- | ---------------------------------------------------------------- | ------------------------------------------------------------------------------ |
| エピソード / フレーム / タスク | 1,693 / 273,465 / 40                                             | 1,693 / 273,465 / 40                                                           |
| カメラ                   | 2× 256×256×3                                                     | 2× 256×256×3                                                                   |
| 状態 / 行動の次元       | 8 / 7                                                            | 8 / 7                                                                          |
| データセット形式            | v3.0                                                             | v3.0                                                                           |
| カメラエンコーディング           | MP4動画                                                        | parquet 形式の PNG                                                                 |
| ダウンロードサイズ             | **1.9 GB**                                                       | 69.9 GB                                                                        |
| 追加の依存関係          | ビデオバックエンド（`torchcodec`または`pyav`）                           | なし                                                                           |

**[lerobot/libero](https://huggingface.co/datasets/lerobot/libero)を推奨します**: **ダウンロードサイズが37分の1に**縮小され、**読み込み速度は同等**（ワーカーあたり約330サンプル/秒）です。動画の再エンコードはわずかに劣化します。動画デコードバックエンドをインストールできない場合は、画像ベースのバリアントを使用してください。

参考として、Physical Intelligence が公開した元のデータセットは以下の通りです：

- [physical-intelligence/libero](https://huggingface.co/datasets/physical-intelligence/libero)

結果を報告する際は、`--dataset.revision=<commit-sha>` を固定してください。Hub のデータセットは再アップロードされる可能性があるため、成功率は同じデータのリビジョン同士でのみ比較可能です。

### トレーニングコマンの例

推奨データセットでSmolVLAを学習します:

```bash
lerobot-train \
  --policy.type=smolvla \
  --policy.load_vlm_weights=true \
  --policy.push_to_hub=false \
  --dataset.repo_id=lerobot/libero \
  --dataset.video_backend=torchcodec \
  --output_dir=./outputs/libero_smolvla \
  --steps=100000 \
  --batch_size=64
```

Hub に結果を共有するには、`--policy.push_to_hub=false` を `--policy.repo_id=${HF_USER}/libero-smolvla` に置き換えてください。保存されたチェックポイントは、[評価](#evaluation)セクションに示されているように `lerobot-eval` で評価できます。

## 公開された結果の再現

LIBEROベンチマークにおけるPi0.5の結果を再現します。Physical IntelligenceのLIBEROベースモデル（`pi05_libero`）を使用し、[HuggingFace LIBEROデータセット](https://huggingface.co/datasets/HuggingFaceVLA/libero)を用いて、8枚のH100 GPU上でバッチサイズ256、bfloat16で追加6kステップのファインチューニングを実行しました。

ファインチューニング済みモデル: [lerobot/pi05_libero_finetuned](https://huggingface.co/lerobot/pi05_libero_finetuned)

### 評価コマンド

```bash
lerobot-eval \
  --output_dir=./eval_logs/ \
  --env.type=libero \
  --env.task=libero_spatial,libero_object,libero_goal,libero_10 \
  --eval.batch_size=1 \
  --eval.n_episodes=10 \
  --policy.path=lerobot/pi05_libero_finetuned \
  --policy.n_action_steps=10 \
  --env.max_parallel_tasks=1
```

`n_action_steps=10`を設定し、元のOpenPI実装と一致させました。

### 結果

| モデル               | LIBERO Spatial | LIBERO Object | LIBERO Goal | LIBERO 10 | 平均  |
| ------------------- | -------------- | ------------- | ----------- | --------- | -------- |
| **Pi0.5 (LeRobot)** | 97.0           | 99.0          | 98.0        | 96.0      | **97.5** |

これらの結果は、Physical Intelligenceが報告した[元の結果](https://github.com/Physical-Intelligence/openpi/tree/main/examples/libero#results)と一致しています:

| モデル              | LIBERO Spatial | LIBERO Object | LIBERO Goal | LIBERO 10 | 平均   |
| ------------------ | -------------- | ------------- | ----------- | --------- | --------- |
| **Pi0.5 (OpenPI)** | 98.8           | 98.2          | 98.0        | 92.4      | **96.85** |

