← 목록
2026-08-03 · X-WAM · Research

멀티뷰 + wrist 로보틱스 모델의 depth 정규화 방식 조사

X-WAM baseline 비판을 위한 동시기 연구 9편 대조 (+ 연구실 내부 대조군) — 뷰별 정규화 vs 뷰 독립 스케일

TL;DR

9
조사 모델
1 / 9
뷰별 정규화 (X-WAM)
4
wrist 포함 멀티뷰
18/18
릴리스 mp4가 0~255 꽉 찬 비율

1조사 동기 — X-WAM에서 확정한 사실

X-WAM depth를 GT와 대조하다 발견한 것: 같은 물리 거리가 뷰마다 전혀 다른 출력값을 갖습니다. 0.3~0.4 m 구간에서 exo1 = 0.296 vs wrist = 0.0744배 차이. 그래서 전역 스케일 하나로 3뷰를 동시에 metric으로 만들 수 없고, 전역 fit을 강제하면 wrist가 실제의 2배 거리로 밀려 median 오차 51.6 cm(per-view fit은 7.0 cm)가 됩니다.

정규화 스킴 규명 (코드 + 릴리스 데이터 양쪽 증거)

① 코드data/robot_dataset.py_normalize_depths_per_view:

depth_min = depths.amin(dim=(1,2,3,4), keepdim=True) # 뷰마다 1개 depth_max = depths.amax(dim=(1,2,3,4), keepdim=True) normalized = 2.0*(depths - depth_min)/(depth_max - depth_min) - 1.0 # → min/max는 계산 후 그대로 폐기. 리턴도 저장도 없음.

② 릴리스 데이터 — 배포된 depth mp4를 직접 디코딩: 6 에피소드 × 3 뷰 = 18/18 전부 픽셀값이 정확히 0~255를 채움(R=G=B 그레이스케일). wrist는 물리적으로 0.05~1.4 m, agentview는 0.4~2.1 m를 보는데 둘 다 풀레인지를 채운다는 것은 고정 스케일로는 불가능 → 뷰별·에피소드별 min-max 확정.

③ 모델 출력 — 복원한 slope가 각 장면의 depth span을 그대로 추종: corr(a, −span) = 0.99~1.00 (exo). "뷰별 고정 상수"가 아니라 에피소드마다 다시 잡힘을 확인.

결론: 릴리스 config는 normalize_depths_per_view: false인데도 min-max 거동이 관측됨 → 정규화는 로더가 아니라 미공개 dataset prep(mp4 인코딩) 단계에 이미 들어가 있습니다. 에피소드 JSON에도 depth_min/depth_max가 없고, 레포 전체에 denormalization 코드가 없습니다.

2비교표 A — depth를 생성 타깃으로 삼는 모델

X-WAM과 직접 비교군입니다. 생성 타깃일 때만 "추론 시 스케일을 모른다"는 ill-posed 문제가 발생합니다.

모델뷰 구성depth 소스정규화 방식 wrist 별도 정규화?3뷰 동일 정규화?metric 복원
X-WAM 3뷰 (agentview×2 + wrist) sim z-buffer 에피소드별 × 뷰별 min-max → 8-bit [0,255] 예 (뷰마다 따로) 아니오 불가 (min/max 미저장)
RynnWorld-4D
동일 Wan2.2-TI2V-5B 백본
단일 뷰 Depth Anything 3 고정 전역 [0, 5.0] m
I = ⌊d/5.0 × 255⌋
— (뷰 1개) — (구조상 뷰 무관) 가능 d=I/255×5
PointWorld-DROID
NVIDIA
3뷰 (exterior×2 + wrist) Zed 스테레오 센서 정규화 없음 — uint16 원본 mm (0=invalid) 아니오 예 (완전 동일) 가능 (×0.001)
Cosmos Policy + depth
연구실 내부 (junhahyung)
3뷰 (agentview L/R + wrist)
X-WAM과 동일한 HDF5 키
sim z-buffer (RoboCasa) 고정 전역 [0.05, 3.0] m 선형
clip((d−0.05)/2.95)×255 → pseudo-RGB
아니오 예 (완전 동일 함수) 가능 (~11.5 mm)
3D-VLA 단일 RGB-D 중심 depth estimator 비디오 내 배경 기준 프레임 간 계수 정렬 (상대) 상대 스케일
RynnWorld-4D (arXiv 2607.06559): “Depth values are clipped to a global range of [0.0, 5.0] meters and quantized to 8-bit grayscale via I = ⌊d / dmax × 255⌋.”
PointWorld-DROID (로컬 실물 확인): depth_320x180/<uuid>_depth.h5 → wrist max 1599, ext max 4394 / 5555 (uint16). 뷰마다 값 범위가 다른 채로 저장 = 물리 단위가 통일된 원본 metric.

