Index
2026-10-04 — Progress

SAM 3D Body 자동 ego pose → EgoX 원클릭 파이프라인

Exo-to-Ego_Wan2.1_finetune (EgoX_H200, B200 이전 후)

TL;DR

49/49
SAM3D 검출 프레임 (11클립)
27.3°
회전 오차 중앙값
14분
messi 전 단계
4.06×
최대 스케일 차이

1 배경 / 목적

in-the-wild 영상은 ego 카메라 궤적을 vipe visualize --ego_manual로 프레임마다 손으로 찍어야 했다. 2026-01 SAM 3D Body head pose 시도는 단계가 끊겨 있었다.

기존 한계: head pose json 경로가 한 클립으로 하드코딩(inference_sam3d.py:98), 스케일 정합 없음, 렌더러(render_w_pytorch3d_video.py)는 viser 무한 대기, prior/meta 저장 단계 없음, 모델 로드가 꺼진 덤프 전용. 목표는 "exo 영상 하나 → ego pose 자동 추정 → 바로 생성".

2 작업 내용

렌더러: kdh8156/EgoX-EgoPriorRenderer 클론 (학습 prior와 동일 렌더러, 사용자 결정) 환경(setup_env.sh): egox-egoprior 보강 — vipe editable 재빌드(CUDA_HOME=12.8 고정, torch cu128), pytorch3d 0.7.9, detectron2, opencv-python → opencv-python-headless(libGL 없음). torch 2.7.0 / numpy 2.1.2 constraints 고정 scripts/auto_ego/ prep_video.py 30fps → 49프레임 → 높이 448 + 폭 784 center crop (ViPE) vipe infer --assume_fixed_camera_pose --pipeline lyra → depth, exo intrinsic sam3d_head_pose.py ViPE intrinsic을 SAM3D에 넣어 프레임별 c_head 회전/위치 build_meta.py 사람 선택(largest/leftmost/rightmost/center)+추적 → ViPE depth 스케일 보정 → 미검출 보간 + 가우시안 평활(σ=1) → 눈 오프셋 → ego w2c 49개 → meta json render_vipe_pointcloud.py --fish_eye_rendering --use_mean_bg --point_size 5.0 caption_exo.py gateway gpt-4o, 기존 caption.py prompt, [Exo view]/[Ego view] 한 줄 (키는 환경변수로만) run.sh <영상> [이름] 전체 + inference_all_fast.py --itw (STAGES/FORCE/CAPTION_FILE/PERSON/START_SEC/SEED)

캘리브레이션 (tmp/calib/eval.py, 수동 annotation 11클립 대조): 축 변환 [[-1,0,0],[0,0,1],[0,1,0]] (매칭 깔끔한 5클립에서 데이터 역산 행렬과 5.4~13.4° 차이), 눈 오프셋 head joint → 수동 카메라 중앙값 up 0.083 m / fwd 0.062 m → 기본 0.08/0.06.

3 결과

클립스케일 보정 배율수동 비율
hulk_blackwidow4.004.06
ironman_captain2.072.17
joker1.251.27
tabletennis1.191.19
yamamoto0.900.91
먼 사람 버그: 고정 크기 depth 패치(높이의 3%)가 작은 머리에서 배경을 섞어 카메라가 머리 뒤로 감 → 패치 반경 bbox 높이/16. halland 1.19→0.911(수동 0.911), djokovic 1.02→0.899(수동 0.902), messi 1.75→1.27. messi는 1인칭(발+경기장 정면)으로 생성.
회전 오차(수동 대비)값
전체 중앙값27.3° (클립별 7.4~58.6°)
ironman / spiderman_stanlee / yamamoto33° / 38° / 41°
hulk_blackwidow59°

소요 시간(1 GPU, messi 전 단계) 14분: ViPE ~2.5분, SAM3D+meta+렌더 ~2분, 캡션 11초, 생성 ~10분. joker_auto는 손·라이터가 ego로 생성되나 수동 pose 대비 시선이 위쪽(건물 정면)이라 손이 화면 하단에 걸림. ViPE fx 615.0 (수동 634.5). job: 173157, 173158, 173176.

4 Takeaway

의미

수동 annotation 없이 exo 영상 → ego 영상이 명령 한 줄로 나오고, ViPE·SAM3D·캡션 API·생성이 한 워커 job으로 돈다. SAM3D의 metric 위치는 그대로 쓰면 안 되고(최대 4배 차이) ViPE depth 기준 스케일 보정이 필수다.

5 Next Steps

미해결 한계

회전 차이 27°가 수동 annotation 주관(시선/손 쪽 기울임) 때문인지 SAM3D 오차인지 미구분. 자동 prior가 바닥을 넓게 잡고 하늘 쪽 점이 드문드문(joker) — 렌더 설정(online_calibration.jsonl 사용 여부) 차이 미확인. 다인 장면 ego 대상은 PERSON 4규칙뿐.

다음 실험

수동/자동 prior를 클립별 나란히 렌더해 비교, 필요시 pitch-down 보정 옵션. 나머지 10개 in-the-wild 클립에 자동 파이프라인 적용 후 수동 결과와 비교. 클릭/박스 지정 방식 추가.