Index
2026-05-07 — Engineering

Validation GT-vs-Pred 그리드 레이아웃 4-row×2-col 개선

EgoX v2 (exp3) | robocasa_grid.py · trainer.py · infer.py

TL;DR

3/3
Smoke Tests OK
3
파일 수정
1
신규 helper

1 배경 / 목적

robocasa T2V validation 및 inference의 비교 mp4 (*_gt_vs_pred.mp4)는 기존에 아래 레이아웃을 사용했다:

기존 레이아웃 (위/아래 = GT/Pred): ┌───────────────────────────┐ │ exo_rgb_gt │ ego_rgb_gt │ ← top half (GT) │ exo_pt_gt │ ego_pt_gt │ ├─────────────┼─────────────┤ │ exo_rgb_pred│ ego_rgb_pred│ ← bottom half (Pred) │ exo_pt_pred │ ego_pt_pred │ └───────────────────────────┘
기존 한계: 같은 view·modality의 GT와 Pred가 화면 상하로 크게 떨어져 있어, 특히 ego PT outlier 디버깅 시 육안 비교가 불편했음. view2 PT outlier (pred cluster가 GT 대비 수백 m 오프셋) 분석이 주요 계기.

2 작업 내용

좌/우 = GT/Pred, 위아래 = 4 rows(v1_rgb / v1_pt / v2_rgb / v2_pt) 구조로 재배열하는 helper를 신규 작성하고, validation/inference 두 경로에 적용했다.

새 레이아웃 (좌/우 = GT/Pred): ┌─────────────────┬──────────────────┐ │ exo_rgb_gt │ exo_rgb_pred │ row 1 │ exo_pt_gt │ exo_pt_pred │ row 2 │ ego_rgb_gt │ ego_rgb_pred │ row 3 │ ego_pt_gt │ ego_pt_pred │ row 4 └─────────────────┴──────────────────┘ (robocasa: view1=exo=robot0_agentview_left, view2=ego=robot0_eye_in_hand)

변경 파일 3곳

파일변경 내용
core/finetune/utils/robocasa_grid.py신규 helper compose_gt_pred_panels(gt_grid, pred_grid, view1_w, view2_w, use_pointmap) 추가. view1_w ≠ view2_w면 raise.
core/finetune/trainer.py (line 852~)기존 np.concatenate([gt_grid, pred_grid], axis=1)compose_gt_pred_panels(...) 호출
infer.py (_main_wan_t2v_robocasa, line 193~)동일 변경. import 추가, docstring 갱신

use_pointmap=False이면 PT row 생략 → 2-row × 2-col. Frame count는 min(F_gt, F_pred)로 자동 align. validation과 inference가 단일 helper를 공유해 레이아웃 정의가 한 곳에만 존재한다.

적용 범위 한정: egoexo4d/droid HCPT validation (sft_trainer.py:977) 및 core/inference/wan.py HCPT comparison은 미적용 — RGB-only 가로 concat 형식으로 요청 컨텍스트와 다른 레이아웃. 범위를 명시적으로 좁혀서 회귀 위험 최소화.

3 결과

compose_gt_pred_panels smoke test — 각 panel slot을 다른 uint8 값으로 마킹 후 픽셀 read-back으로 위치 검증:

케이스입력 shape출력 shapepanel 위치 확인
HCPT (use_pointmap=True), F=4, H=216, W=384gt/pred = (4,432,768,3)(4,864,768,3)8/8 OK
RGB-only (use_pointmap=False), F=4gt/pred = (4,216,768,3)(4,432,768,3)4/4 OK
view1_w=384, view2_w=288 (불일치)raises ValueErrorOK (의도적 raise)
모든 panel slot 검증 통과: 각 row의 GT/Pred 값이 의도한 좌/우 위치에 정확히 배치됨. robocasa configs(384/384) 기준 view width 조건도 통과.
미검증 항목: 실제 학습 데이터로 imageio mp4 렌더링은 미검증 (smoke test는 numpy panel 마킹만). 변경 후 첫 validation/inference run에서 실제 mp4 확인 필요.

4 Takeaway

시각적 디버깅 효율 개선

ego PT 채널의 좌표 misalignment 문제(view2 outlier — GT depth invalid pixel이 norm.json 통계를 오염시켜 pred cluster를 GT 기준 수백 m 밖에 위치시키는 버그) 분석 시, 동일 view·modality GT/Pred를 시간축으로 직접 비교할 수 있어 오프셋 크기와 분포를 육안으로 즉시 확인 가능해진다.

helper를 robocasa_grid.py에 분리해 validation과 inference가 단일 layout 정의를 공유 — 향후 레이아웃 수정 시 한 곳만 변경하면 됨.

5 Next Steps

미해결 한계

view1_w ≠ view2_w 데이터셋 (egoexo4d, droid)에는 적용 불가 — row-wise width padding 추가 필요. 현재는 명시적 ValueError raise. 사용 시작 시 확장 예정.

다음 작업

변경 후 첫 validation run(또는 infer.py 실행)에서 실제 mp4 렌더링 확인. 이후 view2 PT outlier 수정(depth invalid pixel masking / norm.json 재추출) 작업과 맞물려 새 레이아웃으로 before→after 시각 비교 예정.