가장 정확한 대조군 — Cosmos Policy + depth (연구실 내부)

같은 연구실(junhahyung)에서 depth까지 예측하는 WAM을 만들었고, 코드를 읽어보니 X-WAM과 조건이 거의 완전히 겹칩니다. 통제변수가 이 정도로 맞는 대조군은 이번 조사에서 유일합니다.

조건X-WAMCosmos Policy + depth
벤치마크RoboCasaRoboCasa동일
뷰 구성agentview_left/right_depth + eye_in_hand_depth동일한 HDF5 키동일
depth 인코딩pseudo-RGB(그레이 3채널) → RGB와 같은 VAE동일동일
depth의 역할생성 타깃생성 타깃 (per-slot depth loss)동일
정규화에피소드별 × 뷰별 min-max고정 전역 [0.05, 3.0] m← 유일한 차이

코드 근거cosmos_policy/datasets/robocasa_dataset.py:

depth_near: float = 0.05 # config에서 실제 사용 확인 depth_far: float = 3.0 depth_scale = max(self.depth_far - self.depth_near, 1e-6) def _depth_to_pseudo_rgb(d): norm = np.clip((d - self.depth_near) / depth_scale, 0.0, 1.0) u8 = (norm * 255.0).astype(np.uint8) return np.stack([u8, u8, u8], axis=-1) # ← left / right / wrist 전부 이 함수 하나
세 뷰가 완전히 같은 함수·같은 상수를 통과합니다. wrist를 특별 취급하는 코드가 없고, 상수는 config/experiment/cosmos_policy_experiment_configs.py에서 use_depth_images=True, depth_near=0.05, depth_far=3.0으로 실제 사용됩니다. → denormalize 자명(d = 0.05 + I/255 × 2.95), 양자화 2.95/256 ≈ 11.5 mm.
near plane 선택이 특히 좋습니다. near=0.05는 wrist가 보는 최근접 거리(그리퍼)에 맞춘 값이고, far=3.0은 RynnWorld의 5.0보다 로봇 workspace에 타이트합니다. 그 결과 양자화가 11.5 mm로 RynnWorld(19.6 mm)보다 좋습니다 — 고정 스케일을 쓰면서도 범위를 workspace에 맞추면 근거리 해상도를 상당히 회복할 수 있다는 실증입니다.

loss 가중치도 뷰별 차등 없음 (추가 검증)

정규화만 같고 loss에서 wrist를 다르게 취급할 수도 있으므로 models/policy_text2world_model.py까지 확인했습니다. 가중치는 final_mask_B_T (B, T) 하나로 관리되며 전부 1로 시작합니다.

최종 확인: 세 뷰가 (i) 같은 고정 상수로 정규화되고, (ii) 같은 함수를 통과하고, (iii) loss에서 같은 가중치 1을 받습니다. 정규화도 loss도 wrist를 따로 취급하지 않습니다.

🔍 부수 발견 — 코드에 남은 "slot 15 explosion" 기록

검증 중 policy_text2world_model.py:898-903의 주석을 발견했습니다. value_indices = -1("미사용" 센티널)을 체크 없이 쓰면 Python 음수 인덱싱으로 마지막 슬롯을 가리켜, state_t=16에서 거기 있던 fut_wrist_depth latent를 조용히 덮어썼다는 내용입니다. 그 결과 모델이 slot-15 출력을 depth 타깃이 아니라 value_function_return으로 학습 → “slot 15 explosion”의 근본 원인. 현재 코드는 if torch.all(value_indices != -1): 가드로 수정됨.

원인은 전혀 다르지만(여기는 인덱싱 버그, X-WAM은 저진폭 신호 + 오차 바닥), future wrist depth 슬롯이 파이프라인의 취약점이라는 정황은 두 구현에서 공통입니다. 랩메이트 쪽은 이미 겪고 해결한 함정.

참고: 이 설정의 RoboCasa 성능 (내부 EVAL_RESULTS.md)

