Skip to content

feat: import_lerobot に LeRobotConverter を追加(取り込みのカスタマイズ)#285

Open
rikunosuke wants to merge 1 commit into
mainfrom
feat-lerobot-import-converter
Open

feat: import_lerobot に LeRobotConverter を追加(取り込みのカスタマイズ)#285
rikunosuke wants to merge 1 commit into
mainfrom
feat-lerobot-import-converter

Conversation

@rikunosuke

Copy link
Copy Markdown
Contributor

概要

Client.import_lerobot(LeRobot v3 → FastLabel 取り込み)に、カスタマイズ点をフックとして開放する LeRobotConverter を追加しました。全体フロー(episode ループ・タスク作成・アップロード・後処理)は Client が保持し、ユーザーは必要な hook だけを override します。

from fastlabel import Client
from fastlabel.lerobot import LeRobotConverter

class JointsOnlyConverter(LeRobotConverter):
    CAMERA_KEYS = ("cam_high", "cam_low", "cam_left_wrist", "cam_right_wrist")

    def select_observation_state_names(self, names):        # 関節値(.pos)だけ残す
        return [n for n in names if n.endswith(".pos")]

    def build_telemetry_frame(self, frame):                 # gripper を追加
        t = super().build_telemetry_frame(frame)
        t["gripper"] = self.build_action(frame)[-1]
        return t

    def build_task_kwargs(self, *, episode_index, episode_name, frames):
        return {"tags": ["lerobot"], "metadatas": [{"key": "n", "value": str(len(frames))}]}

client = Client()
client.import_lerobot(project="slug", lerobot_data_path="/path", converter=JointsOnlyConverter)

追加した hook(LeRobotConverter

hook 役割
OBSERVATION_STATE_NAMES / ACTION_NAMES / CAMERA_KEYS(class var, tuple) 宣言的な選別
select_observation_state_names / select_action_names 残す feature 名を動的選別(name→index は SDK が __init__ で1回解決)
build_observation_state / build_action / build_telemetry_frame telemetry の値・項目を構築
select_cameras 登録する動画を選別(Camera: path/key/content_name
build_task_kwargs create_robotics_task へ渡す tags/metadatas
select_episodes episode 選別(index→frame数 のみ受け取り、dataset version 非依存)
build_episode_name タスク / 成果物の命名

converter はクラス/ファクトリで渡し、SDK が meta/info.json 付きで生成します(デフォルトは LeRobotConverter=従来と同一の全件取り込み)。

設計上のポイント

  • 疎結合: converter(ポリシー, version 非依存) / v3(version 固有のデータアクセス) / common(version 非依存の共有カーネル) / Client(オーケストレーション) を分離。converterv3 に依存しません。
  • 名前ベースの選別: meta/info.json の feature 名で選別できるため、巨大な observation.state(例 12014 次元)を関節値のみへ、カメラを主要4つのみへ、といった絞り込みが可能。
  • 一時ファイル: with tempfile.TemporaryDirectory で管理。ZIP はタスク作成前に生成し orphan task を回避。
  • エラー方針: 想定内 (FastLabelException) は per-episode 記録して継続、想定外(接続エラー等)は伝播。

後方互換

  • import_lerobot(project, lerobot_data_path, episode_indices=...) は従来通り動作(converter 省略時は全件・全カメラ)。
  • 破壊的変更: fastlabel.lerobot.format_episode_name を削除(命名は LeRobotConverter.build_episode_name に統合)。converter 経由の取り込みは meta/info.json を要求します。

テスト

  • tests/test_lerobot_converter.py(新規, 純ロジック)+ tests/test_lerobot_v3_parquet.py 更新。
  • Python 3.10 で pytest tests/72 passed、flake8 / black / isort 通過。

🤖 Generated with Claude Code

Client.import_lerobot に LeRobot v3 → FastLabel 取り込みのカスタマイズ点を
フックとして開放する LeRobotConverter を追加。

- LeRobotConverter(新規, pure strategy)。SDK が meta/info.json 付きで
  __init__ 生成(クラス/ファクトリを渡す)。全体フロー(ループ・タスク作成・
  アップロード・後処理)は Client が保持し、converter は hook のみ:
  - select_observation_state_names / select_action_names: 残す feature 名を
    選ぶ(name→index 変換は SDK が __init__ で1回だけ解決)
  - build_observation_state / build_action / build_telemetry_frame:
    telemetry の値・項目(gripper 等)を構築
  - select_cameras: 登録動画を選別(Camera: path/key/content_name)
  - build_task_kwargs: create_robotics_task へ渡す tags/metadatas 等
  - select_episodes: episode 選別(index→frame数のみ, v3 非依存)
  - build_episode_name: タスク/成果物の命名
- import_lerobot(converter=LeRobotConverter)。一時ディレクトリは
  with tempfile.TemporaryDirectory で管理。ZIP はタスク作成前に生成し
  orphan task を回避。想定内 (FastLabelException) は per-episode 記録、
  想定外は伝播。
- レイヤ疎結合化: converter は v3 非依存 / v3 は version 固有データアクセス /
  common は version 非依存の共有カーネル。info.json の feature 名で name
  ベース選別が可能(例: observation.state を ".pos" のみ、カメラを主要4つ)。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant