TL;DR
- 원클릭화: ViPE → SAM3D head pose → meta → prior 렌더 → 캡션 → 생성이 한 job (messi 전 단계 14분, 1 GPU)
- 스케일 보정 필수: 수동/SAM3D 거리 비 0.90~4.06배. ViPE depth 기반 배율이 수동 비율을 따라감 (hulk_blackwidow 4.00 vs 4.06)
- 먼 사람 버그 수정: depth 패치 반경을 bbox 높이/16으로 제한 → halland 1.19→0.911(수동 0.911), messi 3인칭→1인칭
- 한계: 수동 대비 회전 오차 중앙값 27.3° (7.4~58.6°)
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_blackwidow | 4.00 | 4.06 |
| ironman_captain | 2.07 | 2.17 |
| joker | 1.25 | 1.27 |
| tabletennis | 1.19 | 1.19 |
| yamamoto | 0.90 | 0.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 / yamamoto | 33° / 38° / 41° |
| hulk_blackwidow | 59° |
소요 시간(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 클립에 자동 파이프라인 적용 후 수동 결과와 비교. 클릭/박스 지정 방식 추가.