Index
2026-04-17 — Research

RoboCasa MG Split 구조 분석

GR00T-Dreams | HDF5 mask 기반 공식 서브셋 추출 방법론

TL;DR

1 배경 / 목적

IDM 학습에 사용할 RoboCasa MG-30 데이터를 추출하려면 공식 split 구조를 이해해야 한다. 단순히 "앞에서 30개"를 뽑으면 실제 benchmark와 다른 데이터가 될 수 있어, 공식 HDF5 mask를 기반으로 하는 올바른 추출 방법을 조사했다.

핵심 함정: RoboCasa MG-N은 랜덤 샘플링된 공식 서브셋이다. episode 0~N-1이 아님. 잘못 추출하면 공식 벤치마크와 다른 데이터로 학습하게 되어 비교가 불가능해진다.

2 작업 내용

HDF5 Mask 구조 확인

원본 HDF5 파일 내 mask 그룹에 모든 split tier가 정의되어 있다. 각 entry는 해당 tier에 포함된 demo의 문자열 ID 배열 (예: b'demo_1161').

import h5py f = h5py.File('demo_gentex_im128_randcams.hdf5', 'r') list(f["mask"].keys()) # → ['10_demos', '20_demos', '30_demos', '40_demos', '50_demos', '60_demos', # '70_demos', '75_demos', '80_demos', '90_demos', '100_demos', '125_demos', # '150_demos', '200_demos', '250_demos', '300_demos', '400_demos', '500_demos', # '600_demos', '700_demos', '800_demos', '900_demos', '1000_demos', '1500_demos', # '2000_demos', '2500_demos', '3000_demos'] f["mask"]["30_demos"][()] # → array([b'demo_1161', b'demo_1196', ...], dtype='|S9') # 번호순 앞 30개가 아님 — 랜덤 샘플링된 30개!

Demo ID ↔ Episode ID 매핑 검증

LeRobot 변환 시 demo_Nepisode_N으로 1:1 매핑됨을 프레임 수로 직접 검증했다.

HDF5 demo_0: 246 frames ↔ LeRobot ep_0: 246 frames ✓ HDF5 demo_1: 244 frames ↔ LeRobot ep_1: 244 frames ✓ HDF5 demo_2: 323 frames ↔ LeRobot ep_2: 323 frames ✓

따라서 HDF5 mask의 demo_N에서 N을 추출하면 곧바로 LeRobot episode_N에 대응된다.

공식 추출 함수

def get_official_mg_episodes(task_name, mg_size=30): """HDF5 mask에서 공식 MG-N demo ID 추출 → episode 번호 리스트 반환""" hdf5_path = task_to_hdf5[task_name] with h5py.File(hdf5_path, 'r') as f: mask_key = f"{mg_size}_demos" demo_ids = f["mask"][mask_key][()] episode_ids = sorted([int(d.decode().replace("demo_", "")) for d in demo_ids]) return episode_ids # task → HDF5 경로 매핑 base_hdf5 = "/home/nas_main/minhopark/datasets/robot/robocasa/v0.1/single_stage" hdf5_files = sorted(glob.glob(f"{base_hdf5}/**/mg/**/demo_gentex_im128_randcams.hdf5", recursive=True)) task_to_hdf5 = {hp.split("/single_stage/")[1].split("/mg/")[0].split("/")[-1]: hp for hp in hdf5_files}

3 결과

24개 Task HDF5 경로 목록

TaskCategoryHDF5 상대경로
CoffeePressButtonkitchen_coffee...2024-05-04-22-21-32/
CoffeeServeMugkitchen_coffee...2024-05-04-22-21-50/
CoffeeSetupMugkitchen_coffee...2024-05-04-22-22-13.../
CloseDoubleDoorkitchen_doors...2024-05-04-22-22-42.../
CloseSingleDoorkitchen_doors...2024-05-04-22-34-56/
OpenDoubleDoorkitchen_doors...2024-05-04-22-35-53/
OpenSingleDoorkitchen_doors...2024-05-04-22-37-39/
CloseDrawerkitchen_drawer...2024-05-09-09-32-19/
OpenDrawerkitchen_drawer...2024-05-04-22-38-42/
TurnOffMicrowavekitchen_microwave...2024-05-04-22-39-23/
TurnOnMicrowavekitchen_microwave...2024-05-04-22-40-00/
PnPCabToCounterkitchen_pnp...2024-07-12-04-33-29/
PnPCounterToCabkitchen_pnp...2024-05-04-22-12-27.../
PnPCounterToMicrowavekitchen_pnp...2024-05-04-22-13-21.../
PnPCounterToSinkkitchen_pnp...2024-05-04-22-14-06.../
PnPCounterToStovekitchen_pnp...2024-05-04-22-14-20/
PnPMicrowaveToCounterkitchen_pnp...2024-05-04-22-14-26.../
PnPSinkToCounterkitchen_pnp...2024-05-04-22-14-34.../
PnPStoveToCounterkitchen_pnp...2024-05-04-22-14-40/
TurnOffSinkFaucetkitchen_sink...2024-05-04-22-17-26/
TurnOnSinkFaucetkitchen_sink...2024-05-04-22-17-46/
TurnSinkSpoutkitchen_sink...2024-05-09-09-31-12/
TurnOffStovekitchen_stove...2024-05-08-09-20-45/
TurnOnStovekitchen_stove...2024-05-08-09-20-31/
nested 구조 검증: MG-30 ⊂ MG-100 ⊂ ... ⊂ MG-3000 — MG-30에 포함된 에피소드는 모든 상위 split에도 포함됨. 일관성 있는 데이터 확장 가능.
Coffee 계열 주의: CoffeePressButton, CoffeeServeMug, CoffeeSetupMug의 30_demos가 동일 ID를 공유하는 것으로 보아 같은 seed로 생성됐을 가능성이 있음.

4 Takeaway

공식 split 추출 방법 확립

prepare_idm_mg30_dataset.py에서 이 방법으로 공식 MG-30 episode를 추출해 IDM 학습에 사용했다. 향후 MG-100, MG-300, MG-3000으로 확장할 때도 동일한 get_official_mg_episodes(task, mg_size=N) 함수를 재사용할 수 있다.

데이터 경로가 복수의 연구자(hyojinjang, minhopark) NAS에 분산되어 있어 경로 확인이 필요한 시점마다 이 문서가 기준점이 된다.

5 Next Steps

MG-3000 추출 및 검증

동일 함수로 mg_size=3000을 사용해 ~72,000 ep 전체를 추출. Coffee 계열 동일 seed 이슈가 MG-3000에도 영향 있는지 확인 필요.

LeRobot 병합 스크립트 일반화

현재 prepare_idm_mg30_dataset.py는 MG-30 고정. mg_size 파라미터를 받아 임의의 split을 추출할 수 있도록 일반화.