설정iterSRΔ
Baseline A (depth 없음, state_t=11)24,00060.8%
Baseline B (depth 포함, state_t=16 = 10 base + 6 depth slot)24,00068.3%+7.5
Stage 2 (mg1000 depth pretrain → human_depth)24,00077.0%+16.2
Patched (depth 없음, 더 오래 학습)45,00069.9%+9.1

depth 슬롯은 추론 시 blank로 두고 학습 시 표현학습 신호로만 씁니다(X-WAM의 policy eval도 run_depth=False로 동일). 다만 내부 문서가 스스로 밝히듯 “Patched(depth 없음, 45k)도 69.9%에 도달하므로 +7.5는 학습 길이가 다른 비교”이므로, depth 이득의 순수 크기는 신중히 봐야 합니다.

이 항목은 연구실 내부 미공개 작업이며 수치는 내부 문서 기준입니다. 코드는 읽기 전용으로만 확인했습니다.

3비교표 B — depth를 입력 condition으로 쓰는 모델 (참고군)

모델뷰 구성depth 소스정규화 방식 wrist 별도?뷰 동일?metric
RoboTransfer
Horizon Robotics
3뷰 (head + wrist×2) 단안 depth estimator RGB-D 센서에 robust least-squares로 스케일 정렬 → 전역 metric 아니오 예 (단일 전역 스케일) metric
Cosmos-Transfer1
NVIDIA
단일 / 서라운드(주행) DepthAnything2 비디오 단위 [0,1] 정규화 (상대) — (wrist 없음) 상대
RoboTransfer (arXiv 2505.23171): “…we use a state-of-the-art depth estimator to produce consistent depth maps. For unmetric depth outputs, we align the estimated scale with the RGB-D sensor using robust least-squares fitting to ensure global spatial accuracy.” — ablation에서 Metric D.P.가 전 뷰 최고 일관성.
Cosmos-Transfer1 (arXiv 2503.14492): “We compute depth maps from the input video using DepthAnything2 and then normalize the extracted depth to [0, 1] to generate a depth video.”

4비교표 C — 멀티뷰+wrist인데 depth를 안 쓰는 대조군

모델뷰 구성depth 취급
Genie Envisioner (AgiBot)3뷰 (head + wrist×2)RGB만 — 논문에 'depth' 2회, 생성하지 않음
EnerVerse멀티뷰depth는 warping/보조뷰 렌더링용, 생성 타깃 아님
VPP (Video Prediction Policy)멀티뷰없음
head+wrist×2 구성이면서 depth를 다루는 RoboTransfer와, 같은 구성인데 RGB만 쓰는 Genie Envisioner의 대비가 시사적입니다. wrist가 어렵다는 인식은 공유하되, RoboTransfer는 “wrist 뷰는 모션·가림 때문에 객체 추적이 불안정해 center view에서만 평가한다”고 명시 — 해법을 정규화 분리가 아니라 평가 설계로 다룹니다.

5정리 — 논문에 쓸 수 있는 형태

depth를 생성 타깃으로 삼는 동시기 연구들은 장면·뷰 독립적 스케일을 사용한다 — RynnWorld-4D는 고정 [0, 5] m 선형 양자화, PointWorld-DROID는 원본 metric mm, RoboTransfer는 센서 기준 전역 metric 정렬. 반면 X-WAM은 에피소드별·뷰별 min-max를 쓰며 그 min/max를 저장하지 않아, (i) 학습 타깃이 추론 시 알 수 없는 그 에피소드 자신의 depth 극값에 의존하는 ill-posed 문제가 되고, (ii) metric 복원이 원리적으로 불가능하다.

설계 공간의 trade-off — 빈 칸이 곧 기여 지점

방식metric 복원근거리 해상도뷰 간 일관성
X-WAM (에피소드·뷰별 min-max)불가양호 (~6 mm)깨짐
RynnWorld (고정 선형 [0,5] m)가능거침 (~19.6 mm)유지
PointWorld (원본 metric mm)가능양호유지
Cosmos Policy+depth (고정 선형 [0.05,3.0] m)가능준양호 (~11.5 mm)유지
고정 비선형 (log-depth / 고정 near-far disparity)가능양호유지

고정 스케일의 대가를 실측으로 정량화

Cosmos Policy의 px = clip((d−0.05)/2.95, 0, 1) × 255실제 RoboCasa GT depth 8 scene에 적용해, 각 뷰가 8-bit 코드 공간을 얼마나 점유하는지 계산했습니다.

