2데이터 형식
/home/nas_main/datasets/robot/EgoDex/lerobot_v3/<split>/
meta/info.json, meta/tasks.parquet, meta/episodes/chunk-000/file-000.parquet, meta/egodex_hand_stats.npy
data/chunk-CCC/file-FFF.parquet (100 ep / file)
videos/observation.images.head/chunk-CCC/file-FFF.mp4 (640x360, 30 fps, H.264 CRF 20, GOP 15)
per frame: observation.camera.cam2world(16) · hand.{l,r}.joints(26x3) · wrist_rot6d(6) · conf(26, -1=없음) · in_fov
per episode: prompt(llm_description / _2), EgoDex attrs 전부, intrinsics(640x360), has_confidences, conf/fov 통계
| 항목 | test split 값 |
| 에피소드 / 프레임 / 프롬프트 | 3,243 / 826,253 / 1,285 |
| 크기 | 영상 2.3 GB + 라벨 739 MB (≈ 2.9 + 0.9 KB/frame) |
| 길이 | 중앙 5.4 s (p5 1.7, p95 23.3), 33 frame 미만 16 ep |
| confidence 있음 | 86% (basic_fold, pour, stack, wipe_screen 등 task 단위로 없음) |
| 손목 in-FOV (L/R) | 0.72 / 0.74 |
| 손목 conf 평균 (L/R) | 0.87 / 0.96 · Metacarpal conf 항상 0 · 손끝 conf 중앙 0.24–0.6 |

변환 결과 영상(640×360) 위에 저장 라벨을 직접 투영 (흰색 = conf < 0.5). 원본 대비 PSNR 37–41 dB, 다음 프레임 대비 34–38 dB → off-by-one 없음.
3OpenWAM 리더 egodex_hand
- 33행 window: proprio = row 0, action[t] = row t+1 state (32 × 30 Hz), 영상 9프레임(4행 간격), 576×320 단일 뷰.
- raw 48-D (손별): 손목 xyz + rot6d — window 첫 행 카메라 기준 (머리가 움직여도 chunk가 한 좌표계) · 손끝 5개 xyz — 손목 좌표계.
- 마스크: 손목 conf < 0.5인 step·손 마스킹 (base가 시간축 마스크를 지원하지 않아
_finalize_action override). unify 80-D: 손목 → 0–8/34–42, 손끝 → 10–24/44–58.
- 정규화 min-max (min/max = 0.1/99.9 퍼센타일, rot6d 통과). split들은 bucket으로 묶고 통계 1개 공유.
| 검증 | 결과 |
| raw 역변환 (손끝 world 위치) | 최대 0.0004 mm |
| min-max 왕복 (clip 포함) | 중앙 0 · p95 1.4 mm · 최대 19.9 mm; 1% 넘게 clip되는 dim 1개 (1.4%) |
| 샘플 | action (32, 80), mask 0.60 (= 48/80, 양손 유효), proprio (1, 80), 9 × 576×320, 826,253 window |

리더 출력: 정규화된 action을 되돌려 각 영상 프레임의 카메라로 옮겨 그림 (파랑 = 왼손, 빨강 = 오른손; 각 샘플 9프레임 중 1–8번째).
두 번째·세 번째 샘플처럼 손목·손끝이 수 cm 어긋나는 경우는 저장된 joints를 직접 투영해도 똑같음 → 리더가 아니라 EgoDex 라벨 자체 오차 (손이 카메라에 매우 가까울 때 wrist z 6–12 cm, 손목 부근).

같은 window의 저장 라벨 직접 투영 (위: thread_unthread_bead_necklace/38, 아래: clean_tableware/26).