Index
2026-05-13 — Progress

viz_superset.py chain 모드 + 12-lab UUID 교체

EgoX v2 (EgoX2_exp1) | viz_superset.py — cam2cam chain 계산으로 3-panel symmetric 비교 달성

TL;DR

0.04°
TRI ΔR (chain vs Pred)
0.0 mm
TRI Δt
12
디폴트 UUID (lab)
+30줄
추가 코드

1 배경 / 목적

전날(260512) 추가한 --ext_source extrinsics 모드는 cam2base_extrinsics.json을 사용하는데, 이 JSON은 uuid당 ext1 혹은 ext2 중 한 serial만 수록되어 있다. 결과적으로 extrinsics 모드의 mp4는 2-panel(GT + 단일 ext)이 되어 superset 3-panel과 시각 비교가 비대칭했다.

문제: cam2base가 커버하지 못하는 카메라를 어떻게 3-panel에 포함시키느냐. 두 카메라 간 상대 자세 정보(cam2cam_extrinsics.json)가 있으면 chain 계산으로 나머지 카메라의 base-frame c2w를 복원할 수 있다.

추가로 기존 디폴트 uuid 5개는 lab/source diversity가 부족했다. 12 lab에서 각 1개씩 추출하여 대표성을 높이는 것도 이번 작업에서 함께 처리했다.

2 작업 내용

cam2cam 좌표계 확인

원본 droid metadata의 left_mp4_path / right_mp4_path가 각각 ext1 / ext2와 동일 serial을 가리키는 것을 확인(AUTOLab+5d05c5aa 에피소드에서 검증). cam2cam JSON의 left_cam.pose는 translation [0,0,0] → ext1 카메라 위치가 원점인 calibration 프레임.

chain 수식

# P_X: X 카메라의 c2w (in cam2cam calib frame) # c2w_covered: cam2base에서 구한 covered 카메라의 base-frame c2w T_other_from_covered = inv(P_covered) @ P_other c2w_other_in_base = c2w_covered_in_base @ T_other_from_covered

이 한 줄로 missing 카메라의 base-frame c2w를 얻는다. cam2cam에 uuid가 없으면 override=Noneis_cam_visible이 False → 기존 single-panel fallback 그대로 동작.

코드 변경 (viz_superset.py만 수정)

추가 상수 : CAM2CAM_JSON = ".../cam2cam_extrinsics.json" 신규 함수 : load_cam2cam_db() — chain 모드일 때만 로드, CAM2CAM_DB 전역 수정 함수 : load_ext_db() — chain 모드면 cam2base JSON에서 covered 카메라 가져옴 수정 함수 : build_ext_overrides() — covered 카메라 잡은 뒤 chain으로 missing 쪽 계산 status 형식: "chain(GT)" / "chain(Pred)" / "no_cam2cam" 총 추가 코드: ~30줄 mp4/viser 렌더 코드: 수정 없음 (ext_overrides dict에만 의존)

디폴트 UUID 12개 선정

h5_list.txt 기반 로컬 4,000 episode 전수 검사 → superset ∩ cam2cam ∩ egox_meta ∩ depth.h5 조건을 모두 만족하는 1,268 episode 풀에서 12 lab 각 1개씩 선정. ext1 커버 8개, ext2 커버 4개. CLVR·IRIS는 cam2cam 미존재로 no_cam2cam fallback 케이스도 함께 커버.

3 결과

UUID (lab)covered → missingchain vs superset ΔtΔR비고
TRI+938130c4 ext2(GT) → ext1 0.000 m 0.04° superset은 Pred → chain(GT) ≈ superset(Pred)
AUTOLab+5d05c5aa ext1(GT) → ext2 0.045 m 5.51° superset도 GT → 독립 GT 소스 간 실제 측정 차이
CLVR+236539bc ext1(GT) → ext2 cam2cam 미존재 → status=no_cam2cam, single-panel fallback
핵심 발견: TRI UUID에서 chain(GT)과 superset(Pred)이 Δt=0.0mm, Δθ=0.04°로 사실상 일치. superset의 Pred 값이 cam2base+cam2cam chain으로 생성된 derived 값일 가능성을 강하게 시사한다.
AUTOLab 케이스: 두 소스 모두 GT인데 5cm/5.5° 차이 발생. cam2cam chain과 독립 GT calibration 간의 실제 측정 오차로, 시각화 목적에는 허용 범위.
fallback 동작 확인: CLVR에서 cam2cam 미존재 시 코드 변경 없이 기존 single-panel로 graceful degradation 동작.

4 Takeaway

시각화 비대칭 문제 해결

extrinsics 모드에서 single-serial 소스만 있어도 chain을 통해 두 카메라를 모두 3-panel에 포함시킬 수 있게 됐다. superset(3-panel)과 extrinsics(3-panel chain) 간 1:1 pixel-level 비교가 이제 가능하다.

superset Pred ≈ chain 가설의 의미

TRI 검증 결과가 맞다면, superset의 Pred label은 사실상 cam2base+cam2cam chain 결과를 단순 재포장한 것이다. 즉 superset의 "GT" 품질은 카메라당 단 하나의 독립 cam2base 측정에 묶여 있고 나머지는 derived다. 이 가설이 사실이라면 chain 모드는 superset Pred 생성 파이프라인을 재구성하는 진단 도구로도 활용할 수 있다.

5 Next Steps

superset Pred 재구성 가설 검증

cam2cam이 있는 uuid 100개 샘플에서 chain(extrinsics) vs superset(Pred) Δt/ΔR 분포를 집계. Δ분포가 0 근방에 뾰족하게 몰린다면 가설 확정. 그렇지 않으면 cam2cam이 다른 알고리즘이거나 pose noise 처리가 다르다는 의미.

Reprojection Error 정량화

12 UUID 전체에 대해 --render_mp4 --ext_source chain을 돌린 뒤 superset과 픽셀 단위 diff 영상 생성. PSNR/SSIM으로 chain 결과의 재현 정확도 수치화 가능.

cam2cam quality_metric 활용

현재 cam2cam의 quality_metric 필드는 무시 중. 낮은 quality 케이스는 chain 결과 신뢰도가 낮을 수 있어, status에 quality 점수를 포함시키면 사용성 개선.