GT depth (평균 p1–p99)px 범위px 평균점유 레벨
exo1 (agentview_L)0.52 – 1.82 m40 – 153100113 / 256 (44%)
exo2 (agentview_R)0.49 – 1.84 m38 – 15598117 / 256 (46%)
wrist0.05 – 1.14 m0 – 943895 / 256 (37%)

전역 정규화를 쓰면 wrist 값이 전반적으로 작아집니다 — px 평균 38 vs ~100(약 2.6배), 그리고 그리퍼가 near plane에 닿으므로 항상 0에서 시작합니다. 최악 케이스(근접 조작, GT 0.05–0.63 m)에는 50 레벨만 사용합니다(exo는 최소 99–102).

단, 이것이 wrist 품질 저하의 원인은 아닙니다. X-WAM은 per-view min-max라 wrist에게 [0,255] 전체를 주는데도 재현율 0.59 / R² 0.40으로 압축됩니다. 즉 코드 레벨을 최대로 줘도 안 되므로, wrist 문제는 "코드 레벨 부족"이 아니라 앞서 확인한 저진폭 신호 + 뷰 무관 ~5 cm 오차 바닥입니다. 그래도 고정 선형 방식은 wrist에게 더 적은 레벨을 주므로 추가 손실은 실재합니다 — 진짜 trade-off.

log-depth로 바꾸면 근거리 레벨이 2~3배 회복됩니다

같은 near/far(0.05, 3.0 m)로 norm = (ln d − ln 0.05) / ln(3.0/0.05)를 쓰면:

케이스GT 범위고정 선형 레벨고정 log 레벨배율
wrist 최악 (근접 조작)0.05 – 0.63 m501583.15×
wrist 평균0.05 – 1.14 m951962.07×
exo1 평균0.52 – 1.82 m113780.69×
exo2 평균0.49 – 1.84 m117830.71×

거리별 1 레벨의 물리적 크기로 보면 교차점이 명확합니다 — 0.72 m 이하에서 log가 유리합니다:

거리 선형 1 level log 1 level 0.1 m 11.5 mm 1.6 mm ← log 7배 정밀 0.3 m 11.5 mm 4.8 mm 0.6 m 11.5 mm 9.6 mm ------------------------------- 교차점 d = 2.95/ln(60) ≈ 0.72 m 1.0 m 11.5 mm 16.0 mm 2.0 m 11.5 mm 32.0 mm ← 원거리는 선형이 유리(무해)
결론: log-depth는 코드 레벨을 조작이 실제로 일어나는 근거리로 재분배합니다. wrist는 최악 케이스에서도 158 레벨을 확보하고(선형 50), exo는 113→78로 줄지만 원래 여유가 있어 감당 가능합니다. 장면 독립성(=metric 복원 가능)은 그대로 유지되므로, X-WAM의 복원 불가 문제와 Cosmos 선형 방식의 근거리 손실을 동시에 해결하는 유일한 칸입니다.

6한계 & 이전 주장 정정

정정: 앞선 리포트(260731)에서 “wrist가 보는 depth range가 장면마다 불안정해서(CV 0.28) 예측이 나쁘다”고 썼는데, 이는 틀렸습니다. 그리퍼 픽셀(항상 0.05 m)을 제외하고 재면 wrist의 실제 장면 range는 ratio 1.5~6.2×로 exo(2.9~15.8×)보다 좁고 안정적입니다. 인과 검증 결과 corr(R², range ratio)는 exo1 −0.75 / exo2 −0.92인데 wrist는 −0.00 — “넓은 range가 어렵다”는 효과는 exo의 현상이고 wrist와는 무관합니다.

wrist가 나쁜 실제 이유: 절대 오차는 세 뷰가 거의 같습니다(exo 4.9~5.6 cm, wrist 5.8 cm). 차이는 wrist가 예측해야 할 depth 변동폭이 절반(GT std 16.7 cm vs 31 cm)이라는 점입니다. 뷰와 무관하게 ~5 cm인 오차 바닥이 절반짜리 신호의 훨씬 큰 비율을 삼켜 오차/GTstd가 0.30 vs 0.17(약 2배)이 되고, 그것이 시각적 “flat”으로 나타납니다. 모델 자기 출력 단위로 환산해도 wrist 9.6% vs exo 4.2~4.6%로 동일한 2배 격차입니다.

조사 자체의 한계