メインコンテンツまでスキップ
ステージ 4 · 第 20 章 · 実践

20. SO-ARM VLA データセットの準備

ステージ 3 の LeRobot データセットを GR00T 対応の VLA データセットへ変換します:言語アノテーション、meta/modality.json、new_embodiment タグと so100_dualcam 設定、次元検証、マルチタスク構成。

⚡ コード不要 · 環境構築不要

セットアップをスキップして — reBot Arm と LeRobot を 1 つのアプリから実行

SenseCraft Robotics は、SO-ARM101、reBot Arm 102 + B601-RS および B601-DM 向けの Seeed のノーコードプラットフォームです。アームを接続し、キャリブレーションを行い、デモを収集し、ガイド付きインターフェースから学習と推論を実行できます — Python 環境もターミナルも不要です。

  • ✅ 6 ステップのガイド付きワークフロー
  • ✅ クラウド学習 — ローカル GPU 不要
  • ✅ Windows / macOS クライアント
  • ✅ SO-ARM101 · B601-RS · B601-DM

20.1 前提条件​

前提

20.1 前提条件

必要なもの:

  • ステージ 3 で録画したクリーンな SO-ARM データセット(第 11〜13 章):2 カメラ視点(front + side)、50 Episode 以上、1 Episode 1 タスク、品質チェック済み;
  • 訓練マシンにクローン済みの Isaac-GR00T リポジトリ(第 21 章で完全な環境を構築 — 本章はデータセットファイルだけ編集します);
  • 参照レシピ:GR00T N1.5 を SO101 に微調整。
ヒント

既存の ACT データセットがそのまま原材料です — GR00T は同じ LeRobot エピソードを再利用します。本章で追加するのは言語とモダリティのメタデータだけです。

20.2 LeRobot データセットの確認​

確認

20.2 LeRobot データセットの確認

データセットのディレクトリ構造​

~/.cache/huggingface/lerobot/seeedstudio123/test/
├── meta/
│ ├── info.json ← fps、特徴量、カメラキー、ロボット情報
│ ├── tasks.jsonl ← タスク記述(ここを編集!)
│ ├── episodes/... ← Episode ごとのメタデータ
│ └── stats/... ← 正規化統計
├── data/ ← parquet フレーム:観測 / 状態 / アクション
└── videos/ ← カメラストリーム

Python でクイックチェック​

from lerobot.common.datasets.lerobot_dataset import LeRobotDataset

ds = LeRobotDataset("seeedstudio123/test", root="~/.cache/huggingface/lerobot")
print(ds.meta.info) # fps、特徴量
print(ds[0]["observation.state"].shape) # 期待値 torch.Size([6])
print(ds[0]["action"].shape) # 期待値 torch.Size([6])

必須チェックリスト​

  • observation.state と action がどちらも 6 次元(5 関節 + グリッパ);
  • 画像特徴がちょうど 2 つ(例:observation.images.front / observation.images.side);
  • 各 Episode が意味のある 1 つのタスク記述に属している;
  • 既知の壊れた Episode は除去済み(第 13 章)。

20.3 言語タスク記述の追加​

言語

20.3 言語タスク記述の追加

方法 A:録画時に直接書く(推奨)​

ステージ 4 用に新しいデータセットを録画する場合、録画時の --dataset.single_task で指示をバインドします:

--dataset.single_task="Pick up the block at point A and place it at point B"

1 タスク = 動詞で始まる短い 1 文 — そのままタスクのメタデータに入ります。

方法 B:meta/tasks.jsonl を遡って記入​

既存データセットの場合、meta/tasks.jsonl を編集し、各タスクインデックスを適切な指示文へ対応させます。対応は安定させましょう:モデルが学ぶのはこれらの文字列そのものです。

言語アノテーションのガイドライン​

  1. 1 タスク = 1 つの固定文。同じタスクが 2 つの言い方で現れないように;
  2. 動詞開始で具体的に:「ブロックを箱に入れて」は「ブロックの取り扱い」より良い;
  3. 中国語・英語どちらも可 — GR00T の VLM は両方扱えます — ただし 1 タスク内で言語を混ぜない。

20.4 meta/modality.json の作成​

モダリティ

20.4 meta/modality.json の作成

