Index
2026-04-15 — Progress

DROID Multiview — Ego First-Frame Conditioning 실험 세팅

EgoX v2 | rgb branch | DroidMultiviewDataset + droid_multiview.yaml — baseline ablation 축 개설

TL;DR

7
Files Changed
OK
py_compile
2
Ablation Axes

1 배경 / 목적

기존 configs/droid.yaml 학습은 ego 영역 전체를 zero-padding으로 conditioning하고 exo에서 ego 전체를 예측한다. 이 경우 모델이 ego 카메라의 초기 자세/시점 정보를 순전히 exo로부터 추론해야 하므로 생성된 ego 첫 frame이 GT와 공간적으로 어긋나기 쉽다.

가설: ego GT의 첫 frame을 실제 이미지로 conditioning anchor로 제공하면 — 초반 ego drift 감소, ego temporal consistency 향상, wrist 자세 추적 개선 — 이 개선될 것이다. baseline droid.yaml과 동일 step/동일 validation set으로 ego PSNR/LPIPS 직접 비교 가능.

코어 파이프라인 (encode_ego_first_frame_condition, apply_ego_only_noise, build_wan_i2v_mask)은 이미 first-frame conditioning을 지원하는 설계였다. training/validation 호출부에서만 ego_first_frame=None이 하드코딩되어 있었을 뿐이다.

2 작업 내용

설계 결정: flag 대신 새 dataset_type

dataset_type: droid_multiview 신설 + DroidMultiviewDatasetDroidDataset의 얇은 subclass로 두는 방식을 택했다. flag 방식은 dataset 클래스 내부에 if/else가 퍼져 혼선이 생긴다. 이 방식은 기존 droid.yaml 실험과 완전히 격리되고 override 지점도 _build_ego_cond 하나로 최소화된다.

파일별 변경 요약: 1. core/finetune/datasets/_common.py - _BaseWidthConcatDataset에 _build_ego_cond(ego_path, cache_key, ego_tensor) hook 추가 - _getitem: ego_cond = self._get_zero_ego_cond() → self._build_ego_cond(...)로 교체 2. core/finetune/datasets/droid_multiview.py (신규) - DroidMultiviewDataset(DroidDataset) - _build_ego_cond override: 캐시 hit → load safetensors 캐시 miss → ego frame 0 추출 → [ff, 0,...,0] → VAE encode → atomic save - 첫 epoch 이후엔 disk load만 → step cost overhead 0에 수렴 - cache path: cache_root/cache/ego_first_frame_cond/droid_rgb/FxHxego_w/<key>.safetensors 3. core/finetune/datasets/__init__.py - DroidMultiviewDataset export 추가 4. core/finetune/schemas/args.py - dataset_type Literal에 "droid_multiview" 추가 - validate_dataset_root: droid_root 필수 체크 → in ("droid", "droid_multiview")로 확장 5. core/finetune/trainer.py - prepare_dataset: droid_multiview 분기 추가 - _maybe_run_validation: ego_first_frame=None 하드코딩 제거 droid_multiview 모드에서 ego_video_gt frame 0 → [3,H,ego_width] tensor 주입 6. configs/droid_multiview.yaml (신규) - droid.yaml 복제 + dataset_type: droid_multiview, output_dir: ./results/Droid_RGB_Multiview 7. infer_droid.py - --use_ego_first_frame 플래그 추가 - 활성화 시 ego_video_path frame 0 → [3,H,ego_width] tensor → generate_video(ego_first_frame=...)

Smoke script: scripts/smoke_droid_multiview.sh

Phase 1: fresh → step 20 (DEBUG_MAX_EPISODES=4, 4 GPU, validation_steps=10) Phase 2: resume → step 30 추가 assertion: 1. cache/ego_first_frame_cond/**/*.safetensors 생성 확인 2. validation mp4 frame 0에서 [exo|pred_ego|gt_ego] 패널 추출 MSE/PSNR stdout 출력 + first_frame_pred_vs_gt.png 저장 → 수동 육안 확인

3 결과

검증 항목방법결과
7개 파일 syntaxpython -m py_compile전부 통과
DroidMultiviewDataset importfrom core.finetune.datasets import DroidMultiviewDataset성공
subclass 관계issubclass(DroidMultiviewDataset, DroidDataset)True
hook overridequalname 확인DroidMultiviewDataset._build_ego_cond
schemaArgs.model_fields["dataset_type"].annotationLiteral[..., "droid_multiview"]
동적 검증 미실행: sbm으로 smoke 제출 대기 중. 성공 마커: === PHASE 1 DONE === → MSE/PSNR 출력 → === PHASE 2 DONE ====== SMOKE TEST PASSED ===. 이후 first_frame_pred_vs_gt.png 육안 확인.
기존 실험 격리 완전: droid.yaml 학습 경로, 캐시, checkpoint에 영향 0.

4 Takeaway

의미

코어 파이프라인이 이미 first-frame conditioning을 1st-class citizen으로 지원하는 설계였기 때문에, 이번 작업은 dataloader hook 1개 + validation 주입 1곳 + 새 config 1개로 끝나는 최소 침습 실험 세팅이었다. 새 실험 축 (droid_rgb zero-cond vs droid_rgb_multiview first-frame-cond)이 열렸다. ego 첫 frame anchor가 있을 때 초반 drift, ego temporal consistency, wrist 자세 추적이 얼마나 개선되는지 직접 수치 비교가 가능해진다.

첫 epoch에서 per-episode ego_first_frame_cond safetensors가 캐싱되면 이후 epoch부터 step cost overhead가 사실상 0으로 수렴하는 점도 중요하다. 추론 시 --use_ego_first_frame 플래그를 빠뜨리면 학습 분포와 다른 conditioning이 들어가므로 운용 시 주의가 필요하다.

5 Next Steps

Smoke test 제출

conda activate egoxv2 sbm "bash scripts/smoke_droid_multiview.sh" \ --qos=core-extra --gres=gpu:4 -c 96 --mem 800GB

성공 마커 확인 후 first_frame_pred_vs_gt.png 육안 체크. ego pred frame 0이 gt frame 0과 공간적으로 얼마나 일치하는지 MSE/PSNR 수치로 판단 가능.

본 학습 제출 (smoke 통과 후)

sbm "bash scripts/finetune_droid.sh configs/droid_multiview.yaml" \ --gres=gpu:4 -c 96 --mem 800GB --qos=core-extra

첫 epoch에 cache/ego_first_frame_cond/droid_rgb/ 아래 per-episode safetensors 누적. episode 수 × latent 크기 만큼 디스크 모니터링 필요.

Ablation 분석

동일 step / 동일 validation set에서 baseline droid.yaml vs droid_multiview.yaml의 ego PSNR/LPIPS, temporal consistency 비교. 본 학습 완료 후 analysis 카드로 기록 예정. Training 중 validation ego 영상에서 pred vs gt frame 0 시각적 drift를 1000 step 단위로 기록 추천.

잠재적 미해결 이슈

Training/validation 픽셀 불일치: training은 decord + torchvision resize, validation은 diffusers load_video + PIL resize. 리사이즈 알고리즘 차이로 첫 frame 픽셀이 미세하게 다를 수 있다. I2V cond 수준으로는 충분하지만 정밀 parity가 필요하면 validation도 _load_video 경로로 리팩터 필요.