modality.json は、どのデータセットフィールドをどのモデル入力へ供給するかを GR00T に伝えます。SO-ARM の標準 2 カメラ構成は公式 so100_dualcam データ設定に対応します。ローカルデータセット用の最小等価物は次の通りです:

{
"state": {
"single_arm": [0, 5],
"gripper": [5, 6]
},
"action": {
"single_arm": [0, 5],
"gripper": [5, 6]
},
"video": {
"front": "observation.images.front",
"side": "observation.images.side"
},
"annotation": {
"human.task_description": "task_description"
}
}

フィールド説明​

フィールド意味
state.single_armobservation.state の 5 関節スライス [開始, 終了)
state.gripperグリッパ次元のスライス
action.*action ベクトルの同じスライス
videoカメラキー → データセット特徴名(録画キーと 1 文字まで一致必須)
annotation.human.task_description言語指示の参照元(第 18 章の推奨キー)
注記

Isaac-GR00T リポジトリの so100_dualcam 設定がこのファイルの正本です — 構成が標準(2 カメラ、6 次元状態 / アクション)に一致するなら、自分でコピーを維持するより訓練時に --data-config so100_dualcam を渡す方が良いです。

20.5 本体タグの設定​

本体

20.5 本体タグの設定

SO-ARM は新しい本体として微調整します:タグ new_embodiment。これをデータセット自体に書くことはほとんどありません — 訓練 / 推論の引数です(第 21 章:推論サービスの --embodiment-tag new_embodiment、SO101 微調整レシピは訓練時に設定)。

データセット段階で本当に重要なのは、データ設定が事実と一致していること:2 カメラ、6 次元状態 / アクション(20.2 で検証)。

20.6 関節順序とデータ次元の確認​

検証

20.6 関節順序とデータ次元の確認

ステップ 1:データセットのメタ情報を印刷​

特徴量リストと次元を確認(20.2 の Python スニペット参照):状態 / アクションが 6/6、画像特徴が 2 つ。

ステップ 2:モダリティスライスの確認​

カスタム modality.json を書いた場合、スライスは [0,6) を正確にカバーし、隙間や重複がない必要があります。

ステップ 3:データの可視化​

lerobot-dataset-viz \
--repo-id seeedstudio123/test \
--mode local \
--episode-index 0

確認ポイント:正しいカメラの画像か、把持時にグリッパ次元が実際に開閉しているか、関節が妥当な順序で動いているか。

ステップ 4:統計チェック​

meta/stats の状態 min / max はキャリブレーションされた関節範囲内にあるべきです。画像の平均輝度が 0 や 255 に近くないこと(黒画や白飛びの録画)。

20.7 マルチタスクデータセットの構成​

マルチタスク

20.7 マルチタスクデータセットの構成

方法 A:同じ repo_id、複数の task_index(推奨)​

複数タスクを 1 つのデータセットに録画します。各エピソードは task_index を保存し、tasks.jsonl が各インデックスを指示文へ対応させます。これが言語条件微調整の自然な形です。

方法 B:複数データセットの統合​

第 13 章ツールボックスで統合(--operation.type merge)。有効な統合の条件:カメラ構成が同一、ロボット / 特徴量の構成が同一、そして各ソースデータセットのタスク文が互いに異なり、それぞれ一貫していること。

データ量の推奨​

構成Episode 数備考
単一タスク、固定 A→B約 50微調整フローの検証
単一タスク、位置のばらつき50〜100ステージ 3 のデフォルト量
マルチタスク(3〜5 タスク)タスクごとに 50〜100言語条件には各タスクのカバーが必要

20.8 データ品質チェックリスト​

チェックリスト

20.8 データ品質チェックリスト

  • 各 Episode に正しい、一意の指示文がある;
  • modality.json のカメラキーがデータセット特徴と 1 文字まで一致;
  • state / action が 6 次元でスライスが正しい(single_arm / gripper);
  • 失敗・外れ値の Episode は削除済み(第 13 章);
  • 統計が存在する(meta/stats)— 録画途中で kill されたセッションで訓練しない;
  • 第 21 章の作業開始前に最終データセットをバックアップ済み。

データセットの準備完了 — 次章はこの上で GR00T を微調整します。

Loading Comments...