VGGS: VGGT-guided Gaussian Splatting for Efficient and Faithful Sparse-View Surface Reconstruction (AAAI 2026)

상솜공방·2026년 5월 30일

논문 리뷰

목록 보기
57/58

1. Introduction & Related Works

1.1. Introduction

1.1.1. Sparse-view 3D reconstruction의 문제

Sparse-view 3D surface reconstruction은 적은 수의 입력 이미지로부터 정확한 3D 표면을 복원하는 문제다. NeRF와 3D Gaussian Splatting 계열 방법은 dense-view setting에서는 좋은 성능을 보이지만, 입력 view가 적어지면 multi-view geometric cue가 부족해진다. 특히 서로 다른 이미지 사이의 overlap이 작을 경우, 관측되지 않거나 공통으로 보이지 않는 영역의 geometry를 안정적으로 추정하기 어렵다.

1.1.2. VGGT depth prior의 가능성

이 문제를 보완하기 위해 VGGT와 같은 visual geometry foundation model을 사용할 수 있다. VGGT는 large-scale multi-view dataset으로 학습되어 depth, point map, camera parameter 등 다양한 3D 정보를 예측할 수 있다. 따라서 VGGT가 제공하는 depth prior는 sparse-view 상황에서 부족한 기하학적 정보를 보완하는 데 유용하다.

1.1.3. VGGT를 직접 사용하는 것의 한계

하지만 VGGT depth map을 그대로 fusion하여 3D mesh를 만드는 것은 적절하지 않다. VGGT depth prior는 frame 간 미세한 misalignment를 가질 수 있고, 예측된 camera parameter 역시 실제 camera pose와 완전히 일치하지 않을 수 있다. 이 경우 depth map을 단순히 TSDF fusion 등으로 합치면 hole, artifact, surface distortion이 발생할 수 있다.

1.1.4. VGGS의 핵심 아이디어

VGGS는 VGGT depth prior를 3D Gaussian Splatting에 직접 주입하는 대신, 신뢰할 수 있는 anchor pixel을 기준으로 보정하여 사용한다. 이를 위해 두 가지 핵심 구성 요소를 제안한다.

첫째, anchor-calibrated depth estimation을 통해 multi-view consistent anchor를 선택하고, 이를 기준으로 VGGT depth prior와 rendered depth 사이의 scale 및 shift 차이를 보정한다. 이후 unreliable region에서는 anchor와의 relative depth를 이용해 더 안정적인 estimated depth map을 만든다.

둘째, relative depth consistency loss를 통해 rendered depth의 depth order가 VGGT prior의 depth order와 일치하도록 만든다. 이는 절대 깊이값을 강제로 맞추는 것이 아니라, 두 픽셀 사이의 앞뒤 관계를 맞추는 방식이다.

결과적으로 VGGS는 VGGT의 multi-view geometric prior를 이용하되, direct fusion의 misalignment 문제를 피하고, GS optimization 과정에서 보다 안정적인 surface reconstruction을 수행한다.

1.2.1. Sparse-view 3D Reconstruction

Sparse-view 3D reconstruction 방법은 크게 generalizable method와 scene-specific method로 나눌 수 있다.

Generalizable method는 대규모 dataset으로 사전학습된 모델을 이용해 새로운 scene을 빠르게 복원한다. 이 방식은 inference가 빠르다는 장점이 있지만, test scene이 training distribution과 다르면 성능이 떨어질 수 있다.

Scene-specific method는 각 scene에 대해 직접 optimization을 수행한다. 이 방식은 새로운 scene에 유연하게 적응할 수 있지만, sparse-view setting에서는 입력 이미지 간 overlap이 부족하기 때문에 RGB reconstruction loss만으로는 정확한 geometry를 얻기 어렵다.

VGGS는 scene-specific reconstruction 계열에 속한다. 즉 각 scene에 대해 Gaussian Splatting을 직접 최적화한다. 다만 기존 scene-specific method와 달리, VGGT의 multi-view depth prior를 활용하여 부족한 geometric cue를 보완한다.

1.2.2. Geometric Prior 기반 방법

Sparse-view reconstruction에서는 부족한 multi-view cue를 보완하기 위해 다양한 geometric prior가 사용되어 왔다.

Monocular prior는 단일 이미지에서 예측한 depth나 normal을 활용한다. 이러한 방식은 각 view에 대해 dense한 geometric cue를 제공할 수 있지만, 본질적으로 single-view 기반이므로 multi-view consistency가 부족하다. 또한 monocular depth는 scale ambiguity와 distortion 문제를 가질 수 있다.

MVS prior는 여러 view 사이의 correspondence를 이용해 depth를 추정한다. 따라서 multi-view geometry를 직접 반영할 수 있지만, sparse-view setting에서는 view overlap이 작아 correspondence 자체가 불안정해진다. 이 때문에 small-overlap 상황에서는 MVS prior의 신뢰도가 낮아질 수 있다.

VGGT prior는 이 둘과 다른 위치에 있다. VGGT는 multi-view data로 학습된 foundation model이기 때문에 monocular prior보다 풍부한 multi-view geometric cue를 제공할 수 있다. 또한 전통적인 MVS처럼 강한 view overlap에만 의존하지 않기 때문에 sparse-view setting에서도 유용한 depth prior를 제공할 수 있다.

1.2.3. VGGS의 위치

VGGS는 geometric prior를 사용하는 sparse-view reconstruction 연구의 흐름을 따른다. 하지만 VGGT depth prior를 절대적인 depth target으로 직접 사용하는 것이 아니라, anchor calibration과 relative depth consistency를 통해 GS optimization에 안정적으로 결합한다.

따라서 VGGS의 핵심 차별점은 다음과 같이 정리할 수 있다.

  1. VGGT의 multi-view depth prior를 활용한다.
  2. Multi-view consistent anchor를 이용해 prior와 rendered depth를 정렬한다.
  3. Unreliable region은 anchor와의 relative depth를 통해 보정한다.
  4. Relative depth consistency loss로 전역적인 depth order를 유지한다.

즉 VGGS는 VGGT의 generalizable geometric prior와 scene-specific GS optimization을 결합한 sparse-view surface reconstruction 방법이다.

2. Method

2.2. Anchor Selection and Surface Alignment

2.2.1. Anchor Selection

2.2.1.1. VGGS가 다루는 깊이값

VGGS에는 세 종류의 depth가 나온다.

DpD_p는 VGGT가 예측한 depth prior이다. 멀티뷰 정보를 사용했기 때문에 상대적인 기하 구조는 꽤 좋지만, 실제 GS가 렌더링하는 장면 좌표계와 scale, shift가 어긋날 수 있다.

DrD_r는 현재 Gaussian Splatting 모델이 렌더링한 depth이다. 학습 중인 3DGS가 지금 생각하고 있는 표면이다.

D^p\hat{D}_pDpD_p를 scale ww, shift qq로 보정해서 DrD_r에 맞춘 aligned prior depth이다.

마지막으로 D^e\hat{D}_e는 depth loss의 target으로 쓰는 estimated depth map이다. 중요한 점은 VGGS가 D^p\hat{D}_p를 그대로 target으로 쓰지 않는다는 것이다. 대신 reliable region에서는 DrD_r를 보존하고, unreliable region에서만 anchor를 기준으로 상대 깊이 정보를 전파해서 D^e\hat{D}_e를 만든다.

즉 흐름은 다음과 같다.

DpD_p
D^p=wDp+q\rightarrow \hat{D}*p = wD_p + q
ΔD=D^pDr\rightarrow \Delta D = |\hat{D}*p - D_r|
PrelPunrel\rightarrow P*{\mathrm{rel}} P*{\mathrm{unrel}}
D^e\rightarrow \hat{D}*e
Ldepth=avgDrD^e\rightarrow L*{\mathrm{depth}} = \mathrm{avg}|D_r - \hat{D}_e|

2.2.1.2. 수식 11: 가장 믿을 만한 픽셀 K1K_1개를 먼저 고른다

수식 11은 다음 의미다.

PtopK1=p(i)1iK1, Cd(p(i))>τP_{\mathrm{top}K_1} = {p^{(i)} \mid 1 \le i \le K_1,\ C_d(p^{(i)}) > \tau }
Cm(p(1))Cm(p(2))Cm(p(K1))C_m(p^{(1)}) \ge C_m(p^{(2)}) \ge \cdots \ge C_m(p^{(K_1)})

여기서 Cm(p)C_m(p)는 multi-view consistency score이다. 쉽게 말하면 “이 픽셀이 여러 view에서 볼 때 얼마나 일관된 표면점으로 보이는가”를 나타낸다. Cd(p)C_d(p)는 VGGT가 예측한 depth confidence이다. 따라서 수식 11은 다음 조건을 동시에 만족하는 픽셀들을 고르는 것이다.

첫째, 여러 view 사이에서 photometric consistency가 높아야 한다. 둘째, VGGT가 해당 픽셀의 depth에 대해 충분히 confident해야 한다. 셋째, 그중에서도 CmC_m이 높은 순서대로 K1K_1개를 고른다.

논문에서는 VGGT depth prior가 멀티뷰 기반이라 유용하지만, 그래도 true surface와 scale 및 shift가 어긋날 수 있으므로, cross-view consistency가 높은 픽셀을 surface anchor로 사용한다고 설명한다.

직관적으로 말하면, 이 픽셀들은 “현재 sparse-view 상황에서도 여러 관측이 서로 동의하는 지점”이다. 그래서 DpD_pDrD_r를 정렬할 때 기준점으로 쓰기 좋다.

예를 들어 이미지에 10,000개 픽셀이 있다고 하자. 각 픽셀마다 CmC_m, CdC_d가 있다. Cd>τC_d > \tau를 만족하는 픽셀만 남기고, 그중 CmC_m이 가장 높은 15개를 고르면 그것이 PtopK1P_{\mathrm{top}K_1}이다. 논문에서는 K1=15K_1 = 15로 둔다.

2.2.1.3. 수식 22: top-K1K_1만 쓰면 한 영역에 몰리므로 FPS로 퍼뜨린 앵커를 추가한다

문제는 CmC_m이 높은 픽셀들이 한 지역에 몰릴 수 있다는 점이다.

예를 들어 물체의 앞면 중앙 부분은 세 view에서 모두 잘 보이고 texture도 풍부해서 consistency가 매우 높을 수 있다. 그러면 top-15 픽셀이 전부 그 앞면 중앙에 몰린다. 이 상태에서 scale ww, shift qq를 추정하면, 특정 지역에서는 잘 맞지만 다른 깊이 영역이나 물체의 가장자리에서는 정렬이 불안정해질 수 있다.

그래서 수식 22가 나온다.

PFPS=FPS(PtopK2Kf)P_{\mathrm{FPS}} = \mathrm{FPS}(P_{\mathrm{top}K_2} K_f)
PtopK2=p(i)K1+1iK1+K2P_{\mathrm{top}K_2} = {p^{(i)} \mid K_1 + 1 \le i \le K_1 + K_2 }

여기서 PtopK2P_{\mathrm{top}K_2}는 “가장 높은 top-K1K_1을 제외한 다음 상위 K2K_2개 픽셀”이다. 즉 최고점 픽셀은 아니지만 여전히 consistency가 높은 후보들이다.

그다음 FPS, 즉 farthest point sampling을 적용한다. FPS는 이미 선택된 점들과 최대한 멀리 떨어진 점을 반복적으로 고르는 방식이다. 목적은 anchor들이 이미지 평면 전체에 더 균일하게 퍼지도록 만드는 것이다.

정리하면 수식 22는 “정말 최고로 믿을 만한 픽셀들은 수식 11에서 이미 골랐으니, 추가로 spatial coverage를 확보하기 위해 다음 후보군에서 멀리 퍼진 픽셀들을 뽑자”는 의미다.

2.2.1.4. 수식 33: 최종 anchor set을 만든다

수식 33은 단순하다.

Panchor=PtopK1PFPSP_{\mathrm{anchor}} = P_{\mathrm{top}K_1} \cup P_{\mathrm{FPS}}

즉 최종 앵커는 두 부류의 합집합이다.

첫 번째는 consistency가 가장 높은 픽셀들이다. 두 번째는 consistency가 어느 정도 높으면서도 공간적으로 퍼져 있는 픽셀들이다.

이 과정에서 “앵커 픽셀을 더 추가한다”는 표현은 수식 22, 33에 해당한다. 즉 초기 anchor selection 단계에서는 top-K1K_1만 쓰지 않고 FPS 기반 앵커를 추가한다. 하지만 뒤에서 나오는 수식 1010은 이 의미의 “새로운 앵커 추가”가 아니다.

2.2.2. Surface Alignment

  • 목적 요약

    • VGGS는 VGGT가 제공한 multi-view depth prior인 DpDp를 그대로 쓰면 약간의 shift와 scale 차이로 인해 표면이 어긋나는 문제를 겪는다. 따라서 신뢰할 수 있는 픽셀들만 골라 앵커(anchor)로 삼아, 이 앵커들을 기준으로 DpDp를 렌더된 깊이 DrDr에 정렬(스케일 및 시프트 보정)한다. 이렇게 정렬된 prior를 바탕으로 신뢰가 낮은 영역의 깊이를 상대 깊이로 보정한다.
  • 앵커 선정 단계

    • VGGT가 함께 제공하는 multi-view consistency map인 CmCm과 depth confidence map인 CdCd를 활용해 신뢰도 높은 후보 픽셀을 먼저 뽑는다. 구체적으로 CdCd가 임계값 τ보다 큰 픽들 중에서 CmCm 값이 큰 순서대로 상위 K1개의 픽을 선택한다.
    • 수식 표기:
      PtopK1={p(i)}i=1K1P_{topK1} = \{p(i)\}_{i=1}^{K1}
    Cd(p(i))>τ,Cm(p(1))Cm(p(2))Cm(p(K1))Cd(p(i))> \tau, Cm(p(1)) \ge Cm(p(2)) \ge \dots \ge Cm(p(K1))
    • 문제점: 이렇게 뽑은 상위 K1 픽들은 한 영역에 군집하는 경향이 있어 전체 장면에 걸친 안정적인 스케일 추정에 불리하다.
    • 해결책: 다음 상위 K2 후보들에서 furthest point sampling(FPS)을 적용해 서로 넓게 퍼진 KfKf개의 픽을 골라 추가 앵커로 삼는다.
    • 수식 표기:
      PFPS=FPS(PtopK2,Kf)P_{FPS} = FPS(P_{topK2}, K_f)
      PtopK2={p(i)}i=K1+1K1+K2P_{topK2} = \{ p(i)\}_{i=K1+1}^{K1+K2}
    • 최종 앵커 집합은 상위 신뢰 픽들과 FPS로 고른 픽들의 합집합이다.
    • 수식 표기:
      Panchor=PtopK1PFPSP_{anchor} = P_{topK1} \cup P_{FPS}
  • 표면 정렬(스케일 및 시프트 보정)

    • 정렬 목표: VGGT prior DpDp는 실제 표면에 대해 전체적으로 스케일과 시프트로 어긋날 수 있으므로 이 두 파라미터 ww (scale)와 qq (shift)를 앵커들에서의 깊이 값들이 렌더된 깊이 Dr와 잘 맞도록 최소제곱으로 추정한다.
    • 최적화 문제:
      (w,q)=argminw,qpPanchor(wDp(p)+qDr(p))2(w, q) = \arg\min_{w,q} \sum_{p \in P_{anchor}} (w \, D_p(p) + q - D_r(p))^2
    • 수식 표기:
      (w,q)=argminw,qpPanchor(wDp(p)+qDr(p))2(w, q) = \arg\min_{w,q} \sum_{p\in P_{anchor}} (wD_p(p) + q - D_r(p))^2
    • 행렬식 풀림:
      벡터 h=(w,q)Th = (w, q)^T와 각 앵커에 대해 dp=(Dp(p),1)Td_p = (D_p(p), 1)^T를 두면 닫힌형 해로 구할 수 있다.
    • 수식 표기:
      h=(pdpdpT)1(pdpDr(p))h = \left(\sum_p d_p d_p^T\right)^{-1} \left(\sum_p d_p D_r(p)\right)
    • 이렇게 얻은 w,qw, q로 prior를 정렬하여 정렬된 prior D^p\hat{D}_p를 만든다.
    • 수식 표기:
      hatDp=wDp+qhat{D}_p = w D_p + q
  • 왜 이렇게 하는가

    • 앵커는 여러 뷰에서 photometric 또는 geometric 일관성이 높아 실제 표면에 가깝다고 판단되는 픽들이다. 이들만 골라서 스케일과 시프트를 맞추면 전역적인 정렬이 더 정확하고 노이즈나 국소적 왜곡의 영향을 줄일 수 있다.
    • 군집된 앵커만 쓰면 특정 부위에 과도하게 맞춰져 전반적인 왜곡이 남을 수 있으므로 FPS로 분포를 확보하는 것이 중요하다.
  • 스케일과 시프트의 의미

    • depth prior Dp와 실제 표면에서의 깊이 Dr는 같은 카메라 좌표계 안에서 서로 비슷하지만 전체적으로 크기와 기준이 달라질 수 있다.
    • 스케일 w는 깊이값의 배율을 조정하는 항이다. 스케일이 2이면 모든 깊이가 카메라에서 두 배 멀어진 것처럼 보정하는 효과가 있다. 3차원에서는 카메라 광선(ray) 방향으로의 거리 축에 대해 선형적으로 늘리거나 줄이는 변환이다.
    • 시프트 q는 깊이값에 일정한 값만큼 더하거나 빼는 항이다. 시프트가 양수면 모든 표면이 카메라에서 더 멀어지게, 음수면 더 가까워지게 평행 이동한다. 3차원에서 광선 방향으로의 전역 평행 이동에 해당한다.
    • 결론적으로, (w,q)(w, q)는 각 픽셀의 원래 방사선 방향을 유지하면서 깊이 축에서 선형 변환으로 prior를 실제 표면에 맞추는 간단한 보정이다.
  • 수학적 문제 설정 요약

    • 앵커 픽 집합 PanchorP_{anchor}가 주어졌을 때 각 앵커 pp에 대해 prior 깊이 Dp(p)D_p(p)와 렌더된 깊이 Dr(p)D_r(p)가 있다. 목표는 선형 변환 D^p(p)=wDp(p)+q\hat{D}_p(p) = w D_p(p) + q가 앵커에서 Dr(p)D_r(p)와 잘 맞도록 wwqq를 최소자승 기준으로 찾는 것이다.
    • 최적화 문제:
      (w,q)=argminw,qpPanchor(wDp(p)+qDr(p))2(w, q) = \arg\min_{w,q} \sum_{p \in P_{anchor}} (w D_p(p) + q - D_r(p))^2
  • 목표 정리

    • 앵커마다 선형 모델 dpThDr(p)d_p^T h \approx D_r(p)를 세웠다. 여기서 h=(w,q)Th=(w,q)^T이고 dp=(Dp(p),1)Td_p=(D_p(p),1)^T이다. 모든 앵커를 동시에 고려하면 행렬식으로 쓰면 편리하다.
  • 행렬과 벡터 정의 및 차원 표기

    • 앵커 수를 mm이라 하자.

    • 설계 행렬 DRm×2D \in \mathbb{R}^{m\times 2}는 각 행이 dpTd_p^T로 구성된다:

      D=[dp1Tdp2TdpmT]=[Dp(p1)1Dp(p2)1Dp(pm)1]D = \begin{bmatrix} d_{p_1}^T \\ d_{p_2}^T \\ \vdots \\ d_{p_m}^T \end{bmatrix} = \begin{bmatrix} D_p(p_1) & 1 \\ D_p(p_2) & 1 \\ \vdots & \vdots \\ D_p(p_m) & 1 \end{bmatrix}
    • 목표(관측) 벡터 rRmr \in \mathbb{R}^m는 각 원소가 렌더된 깊이이다:

      r=[Dr(p1)Dr(p2)Dr(pm)]r = \begin{bmatrix} D_r(p_1) \\ D_r(p_2) \\ \vdots \\ D_r(p_m) \end{bmatrix}
    • 미지수 벡터 hR2h \in \mathbb{R}^2h=[wq]h=\begin{bmatrix} w \\ q \end{bmatrix}이다.

  • 최소제곱 문제 표기

    • 잔차 벡터는 e=Dhre = D h - r다.
    • 최소제곱 목적 함수는 잔차 제곱합 J(h)=Dhr22=(Dhr)T(Dhr)J(h) = \|D h - r\|_2^2 = (D h - r)^T (D h - r) 이다. 목적은 hh를 선택해 J(h)J(h)를 최소화하는 것이다.
  • 목적 함수 J(h)J(h)의 전개

    • 목적 함수 J(h)=(Dhr)T(Dhr)J(h) = (Dh - r)^T (Dh - r)는 벡터의 내적을 통해 스칼라 값을 계산하는 식이다.
    • 전개 과정:
      1. 분배 법칙을 적용한다: (Dhr)T(Dhr)=((Dh)TrT)(Dhr)(Dh - r)^T (Dh - r) = ((Dh)^T - r^T) (Dh - r).
      2. 괄호를 푼다: (Dh)TDh(Dh)TrrTDh+rTr(Dh)^T Dh - (Dh)^T r - r^T Dh + r^T r.
      3. 전치 행렬의 성질 (Dh)T=hTDT(Dh)^T = h^T D^T를 적용한다: hTDTDhhTDTrrTDh+rTrh^T D^T D h - h^T D^T r - r^T D h + r^T r.
      4. 중간의 두 항 hTDTrh^T D^T rrTDhr^T D h는 모두 계산 결과가 스칼라(숫자)인 값이다. 스칼라 값의 전치는 자기 자신과 같으므로 (hTDTr)T=rTDh(h^T D^T r)^T = r^T D h가 성립한다. 따라서 두 항을 하나로 합칠 수 있다: hTDTDh2rTDh+rTrh^T D^T D h - 2 r^T D h + r^T r.
      • 결과 식: J(h)=hTDTDh2rTDh+rTrJ(h) = h^T D^T D h - 2 r^T D h + r^T r.
  • 행렬 미분 공식 설명

    • 미분을 수행하기 위해 다음의 두 가지 기본 행렬 미분 공식을 사용한다. 여기서 xx는 벡터, AA는 행렬, bb는 벡터다.
    1. 선형 항의 미분: (bTx)x=b\frac{\partial (b^T x)}{\partial x} = b. 이 공식은 bTxb^T xxx의 각 성분에 bb의 성분을 곱해 더한 것임을 생각하면 쉽다.

    2. 이차 항의 미분: (xTAx)x=(A+AT)x\frac{\partial (x^T A x)}{\partial x} = (A + A^T) x. 만약 AA가 대칭 행렬이면 2Ax2Ax가 된다. 우리의 식에서 DTDD^T D는 항상 대칭 행렬이므로 2DTDh2 D^T D h가 된다.

  • 선형 항의 미분 예시: (bTx)x=b\frac{\partial (b^T x)}{\partial x} = b

    • 상황 설정: b=[35]b = \begin{bmatrix} 3 \\ 5 \end{bmatrix}, x=[x1x2]x = \begin{bmatrix} x_1 \\ x_2 \end{bmatrix} 라고 하자.
    • 내적 계산: bTx=[35][x1x2]=3x1+5x2b^T x = \begin{bmatrix} 3 & 5 \end{bmatrix} \begin{bmatrix} x_1 \\ x_2 \end{bmatrix} = 3x_1 + 5x_2 이다. 결과는 스칼라(숫자) 식이다.
    • 성분별 미분:
      1. x1x_1에 대해 미분하면: (3x1+5x2)x1=3\frac{\partial (3x_1 + 5x_2)}{\partial x_1} = 3.
      2. x2x_2에 대해 미분하면: (3x1+5x2)x2=5\frac{\partial (3x_1 + 5x_2)}{\partial x_2} = 5.
    • 결과 취합: 미분한 결과들을 다시 벡터로 모으면 [35]\begin{bmatrix} 3 \\ 5 \end{bmatrix} 가 된다. 이는 원래 벡터 bb와 정확히 일치한다.
    • 직관: axax를 미분하면 계수 aa만 남는 것과 같이, 벡터 내적 bTxb^T x를 미분하면 방향 벡터 bb만 남는다.
  • 이차 항의 미분 예시: (xTAx)x=2Ax\frac{\partial (x^T A x)}{\partial x} = 2Ax (대칭 행렬 AA인 경우)

    • 상황 설정: 대칭 행렬 A=[2113]A = \begin{bmatrix} 2 & 1 \\ 1 & 3 \end{bmatrix}와 벡터 x=[x1x2]x = \begin{bmatrix} x_1 \\ x_2 \end{bmatrix}를 사용한다. AA가 대칭인 이유는 A12=A21=1A_{12} = A_{21} = 1이기 때문이다.
    • 이차 형식 전개:
      1. 먼저 AxAx를 계산한다: Ax=[2x1+x2x1+3x2]Ax = \begin{bmatrix} 2x_1 + x_2 \\ x_1 + 3x_2 \end{bmatrix}.
      2. 그다음 xT(Ax)x^T (Ax)를 계산한다: [x1x2][2x1+x2x1+3x2]=x1(2x1+x2)+x2(x1+3x2)=2x12+2x1x2+3x22\begin{bmatrix} x_1 & x_2 \end{bmatrix} \begin{bmatrix} 2x_1 + x_2 \\ x_1 + 3x_2 \end{bmatrix} = x_1(2x_1 + x_2) + x_2(x_1 + 3x_2) = 2x_1^2 + 2x_1x_2 + 3x_2^2.
    • 성분별 미분:
      1. x1x_1에 대해 미분: (2x12+2x1x2+3x22)x1=4x1+2x2\frac{\partial (2x_1^2 + 2x_1x_2 + 3x_2^2)}{\partial x_1} = 4x_1 + 2x_2.
      2. x2x_2에 대해 미분: (2x12+2x1x2+3x22)x2=2x1+6x2\frac{\partial (2x_1^2 + 2x_1x_2 + 3x_2^2)}{\partial x_2} = 2x_1 + 6x_2.
    • 결과 비교 (2Ax2Ax 계산):
      • 2Ax=2[2x1+x2x1+3x2]=[4x1+2x22x1+6x2]2Ax = 2 \begin{bmatrix} 2x_1 + x_2 \\ x_1 + 3x_2 \end{bmatrix} = \begin{bmatrix} 4x_1 + 2x_2 \\ 2x_1 + 6x_2 \end{bmatrix}.
      • 위에서 직접 성분별로 미분한 결과와 2Ax2Ax 공식 결과가 정확히 같음을 확인할 수 있다.
    • 직관: ax2ax^2을 미분하면 2ax2ax가 되는 것과 같은 원리다. 행렬 세계에서도 이차식 xTAxx^T A x를 미분하면 2Ax2Ax 형태가 된다.
  • 논문 수식에 적용하기: J(h)=hT(DTD)h2(rTD)h+rTrJ(h) = h^T (D^T D) h - 2 (r^T D) h + r^T r

    • 첫 번째 항 (hT(DTD)hh^T (D^T D) h): 여기서 A=DTDA = D^T D이다. (DTD)T=DT(DT)T=DTD(D^T D)^T = D^T (D^T)^T = D^T D 이므로 항상 대칭 행렬이다. 따라서 미분 공식에 의해 2(DTD)h2 (D^T D) h가 된다.
    • 두 번째 항 (2(rTD)h-2 (r^T D) h): 여기서 bT=2rTDb^T = -2 r^T D로 보면 선형 항 미분 공식에 의해 bb의 전치 형태인 2DTr-2 D^T r이 남는다.
    • 세 번째 항 (rTrr^T r): 변수 hh가 전혀 없으므로 미분하면 0이 된다.
    • 결론: 이 공식들을 순차적으로 적용하여 hJ=2DTDh2DTr\nabla_h J = 2 D^T D h - 2 D^T r 이라는 깔끔한 결과가 도출된다.
  • 주의사항

    • 벡터 미분 결과의 차원을 확인하는 것이 중요하다. JJ가 스칼라이고 hh가 2차원 벡터이므로, 미분 결과인 그레디언트도 반드시 2차원 벡터여야 한다.
    • 공식 2번에서 AA가 대칭이 아닐 때는 (A+AT)x(A + A^T)x를 써야 하지만, 최소제곱 문제에서의 DTDD^T D는 수학적 구조상 무조건 대칭 행렬이므로 항상 2Ax2Ax 꼴을 사용할 수 있다.
  • 정상방정식과 닫힌형 해 도출

    • 함수가 최솟값을 가질 때 그레디언트는 0이 되어야 한다: 2DTDh2DTr=02 D^T D h - 2 D^T r = 0.
    • 양변을 2로 나누고 항을 정리하면 정상방정식(Normal Equation)이 얻어진다: DTDh=DTrD^T D h = D^T r.
    • 이 식에서 hh를 고립시키기 위해 양변의 왼쪽에 (DTD)1(D^T D)^{-1}를 곱한다: (DTD)1DTDh=(DTD)1DTr(D^T D)^{-1} D^T D h = (D^T D)^{-1} D^T r.
    • 행렬과 그 역행렬의 곱은 단위 행렬이므로 좌변은 hh만 남는다: h=(DTD)1DTrh = (D^T D)^{-1} D^T r.
  • 최종 수식의 성분별 상세 유도 (2×22 \times 2 행렬 기준)

    • 앵커의 prior 깊이 값들의 평균과 분산 개념으로 이해하면 더 쉽다.
    • DTD=[Dp2DpDpm]D^T D = \begin{bmatrix} \sum D_p^2 & \sum D_p \\ \sum D_p & m \end{bmatrix} 이 행렬의 역행렬이 존재하려면 행렬식(determinant)이 0이 아니어야 한다.
    • det(DTD)=mDp2(Dp)2\det(D^T D) = m \sum D_p^2 - (\sum D_p)^2.
    • 이 값은 데이터의 분산 공식인 m2×Var(Dp)m^2 \times Var(D_p)와 연관이 있다. 즉, 모든 앵커의 prior 깊이 DpD_p가 똑같은 값이라면 분산이 0이 되어 행렬식이 0이 되고 역행렬을 구할 수 없다.
    • 따라서 앵커를 선택할 때 다양한 깊이 값을 가진 지점들을 골고루 섞어주는 것(Furthest Point Sampling의 이유)이 수학적으로 해를 안정적으로 구하는 핵심 조건이 된다.
  • 왜 미분값이 0인 지점이 반드시 최소점인가?

    • 이차 함수의 볼록성 (Convexity)

      • 대수에서 이차항의 계수가 양수인 이차함수 y=ax2+bx+cy = ax^2 + bx + c (a>0a > 0)는 아래로 볼록한 포물선 형태를 띤다. 이 경우 미분값이 00인 지점은 오직 하나뿐이며, 그곳이 바로 최솟값이다.
      • 행렬식 J(h)=hT(DTD)h2DTrh+rTrJ(h) = h^T (D^T D) h - 2 D^T r h + r^T r에서 DTDD^T D는 대수에서의 계수 aa와 같은 역할을 한다.
    • DTDD^T D의 성질: 양의 준정부호 (Positive Semi-definite)

      • 어떤 행렬 AA가 모든 벡터 vv에 대해 vTAv0v^T A v \ge 0을 만족하면 양의 준정부호라고 한다.
      • 우리의 행렬 A=DTDA = D^T D는 항상 이 성질을 만족한다. 왜냐하면 hT(DTD)h=(Dh)T(Dh)=Dh2h^T (D^T D) h = (Dh)^T (Dh) = \|Dh\|^2가 되는데, 벡터의 길이는 항상 00 이상이기 때문이다.
      • 특히 앵커들이 서로 다른 깊이 값을 가져서 DD의 열들이 독립적이라면, DTDD^T D양의 정부호 (Positive Definite)가 된다. 이는 대수에서 a>0a > 0인 상황과 완벽히 일치하며, 함수가 모든 방향으로 '아래로 볼록'하다는 것을 의미한다.
    • 유일한 극점의 존재

      • 삼차 이상의 고차 방정식은 구부러진 굴곡이 많아 극대와 극소가 동시에 존재할 수 있다.
      • 하지만 이차 형식 목적 함수는 그레디언트 hJ=2DTDh2DTr\nabla_h J = 2 D^T D h - 2 D^T rhh에 대한 일차식이다.
      • 일차 방정식 Ax=bAx = b의 해가 하나뿐인 것처럼, 그레디언트가 00이 되는 지점도 오직 하나(역행렬이 존재할 때)만 존재한다. 볼록 함수에서 유일하게 존재하는 이 극점은 반드시 전역 최솟값이 된다.
    • 기하학적 해석: 타원형 골짜기

      • J(h)J(h)를 3차원 공간의 지형도로 그리면, 중심을 향해 매끄럽게 내려가는 타원형 그릇(Bowl) 모양이 된다.
      • 어느 방향에서 시작하더라도 경사를 따라 내려가면 결국 그릇의 가장 낮은 바닥 지점에 도달하게 된다. 이 바닥 지점이 바로 정상방정식 DTDh=DTrD^T D h = D^T r을 만족하는 해 hh이다.
      • 최소제곱법의 목적 함수는 구조적으로 아래로 볼록한 이차 함수다.
      • 따라서 미분값이 00인 지점(J=0\nabla J = 0)을 찾는 것은 곧 함수의 가장 낮은 지점을 찾는 것과 같다.
      • 삼차 방정식처럼 극대나 다른 극소점이 존재할 걱정 없이, 한 번의 미분과 방정식 풀이(정상방정식)로 전역 최솟값을 보장받을 수 있다.
  • 최종 수식의 성분별 상세 유도 (2×22 \times 2 행렬 기준)

    • 앵커의 prior 깊이 값들의 평균과 분산 개념으로 이해하면 더 쉽다.
    • DTD=[Dp2DpDpm]D^T D = \begin{bmatrix} \sum D_p^2 & \sum D_p \\ \sum D_p & m \end{bmatrix} 이 행렬의 역행렬이 존재하려면 행렬식(determinant)이 0이 아니어야 한다.
    • det(DTD)=mDp2(Dp)2\det(D^T D) = m \sum D_p^2 - (\sum D_p)^2.
    • 이 값은 데이터의 분산 공식인 m2×Var(Dp)m^2 \times Var(D_p)와 연관이 있다. 즉, 모든 앵커의 prior 깊이 DpD_p가 똑같은 값이라면 분산이 0이 되어 행렬식이 0이 되고 역행렬을 구할 수 없다.
    • 따라서 앵커를 선택할 때 다양한 깊이 값을 가진 지점들을 골고루 섞어주는 것(Furthest Point Sampling의 이유)이 수학적으로 해를 안정적으로 구하는 핵심 조건이 된다.
    • 이 부분이 이해가 안 간다면, 아래의 실제 예시를 통해 이해해보자.
  • 구체적 숫자 예시로 계산 흐름 보여주기

    • 가정: 앵커가 3개 있고, 각 앵커의 prior와 렌더된 깊이가 다음과 같다.
      • 앵커 1: Dp=2.0D_p = 2.0, Dr=2.5D_r = 2.5
      • 앵커 2: Dp=3.0D_p = 3.0, Dr=3.6D_r = 3.6
      • 앵커 3: Dp=5.0D_p = 5.0, Dr=5.8D_r = 5.8
    • 행렬 D와 벡터 r 구성
      • 각 앵커에 대해 dp=(Dp,1)Td_p = (D_p, 1)^T 이므로 D는 행 단위로:
        D=[213151]D = \begin{bmatrix} 2 & 1 \\ 3 & 1 \\ 5 & 1 \end{bmatrix}
      • r 벡터는 렌더된 깊이: r=[2.53.65.8]r = \begin{bmatrix} 2.5 \\ 3.6 \\ 5.8 \end{bmatrix}
    • 정상방정식 계산을 위해 DTDD^T DDTrD^T r를 계산한다.
      • DTD=[22+32+522+3+52+3+51+1+1]=[3810103]D^T D = \begin{bmatrix} 2^2 + 3^2 + 5^2 & 2+3+5 \\ 2+3+5 & 1+1+1 \end{bmatrix} = \begin{bmatrix} 38 & 10 \\ 10 & 3 \end{bmatrix}
      • DTr=[22.5+33.6+55.82.5+3.6+5.8]=[44.811.9]D^T r = \begin{bmatrix} 2\cdot2.5 + 3\cdot3.6 + 5\cdot5.8 \\ 2.5 + 3.6 + 5.8 \end{bmatrix} = \begin{bmatrix} 44.8 \\ 11.9 \end{bmatrix}
    • (DTD)1(D^T D)^{-1} 계산
      • 행렬의 행렬식은 3831010=114100=1438\cdot 3 - 10\cdot 10 = 114 - 100 = 14 이다.
      • 역행렬은 114[3101038]\frac{1}{14} \begin{bmatrix} 3 & -10 \\ -10 & 38 \end{bmatrix} 이다.
    • hh 계산: h=(DTD)1DTrh = (D^T D)^{-1} D^T r
      • 먼저 역행렬과 DTrD^T r의 곱을 계산한다. 내부 곱 결과는 다음과 같다.
        • 첫 성분: 344.8+(10)11.9=134.4119=15.43\cdot 44.8 + (-10)\cdot 11.9 = 134.4 - 119 = 15.4
        • 둘째 성분: (10)44.8+3811.9=448+452.2=4.2(-10)\cdot 44.8 + 38\cdot 11.9 = -448 + 452.2 = 4.2
      • 이를 1/141/14로 나누면 최종 hh 값이 나온다.
        • w=15.4/14=1.1w = 15.4 / 14 = 1.1
        • q=4.2/14=0.3q = 4.2 / 14 = 0.3
    • 해석: 얻은 변환은 D^p=1.1Dp+0.3\hat{D}_p = 1.1\cdot D_p + 0.3 이다. 예를 들어 prior가 3.0이면 정렬된 값은 1.13.0+0.3=3.6+0.3=3.91.1\cdot 3.0 + 0.3 = 3.6 + 0.3 = 3.9 이다. 이 예시에서는 정렬된 prior가 렌더된 깊이에 더 가깝게 맞춰진다.
  • 예시로 본 직관과 결과

    • 이 예에서는 scale이 1.1로 약간 확대하고 shift가 0.3으로 전체를 멀어지게 평행 이동시켜 prior를 렌더된 깊이에 근사시켰다.
    • 만약 prior가 전반적으로 작게 예측되었으면 w>1이 나오고, 전반적으로 절대값이 모두 더 먼 쪽으로 치우쳐있으면 q>0이 나온다. 반대 경우에는 w<1 또는 q<0이 나온다.
    • 이 선형 보정은 복잡한 비선형 왜곡을 전부 해결하지는 못하지만, 전체적인 scale/offset 차이를 제거하여 후속 relative depth 보정이 더 안정적으로 동작하도록 만든다.
  • 기대 효과 요약

    • 앵커 기반 정렬은 VGGT의 multi-view prior를 렌더된 장면 좌표계에 견고하게 맞추어, 이후 relative depth propagation이나 depth loss로 렌더링을 안정적으로 지도할 수 있게 한다.
    • 특히 sparse-view 환경에서 non-overlapping 또는 약한 중첩 영역의 깊이 보정에 유리하다.

2.2.3. Depth Estimation with VGGT

2.2.3.1. 수식 (9)(9): Depth Estimation에 대한 기초 이해

수식 99는 다음과 같다.

D^e(p)=RDE(pps)=Dr(ps)+(D^p(p)D^p(ps)),pPunrel\hat{D}_e(p) = \mathrm{RDE}(p p_s) = D_r(p_s) + \big(\hat{D}_p(p) - \hat{D}*p(p_s)\big), \quad p \in P*{\mathrm{unrel}}

여기서 psp_s는 선택된 anchor pixel이다.

이 식을 풀어 쓰면 다음 의미다.

D^e(p)=D^p(p)+(Dr(ps)D^p(ps))\hat{D}_e(p) = \hat{D}_p(p) + \big(D_r(p_s) - \hat{D}_p(p_s)\big)

D^p\hat{D}_p의 전체 구조를 유지하되, anchor psp_s에서 D^p(ps)\hat{D}_p(p_s)Dr(ps)D_r(p_s)와 같아지도록 평행이동한 것이다.

위 그림의 표현으로 말하면, D^p\hat{D}_pDrD_r 사이의 오차가 큰 unreliable pixel pp에 대해, prior curve를 anchor 위치에서 rendered curve에 붙인 뒤, 그 relative depth를 이용해 새로운 target depth D^e(p)\hat{D}_e(p)를 만든다. 논문도 Figure 4cc에서 이 과정을 “relative depth to the iso-surface of anchor depth”라고 설명한다.

여기서 중요한 점은 D^p(p)\hat{D}_p(p) 자체를 믿는 것이 아니라, D^p(p)D^p(ps)\hat{D}_p(p) - \hat{D}_p(p_s)라는 상대 깊이 차이를 믿는다는 것이다. VGGT prior의 절대 scale과 shift는 틀릴 수 있지만, “anchor보다 이 픽셀이 얼마나 앞이나 뒤에 있는가”라는 상대 구조는 더 신뢰할 수 있다고 보는 것이다.

2.2.3.2. 수식 1010: 하나의 anchor만 쓰면 불안정하므로 K3K_3개의 좋은 anchor를 골라 평균낸다

수식 1010은 다음과 같다.

D^e(p)=1K3p(i)RDE(pp(i)),pPunrel\hat{D}_e(p) = \frac{1}{K_3} \sum_{p^{(i)}} \mathrm{RDE}(p p^{(i)}), \quad p \in P_{\mathrm{unrel}}
ΔD(p(1))ΔD(p(2))ΔD(p(K3))\Delta D(p^{(1)}) \le \Delta D(p^{(2)}) \le \cdots \le \Delta D(p^{(K_3)})

여기서 ΔD(p)\Delta D(p)는 다음이다.

ΔD(p)=D^p(p)Dr(p)\Delta D(p) = |\hat{D}_p(p) - D_r(p)|

ΔD\Delta D가 작은 anchor는 aligned VGGT prior와 rendered depth가 잘 맞는 anchor이다. 논문은 이 값을 geometric accuracy의 indicator로 사용한다. ΔD\Delta D가 작다는 것은 “이 anchor에서는 VGGT prior와 현재 GS surface가 서로 크게 충돌하지 않는다”는 뜻이다. 따라서 그 anchor를 기준으로 상대 깊이를 전파하면 더 안정적이라고 보는 것이다.

수식 1010은 새로운 anchor를 추가하는 것이 아니다. 이미 수식 33에서 얻은 PanchorP_{\mathrm{anchor}} 안에서 ΔD\Delta D가 작은 순서대로 K3K_3개를 고른다. 그다음 각 anchor를 기준으로 수식 99의 RDE를 계산하고 평균낸다.

이를 전개하면 더 직관적이다.

RDE(pp(i))=Dr(p(i))+(D^p(p)D^p(p(i)))\mathrm{RDE}(p p^{(i)}) = D_r(p^{(i)}) + \big(\hat{D}_p(p) - \hat{D}_p(p^{(i)})\big)

따라서

D^e(p)=1K3i=1K3[Dr(p(i))+(D^p(p)D^p(p(i)))]\hat{D}_e(p) = \frac{1}{K_3} \sum_{i=1}^{K_3} \left[ D_r(p^{(i)}) + \big(\hat{D}_p(p) - \hat{D}_p(p^{(i)})\big) \right]

이를 다시 정리하면

D^e(p)=D^p(p)+1K3i=1K3[Dr(p(i))D^p(p(i))]\hat{D}_e(p) = \hat{D}*p(p) + \frac{1}{K_3} \sum*{i=1}^{K_3} \left[ D_r(p^{(i)}) - \hat{D}_p(p^{(i)}) \right]

즉 수식 1010은 “unreliable pixel pp의 aligned prior depth D^p(p)\hat{D}_p(p)에, 믿을 만한 anchor들에서 관측된 평균 residual shift를 더하는 것”이라고 볼 수 있다.

그림에 대응시키면 다음과 같다.

수식 99는 하나의 anchor psp_s를 기준으로 초록색 곡선 하나를 만드는 과정이다. 수식 1010은 anchor p(1)p(2),p(K3)p^{(1)} p^{(2)}, \dots p^{(K_3)} 각각에 대해 초록색 곡선을 하나씩 만들고, 특정 픽셀 pp에서 그 값들을 평균내는 과정이다.

논문에서는 초기 학습 단계에서 K3=4K_3=4로 두어 안정적으로 학습시키고, 학습이 진행되어 anchor depth가 실제 surface에 가까워지면 K3K_3를 점진적으로 1로 줄인다고 설명한다. 이유는 초기에는 anchor 자체가 조금 불안정하므로 여러 anchor를 평균내는 것이 안전하고, 후반에는 가장 좋은 anchor 하나를 쓰는 것이 더 정밀하기 때문이다.

2.2.3.3. 수식 1111: reliable region은 그대로 두고, unreliable region만 RDE로 보정한다

수식 1111은 최종 target depth map D^e\hat{D}_e를 정의한다.

D^e(p)={Dr(p),pPrel1K3p(i)RDE(pp(i)),pPunrel\hat{D}_e(p) = \begin{cases} D_r(p), & p \in P_{\mathrm{rel}} \\ \frac{1}{K_3}\sum_{p^{(i)}} \mathrm{RDE}(p p^{(i)}), & p \in P_{\mathrm{unrel}} \end{cases}

이 식의 의미는 매우 중요하다.

pPrelp \in P_{\mathrm{rel}}이면, 현재 rendered depth Dr(p)D_r(p)를 그대로 target으로 둔다. 그러면 depth loss에서

Dr(p)D^e(p)=Dr(p)Dr(p)=0|D_r(p) - \hat{D}_e(p)| = |D_r(p) - D_r(p)| = 0

이 되므로 해당 픽셀은 depth loss에 의해 바뀌지 않는다. 즉 이미 믿을 만하다고 판단된 영역은 억지로 VGGT prior에 맞추지 않는다.

반대로 pPunrelp \in P_{\mathrm{unrel}}이면, 현재 rendered depth가 aligned VGGT prior와 너무 크게 어긋난다고 판단된 영역이다. 이 경우 수식 1010의 평균 RDE 값을 target으로 삼는다. 그러면 LdepthL_{\mathrm{depth}}Dr(p)D_r(p)D^e(p)\hat{D}_e(p) 쪽으로 끌어당긴다.

따라서 수식 1111의 본질은 “전체 depth map을 VGGT에 맞춰 덮어씌우는 것”이 아니다. 오히려 훨씬 보수적인 방식이다. reliable region은 보존하고, unreliable region만 VGGT의 상대 깊이 구조를 이용해 수선한다.

2.2.3.4. 실제 숫자 예시

간단히 1차원 scanline 위에 anchor 3개가 있다고 하자. 이미 scale/shift alignment가 끝나서 D^p\hat{D}_p가 계산된 상태라고 하겠다.

pixelD^p\hat{D}_pDrD_rΔD=D^pDr\Delta D=\|\hat{D}_p - D_r\|
anchor a1a_12.002.040.04
anchor a2a_23.002.920.08
anchor a3a_34.004.200.20

그러면 anchor들 사이의 최대 차이는

δmax=0.20\delta_{\max} = 0.20

이다.

이제 어떤 픽셀 pp가 있다고 하자.

D^p(p)=3.60,Dr(p)=2.90\hat{D}_p(p)=3.60,\quad D_r(p)=2.90

그러면

ΔD(p)=3.602.90=0.70\Delta D(p)=|3.60-2.90|=0.70

이고, 이는 δmax=0.20\delta_{\max}=0.20보다 크다. 따라서 이 픽셀은 unreliable region에 들어간다.

이제 수식 99를 anchor별로 계산해보자.

anchor a1a_1 기준:

RDE(pa1)=Dr(a1)+(D^p(p)D^p(a1))=2.04+(3.602.00)=3.64\mathrm{RDE}(p a_1) = D_r(a_1)+(\hat{D}_p(p)-\hat{D}_p(a_1)) = 2.04+(3.60-2.00) = 3.64

anchor a2a_2 기준:

RDE(pa2)=2.92+(3.603.00)=3.52\mathrm{RDE}(p a_2) = 2.92+(3.60-3.00) = 3.52

anchor a3a_3 기준:

RDE(pa3)=4.20+(3.604.00)=3.80\mathrm{RDE}(p a_3) = 4.20+(3.60-4.00) = 3.80

만약 간단화를 위해 K3=2K_3=2라고 하면, ΔD\Delta D가 가장 작은 anchor 두 개는 a1a2a_1 a_2이다. 따라서 수식 1010에 의해

D^e(p)=3.64+3.522=3.58\hat{D}_e(p) = \frac{3.64+3.52}{2} = 3.58

이 된다.

현재 Dr(p)D_r(p)는 2.90이었는데, VGGS는 이 픽셀이 unreliable하다고 판단했으므로 depth loss를 통해 Dr(p)D_r(p)를 3.58 쪽으로 보정하려고 한다.

반대로 어떤 픽셀 qq

D^p(q)=2.50,Dr(q)=2.62\hat{D}_p(q)=2.50,\quad D_r(q)=2.62

라고 하자. 그러면

ΔD(q)=0.12\Delta D(q)=0.12

이고, 이는 δmax=0.20\delta_{\max}=0.20보다 작다. 따라서 qPrelq \in P_{\mathrm{rel}}이다. 수식 1111에 의해

D^e(q)=Dr(q)=2.62\hat{D}_e(q)=D_r(q)=2.62

가 된다. 이 픽셀은 depth loss로 수정하지 않는다.

2.2.3.5. 결론

초기 anchor pixel을 더 추가하는 과정은 수식 11, 22, 33이다. 수식 11은 consistency가 가장 높은 K1K_1개 픽셀을 고른다. 수식 22는 그다음 후보군에서 FPS를 통해 spatially diverse한 anchor를 추가한다. 수식 33은 이 둘을 합쳐 최종 PanchorP_{\mathrm{anchor}}를 만든다.

반면 수식 1010은 anchor를 새로 추가하는 것이 아니다. 이미 만들어진 PanchorP_{\mathrm{anchor}} 안에서 ΔD\Delta D가 작은, 즉 aligned prior와 rendered depth가 잘 맞는 anchor K3K_3개를 고른다. 그리고 각각의 anchor를 기준으로 수식 99의 평행이동 기반 RDE를 계산한 뒤 평균낸다.

수식 1111은 최종 target depth map D^e\hat{D}_e의 piecewise definition이다. reliable pixel은 DrD_r를 그대로 target으로 둬서 보존하고, unreliable pixel만 수식 1010의 평균 RDE 값으로 보정한다.

따라서 네 그림을 한 문장으로 수정하면 이렇게 된다.

D^p\hat{D}*pDrD_r의 차이가 anchor들이 보이는 최대 오차 δmax\delta*{\max}보다 큰 픽셀들은 unreliable로 보고, 기존 anchor 중 ΔD\Delta D가 작은 K3K_3개를 기준으로 D^p\hat{D}_p의 상대 깊이 구조를 각각 DrD_r에 평행이동시킨 뒤 평균하여 D^e\hat{D}_e를 만든다.”

2.3. Relative Depth Consistency Loss

Relative Depth Consistency Loss, 즉 LRDCL_{\mathrm{RDC}}의 핵심은 절대 깊이값을 맞추는 것이 아니라, 두 픽셀 사이의 깊이 순서(depth order)를 맞추는 것이다.

앞에서 설명한 LdepthL_{\mathrm{depth}}는 anchor-calibrated depth estimation으로 만든 D^e\hat{D}_e를 target으로 삼아

DrD^eD_r \rightarrow \hat{D}_e

가 되도록 직접 끌어당기는 loss였다. 반면 LRDCL_{\mathrm{RDC}}는 “이 픽셀의 깊이는 반드시 3.2여야 한다”라고 말하지 않는다. 대신 “VGGT prior에서 pip_ipi+1p_{i+1}보다 앞에 있으면, rendered depth에서도 pip_ipi+1p_{i+1}보다 앞에 있어야 한다”라고 강제한다.

LRDCL_{\mathrm{RDC}}는 다음과 같은 역할을 한다.

Dp의 depth rankingDr의 depth rankingD_p \text{의 depth ranking} \quad \approx \quad D_r \text{의 depth ranking}

논문에서도 이 loss는 surface alignment가 부정확할 수 있는 complex scene에서 LdepthL_{\mathrm{depth}}를 보조하기 위해 사용되며, rendered depth DrD_r의 두 픽셀 간 depth order가 depth prior DpD_p와 불일치할 때 penalty를 준다고 설명한다.

2.3.1. Figure 5 해석

그림을 단순화하면 다음 구조다.

p1op2op3op4p_1 \xrightarrow{o} p_2 \xrightarrow{o} p_3 \xrightarrow{o} p_4

여기서 oo는 offset이다. 어떤 픽셀 pip_i를 잡고, 거기서 offset oo만큼 이동한 픽셀을 pi+1p_{i+1}로 둔다.

pi+1=pi+op_{i+1} = p_i + o

Figure 5에서 검은 화살표 방향으로 p1p2p3p4p_1 p_2 p_3 p_4가 이어져 있다. 각 pair에 대해 다음 비교를 수행한다.

(p1p2),(p2p3),(p3p4)(p_1 p_2), \quad (p_2 p_3), \quad (p_3 p_4)

이때 직접 비교하는 것은 항상 가까운 두 픽셀 pair다. 그러나 이런 pairwise constraint가 연쇄적으로 걸리면 p1p_1에서 p4p_4까지 depth order 관계가 전파된다. Figure 5의 caption에서 “depth order relationship can propagate from p1p_1 to p4p_4”라고 한 것이 바로 이 의미다.

2.3.1.1. 빨간 박스와 노란 박스의 의미

Figure 5의 빨간 dashed box는 p1p_1 주변의 local region을 나타낸다. 노란 dashed box는 p4p_4 주변의 local region을 나타낸다.

여기서 OmaxO_{\max}는 local region의 최대 offset 범위다. 즉 pip_i에서 너무 멀리 떨어진 픽셀과 비교하지 않고, 최대 OmaxO_{\max} 범위 안에 있는 픽셀과만 비교한다.

그러나 중요한 점은 이 local comparison이 image 전체에서 반복된다는 것이다. 하나의 pair는 local하지만, 모든 픽셀에 대해 이 비교를 수행하고, iteration마다 offset도 바뀌기 때문에 결과적으로 전체 image plane에 depth ranking constraint가 퍼진다.

2.3.2. 수식 1313: 랜덤 offset을 샘플링한다

수식 1313은 다음과 같다.

o=(oxoy),oxOmax,oyOmaxo = (o_x o_y), \quad o_x \le O_{\max}, \quad o_y \le O_{\max}

이 식은 각 iteration마다 하나의 2D offset oo를 랜덤하게 뽑는다는 뜻이다. 예를 들어 다음과 같은 offset이 뽑힐 수 있다.

o=(5,3)o = (5, 3)

그러면 모든 픽셀 pi=(xy)p_i = (x y)에 대해 비교 대상 픽셀은 다음이 된다.

pi+1=pi+o=(x+5y+3)p_{i+1} = p_i + o = (x + 5 y + 3)

즉 현재 픽셀에서 오른쪽으로 5픽셀, 아래쪽으로 3픽셀 이동한 픽셀과 depth order를 비교한다.

2.3.2.1. 왜 offset을 랜덤하게 뽑는가

항상 같은 offset만 쓰면 특정 방향의 depth order만 학습된다. 예를 들어 항상 o=(1,0)o=(1,0)만 쓰면 오른쪽 픽셀과의 관계만 비교하게 된다. 그러면 위아래 방향이나 대각선 방향의 depth ordering 정보가 충분히 전달되지 않는다.

반면 iteration마다 oo를 다르게 뽑으면, 다음과 같은 여러 방향의 pairwise ranking을 학습할 수 있다.

(1,0),(0,1),(3,2),(2,4),(1,0), \quad (0,1), \quad (3,2), \quad (-2,4), \quad \cdots

논문 수식에는 oxOmaxoyOmaxo_x \le O_{\max} o_y \le O_{\max}라고만 적혀 있지만, 실제 구현에서는 image boundary를 벗어나지 않는 유효 픽셀 pair만 사용해야 한다.

2.3.2.2. OmaxO_{\max}는 local comparison의 반경이다

OmaxO_{\max}가 작으면 아주 가까운 픽셀끼리만 비교한다. 이 경우 local smoothness나 local ordering은 안정적이지만, 멀리 떨어진 영역 간 관계는 느리게 전파된다.

OmaxO_{\max}가 크면 더 먼 픽셀끼리도 비교한다. 이 경우 더 넓은 범위의 depth order를 빠르게 걸 수 있지만, 너무 먼 픽셀 간 depth ranking은 부정확할 가능성이 커진다.

Figure 5의 빨간 박스와 노란 박스가 바로 이 OmaxO_{\max} 범위를 시각화한 것이다.

2.3.3. 수식 1414: VGGT depth order와 rendered depth order가 같은지 검사한다

수식 1414는 다음과 같다.

L~RDC(pi)=σ(sgn(Dp(pi)Dp(pi+1))(Dr(pi+1)Dr(pi)))\tilde{L}_{\mathrm{RDC}}(p_i) = \sigma \left( \mathrm{sgn} \left( D_p(p_i) - D_p(p_{i+1}) \right) \cdot \left( D_r(p_{i+1}) - D_r(p_i) \right) \right)

여기서 σ\sigma는 ReLU다.

σ(x)=max(0x)\sigma(x) = \max(0 x)

이 수식은 처음 보면 헷갈리지만, 본질은 간단하다.

먼저 VGGT prior DpD_p에서 두 픽셀의 깊이 순서를 본다.

Dp(pi)Dp(pi+1)D_p(p_i) - D_p(p_{i+1})

그다음 rendered depth DrD_r에서 두 픽셀의 깊이 순서를 본다.

Dr(pi+1)Dr(pi)D_r(p_{i+1}) - D_r(p_i)

두 순서가 같으면 loss가 0이 된다. 두 순서가 반대면 양수 penalty가 생긴다.

2.3.3.1. 핵심 변수 두 개로 다시 쓰면 이해가 쉽다

다음처럼 두 변수를 정의하자.

s=sgn(Dp(pi)Dp(pi+1))s = \mathrm{sgn} \left( D_p(p_i) - D_p(p_{i+1}) \right)
r=Dr(pi+1)Dr(pi)r = D_r(p_{i+1}) - D_r(p_i)

그러면 수식 1414는 다음처럼 쓸 수 있다.

L~RDC(pi)=ReLU(sr)\tilde{L}_{\mathrm{RDC}}(p_i) = \mathrm{ReLU}(s \cdot r)

여기서 ss는 VGGT prior가 말하는 depth order다. rr은 rendered depth에서의 실제 depth difference다.

2.3.3.2. Case 1: VGGT prior에서 pip_ipi+1p_{i+1}보다 가깝다고 하자

깊이값은 일반적으로 클수록 카메라에서 멀다고 보겠다.

VGGT prior에서

Dp(pi)<Dp(pi+1)D_p(p_i) < D_p(p_{i+1})

이면 pip_i가 더 가깝고, pi+1p_{i+1}가 더 멀다는 뜻이다. 그러면

Dp(pi)Dp(pi+1)<0D_p(p_i) - D_p(p_{i+1}) < 0

이므로

s=1s = -1

이제 rendered depth도 올바르다면

Dr(pi)<Dr(pi+1)D_r(p_i) < D_r(p_{i+1})

이어야 한다. 그러면

Dr(pi+1)Dr(pi)>0D_r(p_{i+1}) - D_r(p_i) > 0

이므로

r>0r > 0

따라서

sr=(1)(+)<0s \cdot r = (-1) \cdot (+) < 0

이고 ReLU를 통과하면

L~RDC(pi)=0\tilde{L}_{\mathrm{RDC}}(p_i)=0

이 된다. 즉 depth order가 맞으면 penalty가 없다.

반대로 rendered depth가 잘못되어

Dr(pi)>Dr(pi+1)D_r(p_i) > D_r(p_{i+1})

이면 pip_i가 더 멀고 pi+1p_{i+1}가 더 가깝게 렌더링된 것이다. 이는 VGGT prior의 순서와 반대다. 이 경우

Dr(pi+1)Dr(pi)<0D_r(p_{i+1}) - D_r(p_i) < 0

이므로

r<0r < 0

따라서

sr=(1)()>0s \cdot r = (-1) \cdot (-) > 0

이고 ReLU를 통과해 양수 loss가 생긴다.

2.3.3.3. Case 2: VGGT prior에서 pip_ipi+1p_{i+1}보다 멀다고 하자

이번에는

Dp(pi)>Dp(pi+1)D_p(p_i) > D_p(p_{i+1})

라고 하자. 그러면 pip_i가 더 멀고, pi+1p_{i+1}가 더 가깝다는 뜻이다.

이 경우

Dp(pi)Dp(pi+1)>0D_p(p_i) - D_p(p_{i+1}) > 0

이므로

s=+1s = +1

올바른 rendered depth라면

Dr(pi)>Dr(pi+1)D_r(p_i) > D_r(p_{i+1})

이어야 한다. 그러면

Dr(pi+1)Dr(pi)<0D_r(p_{i+1}) - D_r(p_i) < 0

r<0r < 0

이다. 따라서

sr=(+1)()<0s \cdot r = (+1) \cdot (-) < 0

이고 ReLU 이후 loss는 0이다.

반대로 rendered depth가 틀려서

Dr(pi)<Dr(pi+1)D_r(p_i) < D_r(p_{i+1})

이면

r>0r > 0

이고

sr=(+1)(+)>0s \cdot r = (+1) \cdot (+) > 0

이므로 penalty가 생긴다.

2.3.4. 수식 1414를 표로 정리하면 이렇다

| VGGT prior DpD_p의 판단 | rendered depth DrD_r의 상태 | srs \cdot r | ReLU 이후 |
| -- | | -: | : |
| pip_i가 더 가깝다 | pip_i가 더 가깝게 렌더링됨 | 음수 | 0 |
| pip_i가 더 가깝다 | pip_i가 더 멀게 렌더링됨 | 양수 | penalty |
| pip_i가 더 멀다 | pip_i가 더 멀게 렌더링됨 | 음수 | 0 |
| pip_i가 더 멀다 | pip_i가 더 가깝게 렌더링됨 | 양수 | penalty |

따라서 수식 1414VGGT prior와 rendered depth의 상대적인 앞뒤 관계가 일치하면 0, 반대로 뒤집혀 있으면 양수 penalty를 주는 ranking loss다.

2.3.5. 숫자 예시로 보는 수식 1414

예를 들어 pip_ipi+1p_{i+1}가 있다고 하자.

VGGT prior가 다음처럼 예측했다고 하자.

Dp(pi)=1.0,Dp(pi+1)=1.5D_p(p_i)=1.0, \quad D_p(p_{i+1})=1.5

그러면 VGGT는 pip_i가 더 가깝고 pi+1p_{i+1}가 더 멀다고 말하는 것이다.

이제 rendered depth가 올바르게 다음처럼 나왔다고 하자.

Dr(pi)=2.0,Dr(pi+1)=2.4D_r(p_i)=2.0, \quad D_r(p_{i+1})=2.4

절대값은 VGGT prior와 다르지만 순서는 같다. pip_i가 더 가깝고 pi+1p_{i+1}가 더 멀다.

계산하면

s=sgn(1.01.5)=1s = \mathrm{sgn}(1.0 - 1.5) = -1
r=2.42.0=0.4r = 2.4 - 2.0 = 0.4
sr=0.4s \cdot r = -0.4
ReLU(0.4)=0\mathrm{ReLU}(-0.4)=0

따라서 penalty가 없다.

반대로 rendered depth가 다음처럼 나왔다고 하자.

Dr(pi)=2.4,Dr(pi+1)=2.0D_r(p_i)=2.4, \quad D_r(p_{i+1})=2.0

그러면 rendered depth에서는 pip_i가 더 멀고 pi+1p_{i+1}가 더 가깝다. VGGT prior와 순서가 뒤집혔다.

s=1s = -1
r=2.02.4=0.4r = 2.0 - 2.4 = -0.4
sr=(1)(0.4)=0.4s \cdot r = (-1)(-0.4)=0.4
ReLU(0.4)=0.4\mathrm{ReLU}(0.4)=0.4

따라서 penalty가 생긴다. 이 penalty는 optimization 과정에서 Dr(pi)D_r(p_i)Dr(pi+1)D_r(p_{i+1})의 순서를 VGGT prior와 맞추도록 작용한다.

2.3.6. Figure 5의 p1p4p_1 \rightarrow p_4 전파를 예시로 이해하기

Figure 5에서 직접 비교하는 pair는 다음과 같다.

(p1p2),(p2p3),(p3p4)(p_1 p_2), \quad (p_2 p_3), \quad (p_3 p_4)

VGGT prior가 다음 순서를 가진다고 하자.

Dp(p1)<Dp(p2)<Dp(p3)<Dp(p4)D_p(p_1) < D_p(p_2) < D_p(p_3) < D_p(p_4)

p1p_1이 가장 가깝고, p4p_4가 가장 멀다.

그러면 LRDCL_{\mathrm{RDC}}는 다음 세 가지 조건을 rendered depth에 건다.

Dr(p1)<Dr(p2)D_r(p_1) < D_r(p_2)
Dr(p2)<Dr(p3)D_r(p_2) < D_r(p_3)
Dr(p3)<Dr(p4)D_r(p_3) < D_r(p_4)

이 세 조건이 동시에 만족되면 자연스럽게

Dr(p1)<Dr(p4)D_r(p_1) < D_r(p_4)

도 성립한다.

p1p_1p4p_4를 직접 비교하지 않아도, local pairwise ranking이 연쇄적으로 연결되면서 더 먼 픽셀 사이의 depth order까지 간접적으로 전파된다. 이것이 Figure 5에서 “depth order relationship can propagate from p1p_1 to p4p_4”라고 한 의미다.

2.3.7. 수식 1515: 모든 픽셀에 대해 평균낸다

수식 1515는 다음과 같다.

LRDC=avgpiIL~RDC(pi)L_{\mathrm{RDC}} = \mathrm{avg}*{p_i \in I} \tilde{L}*{\mathrm{RDC}}(p_i)

이는 image II 안의 모든 픽셀 pip_i에 대해 수식 1414를 계산한 뒤 평균낸다는 뜻이다.

즉 하나의 픽셀 pair만 보는 것이 아니다. offset oo가 정해지면, image 전체에서 다음 pair들을 한꺼번에 만든다.

pipi+op_i \rightarrow p_i + o

그리고 모든 유효한 pair에 대해 “VGGT prior의 depth order와 rendered depth의 depth order가 같은가?”를 검사한다.

평균을 내기 때문에 LRDCL_{\mathrm{RDC}}는 전체 image plane에서 depth ordering이 얼마나 일관적인지를 나타내는 global objective가 된다.

2.3.8. 왜 이 loss가 anchor-calibrated depth estimation과 다른가

Anchor-calibrated depth estimation은 D^e\hat{D}*e라는 target depth map을 만든다. 그리고 LdepthL*{\mathrm{depth}}DrD_rD^e\hat{D}_e에 가까워지도록 직접적인 깊이값 supervision을 건다.

반면 LRDCL_{\mathrm{RDC}}D^e\hat{D}_e를 사용하지 않는다. 수식 1414를 보면 D^p\hat{D}_p도 쓰지 않고, 원래 VGGT prior인 DpD_p와 rendered depth DrD_r만 사용한다.

이것은 의도적인 설계로 이해할 수 있다. LRDCL_{\mathrm{RDC}}는 절대 scale이나 shift를 맞추려는 loss가 아니다. 깊이값의 정확한 magnitude가 아니라, 두 픽셀의 앞뒤 관계만 본다.

예를 들어 VGGT prior가 실제 깊이보다 2배 크게 예측했거나 전체적으로 +1만큼 shift되어 있어도, 다음 순서 자체는 유지될 수 있다.

Dp(pi)<Dp(pi+1)D_p(p_i) < D_p(p_{i+1})

이 order 정보는 scale과 shift가 조금 틀려도 비교적 안정적이다. 그래서 LRDCL_{\mathrm{RDC}}는 anchor alignment가 완벽하지 않은 complex scene에서 보조적인 regularizer로 작동한다.

2.3.9. LdepthL_{\mathrm{depth}}LRDCL_{\mathrm{RDC}}의 차이를 한 문장으로 정리하면 이렇다

LdepthL_{\mathrm{depth}}

는 “이 픽셀의 rendered depth를 이 target 값으로 맞춰라”라는 absolute depth supervision이다.

LRDCL_{\mathrm{RDC}}

는 “두 픽셀의 앞뒤 순서가 VGGT prior와 같도록 만들어라”라는 relative depth ranking supervision이다.

따라서 LdepthL_{\mathrm{depth}}는 강하지만 anchor alignment가 틀리면 잘못된 target을 줄 수 있다. 반면 LRDCL_{\mathrm{RDC}}는 약하지만 scale과 shift에 덜 민감하고, local pairwise order를 통해 전체 표면의 depth consistency를 안정화한다.

결론적으로 Figure 5와 수식 1313, 1414, 1515는 다음 한 문장으로 요약된다.

랜덤 offset oo로 이미지 전체에서 픽셀 pair (pipi+o)(p_i p_i+o)를 만들고, VGGT depth prior DpD_p가 말하는 두 픽셀의 앞뒤 순서와 현재 rendered depth DrD_r의 앞뒤 순서가 다르면 ReLU ranking penalty를 주며, 이 값을 모든 픽셀에 대해 평균낸 것이 LRDCL_{\mathrm{RDC}}다.

2.4. Loss Function

VGGS의 최종 목적 함수는 PGSR을 기반으로 한 기본 loss에, 앞서 설명한 anchor-calibrated depth estimation과 relative depth consistency를 결합한 형태로 정의된다. VGGS는 PGSR 프레임워크 위에서 구현되었기 때문에, 먼저 PGSR의 기본적인 reconstruction 및 geometry regularization 항을 일부 유지한다. 다만 VGGS의 핵심은 VGGT가 제공하는 multi-view depth prior를 활용하는 것이므로, PGSR의 모든 loss를 그대로 사용하는 것은 아니다. 논문에서는 PGSR의 image reconstruction loss, scale loss, single-view normal loss를 baseline loss로 사용하고, PGSR의 multi-view geometric 및 multi-view photometric constraints는 baseline에서 제외한다고 설명한다.

2.4.1. PGSR Loss

image reconstruction loss
PGSR에서 image reconstruction loss LrgbL_{\mathrm{rgb}}는 렌더링된 RGB 이미지가 입력 이미지와 일치하도록 만드는 항이다. 이는 3D Gaussian Splatting 계열 방법에서 가장 기본적인 supervision으로, 렌더링 품질을 유지하는 역할을 한다. 그러나 RGB loss만으로는 좋은 surface geometry가 보장되지 않는다. 특히 sparse-view setting에서는 서로 다른 geometry가 비슷한 RGB 렌더링 결과를 만들 수 있기 때문에, photometric supervision만으로는 depth와 normal이 부정확해질 수 있다.

scale loss
이를 보완하기 위해 PGSR은 Gaussian을 평면적인 구조로 유도하는 scale loss LsL_s는 Gaussian이 지나치게 3차원적으로 부풀어 오르지 않고 표면에 가까운 planar primitive처럼 작동하도록 유도한다.

single-view normal loss
렌더링된 normal과 depth로부터 계산된 normal이 일관되도록 하는 single-view normal loss LsvgeomL_{\mathrm{svgeom}}는 한 view 안에서 depth와 normal 사이의 기하학적 일관성을 맞추는 항이다. 즉 렌더링된 depth map이 실제로 어떤 local surface를 이룬다면, 그 depth에서 계산한 normal과 Gaussian이 렌더링한 normal이 서로 비슷해야 한다는 제약이다.

VGGS는 이 세 항을 baseline loss로 묶어 다음과 같이 정의한다.

Lbaseline=Lrgb+λsLs+Lsvgeom(16)L_{\mathrm{baseline}} = L_{\mathrm{rgb}} + \lambda_s L_s + L_{\mathrm{svgeom}} \tag{16}

여기서 λs\lambda_s는 scale loss의 가중치이다. 이 baseline loss는 VGGS가 기본적인 렌더링 품질과 local surface regularity를 유지하도록 한다. 즉 LrgbL_{\mathrm{rgb}}는 appearance를 맞추고, LsL_s는 Gaussian의 형태를 surface-like하게 만들며, LsvgeomL_{\mathrm{svgeom}}는 depth-normal consistency를 유지한다.

2.4.2. VGGS Loss

VGGS의 핵심적인 차별점은 여기에 VGGT 기반의 depth prior를 추가한다는 점이다. 앞 절에서 정의한 anchor-calibrated depth estimation은 estimated depth map D^e\hat{D}*e를 만들고, 이를 통해 rendered depth DrD_r를 직접 감독하는 LdepthL*{\mathrm{depth}}를 구성한다. 이 항은 unreliable region의 depth를 VGGT prior의 상대 깊이 구조에 따라 보정하는 역할을 한다. 또한 LRDCL_{\mathrm{RDC}}는 두 픽셀 사이의 depth order가 VGGT prior와 일치하도록 만드는 ranking-based regularization이다. 따라서 LdepthL_{\mathrm{depth}}가 absolute depth에 가까운 supervision이라면, LRDCL_{\mathrm{RDC}}는 relative depth ordering을 유지하는 보조 supervision이라고 볼 수 있다.

추가적으로 VGGS는 normal prior를 사용해 depth normal을 더 부드럽고 안정적으로 만들기 위한 LnormalL_{\mathrm{normal}}을 도입한다. 이 항은 reconstructed surface가 local하게 지나치게 noisy해지는 것을 막고, 표면의 smoothness를 개선하는 역할을 한다.

최종적으로 VGGS의 전체 loss는 다음과 같이 정의된다.

LVGGS=λdLdepth+LRDC+Lnormal+Lbaseline(17)L_{\mathrm{VGGS}} = \lambda_d L_{\mathrm{depth}} + L_{\mathrm{RDC}} + L_{\mathrm{normal}} + L_{\mathrm{baseline}} \tag{17}

여기서 λd\lambda_d는 depth loss의 가중치이다. 전체적으로 보면 LbaselineL_{\mathrm{baseline}}은 PGSR 기반의 기본 렌더링 및 local geometry 품질을 담당하고, LdepthL_{\mathrm{depth}}는 anchor-calibrated depth target을 통해 잘못된 depth를 직접 보정하며, LRDCL_{\mathrm{RDC}}는 VGGT prior와 rendered depth 사이의 상대적인 depth order를 맞춘다. 마지막으로 LnormalL_{\mathrm{normal}}은 표면의 smoothness와 normal consistency를 강화한다.

따라서 VGGS의 loss function은 단순히 VGGT depth를 GS에 강제로 맞추는 구조가 아니다. 오히려 PGSR의 기본적인 surface reconstruction framework 위에 VGGT의 multi-view geometric prior를 절대 깊이 supervision과 상대 깊이 ranking supervision의 형태로 추가한 구조다. 이 때문에 VGGS는 sparse-view 상황에서도 RGB loss만 사용할 때보다 더 안정적인 geometry를 얻을 수 있다.

3. Experiments

3.1. Datasets and Implementation Details

VGGS는 sparse-view surface reconstruction 성능을 평가하기 위해 DTU, Tanks and Temples, 그리고 self-captured data에서 실험을 수행한다.

3.1.1. Datasets

DTU
Object-level reconstruction 성능을 평가하기 위한 dataset이다. 논문에서는 총 15개의 scene을 사용하며, 기존 sparse-view reconstruction 연구들과 동일하게 22, 25, 28번 view의 3장 이미지만 입력으로 사용한다. 이 세 view는 small-overlap setting에 해당하므로, sparse-view 상황에서 geometry를 얼마나 안정적으로 복원할 수 있는지 평가하기에 적합하다.

Tanks and Temples
DTU보다 더 복잡한 unbounded scene을 포함한다. VGGS는 Caterpillar, Ignatius, Truck, Barn의 4개 scene을 사용하며, 입력 이미지 수를 5장, 10장, 20장으로 바꾸어 실험한다. 이를 통해 입력 view 수가 증가할 때 reconstruction quality가 어떻게 달라지는지 확인한다.

Self-captured data
실제 모바일폰으로 촬영한 이미지에 대해 VGGS가 어느 정도 일반화되는지 확인하기 위한 실험이다. 논문에서는 신발과 장난감 예시를 보여주며, 신발끈과 얼굴 표면 같은 세부 geometry를 비교적 잘 복원할 수 있음을 보인다.

3.1.2. Implementation Details

VGGS는 PGSR framework를 기반으로 구현된다. 다만 PGSR의 multi-view geometric constraint와 multi-view photometric constraint를 그대로 사용하지 않고, image reconstruction loss, scale loss, single-view normal loss만 baseline loss로 사용한다. 그 위에 VGGS의 핵심 요소인 anchor-calibrated depth estimation과 relative depth consistency loss를 추가한다.

Gaussian initialization에는 MAtCha를 따라 MASt3R-SfM을 사용한다. Normal prior는 Metric3D에서 얻는다. 전체 학습은 3K iteration 동안 수행된다. 처음 1K iteration에서는 잘못된 anchor selection과 초기 misalignment를 피하기 위해 LbaselineL_{\mathrm{baseline}}만 사용한다. 이후 2K iteration에서는 전체 loss LVGGSL_{\mathrm{VGGS}}를 사용한다.

Anchor-calibrated depth estimation은 계산 비용이 크기 때문에 매 iteration마다 수행하지 않는다. 대신 500 iteration마다 estimated depth map D^e\hat{D}_e를 갱신하여 학습 효율성을 높인다. 모든 실험은 단일 RTX 3090 GPU에서 수행된다.

3.2. Experimental Comparisons

VGGS는 DTU와 Tanks and Temples에서 기존 sparse-view surface reconstruction 방법들과 비교된다. 비교 대상에는 2DGS, PGSR, PeTR, UFORecon, MonoSDF, NeuSurf, SparseCraft, FatesGS, MAtCha 등이 포함된다.

3.2.1. DTU Results

DTU에서는 Chamfer Distance를 사용하여 surface reconstruction accuracy를 평가한다. VGGS는 평균 CD 0.91을 기록하며, 기존 방법들보다 우수한 성능을 보인다. 이전 최고 성능인 MAtCha의 평균 CD는 1.16이며, VGGS는 이를 약 21.6% 개선한다.

COLMAP initialization을 사용한 VGGS*의 경우 평균 CD는 0.95로, MASt3R-SfM initialization을 사용한 VGGS보다 약간 낮은 성능을 보인다. 그러나 여전히 MAtCha, FatesGS 등 기존 방법보다 좋은 평균 성능을 유지한다. 이는 sparse Gaussian initialization이 다소 불리하더라도 VGGS의 depth prior 기반 보정이 robust하게 작동함을 보여준다.

정성적 결과에서도 VGGS는 기존 방법들보다 더 매끄럽고 세부적인 표면을 복원한다. 특히 sparse-view 상황에서 발생하기 쉬운 surface hole이나 noisy artifact가 줄어드는 경향을 보인다.

3.2.2. Tanks and Temples Results

Tanks and Temples에서는 F-score를 사용하여 reconstruction quality를 평가한다. VGGS는 5-view, 10-view, 20-view setting 모두에서 MAtCha보다 높은 F-score를 기록한다.

특히 view 수가 10장에서 20장으로 증가할 때 VGGS의 성능 향상이 두드러진다. 이는 VGGS가 sparse-view setting에서도 잘 작동하지만, 입력 view가 조금 더 많아질수록 VGGT prior와 GS optimization이 더 안정적으로 결합될 수 있음을 의미한다.

정성적 결과에서도 VGGS는 MAtCha보다 더 faithful한 geometry를 복원한다. 논문에서는 모든 mesh를 TSDF fusion으로 추출하여 비교하며, VGGS가 더 선명한 표면 구조와 세부 geometry를 보존함을 보여준다.

3.2.3. Self-captured Data Results

Self-captured data에서는 모바일폰으로 촬영한 일반 이미지에 대해 VGGS를 적용한다. 결과적으로 VGGS는 실제 촬영 환경에서도 신발끈과 같은 얇은 구조나 장난감 얼굴의 매끄러운 표면을 비교적 잘 복원한다. 이는 VGGS가 benchmark dataset뿐만 아니라 실제 sparse-view 촬영 환경에서도 어느 정도 일반화될 수 있음을 보여준다.

3.3. Ablation Study

Ablation study는 VGGS의 각 loss component가 reconstruction quality에 얼마나 기여하는지 분석한다. 논문에서는 DTU의 Chamfer Distance와 TNT의 F-score를 함께 사용하여 평가한다.

가장 큰 성능 향상은 LdepthL_{\mathrm{depth}}에서 나온다. Baseline의 CD는 1.51이지만, LdepthL_{\mathrm{depth}}를 추가하면 CD가 0.96으로 크게 감소한다. 이는 anchor-calibrated depth estimation이 sparse-view surface reconstruction에서 핵심적인 역할을 한다는 것을 보여준다.

LRDCL_{\mathrm{RDC}}만 사용해도 성능이 baseline보다 개선된다. 이는 VGGT prior의 상대적인 depth order가 rendered depth를 regularization하는 데 유효함을 의미한다. 다만 DTU에서는 LdepthL_{\mathrm{depth}}와 함께 사용할 때 추가 개선 폭이 크지 않다. DTU는 object-level scene이고 상대적으로 reconstruction이 쉬운 편이기 때문에, D^e\hat{D}_e가 이미 VGGT prior의 상대 깊이 구조와 잘 맞기 때문이다.

반면 TNT처럼 더 복잡한 unbounded scene에서는 LRDCL_{\mathrm{RDC}}의 효과가 더 뚜렷하다. LdepthL_{\mathrm{depth}}만 사용할 때 F-score는 0.174지만, LRDCL_{\mathrm{RDC}}를 함께 사용하면 0.189로 향상된다. 이는 complex scene에서 relative depth consistency가 depth loss를 보조하여 더 안정적인 geometry를 만들 수 있음을 보여준다.

LnormalL_{\mathrm{normal}} 역시 표면 복원 품질을 개선한다. Normal prior는 depth normal을 더 부드럽고 안정적으로 만들어 표면의 local smoothness를 향상시킨다. 최종적으로 LdepthL_{\mathrm{depth}}, LRDCL_{\mathrm{RDC}}, LnormalL_{\mathrm{normal}}을 모두 사용한 full model이 가장 좋은 성능을 기록한다.

3.4. Computing Resources Consumption

VGGS는 성능뿐 아니라 계산 효율성에서도 강점을 보인다. 논문에서는 DTU dataset에서 state-of-the-art scene-specific methods와 GPU memory usage 및 training time을 비교한다.

VGGS는 단일 scene 기준으로 약 2GB의 GPU memory만 사용하며, 평균 training time은 약 2분이다. 이는 기존 NeRF/SDF 기반 방법들보다 훨씬 빠르고, 다른 GS 기반 sparse-view reconstruction 방법들보다도 효율적이다.

이러한 효율성은 두 가지 설계에서 나온다. 첫째, VGGS는 PGSR 기반의 Gaussian Splatting framework를 사용하므로 기본적으로 빠른 optimization과 rendering이 가능하다. 둘째, anchor-calibrated depth estimation을 매 iteration마다 수행하지 않고 500 iteration마다 수행하여 추가 계산 비용을 줄인다. 따라서 VGGS는 sparse-view setting에서 reconstruction accuracy와 training efficiency를 동시에 만족하는 방법이라고 볼 수 있다.

4. Conclusion

  • 저자들의 기여
    VGGS는 sparse-view surface reconstruction을 위해 VGGT의 multi-view geometric prior를 3D Gaussian Splatting에 결합한 방법이다. 기존 GS 기반 방법들은 sparse-view 상황에서 multi-view cue가 부족해 geometry가 불안정해지는 문제가 있다. VGGS는 이를 해결하기 위해 anchor-calibrated depth estimationrelative depth consistency loss를 제안한다.

  • Anchor-calibrated depth estimation
    multi-view consistent anchor를 선택하고, 이를 기준으로 VGGT depth prior를 rendered depth에 정렬한다. 이후 unreliable region에서는 anchor와의 relative depth를 이용해 estimated depth map을 생성한다. 이 과정은 VGGT prior의 절대 깊이값을 그대로 사용하는 것이 아니라, 상대적인 geometry 구조를 활용한다는 점에서 안정적이다.

  • Relative depth consistency loss
    rendered depth의 depth order가 VGGT depth prior와 일치하도록 만든다. 이는 complex scene에서 anchor-based depth estimation이 완벽하지 않을 때 보조적인 regularization으로 작동한다.

  • 실험 결과
    실험적으로 VGGS는 DTU와 Tanks and Temples에서 기존 sparse-view surface reconstruction 방법들보다 높은 reconstruction quality를 달성한다. 또한 단일 RTX 3090 GPU에서 약 2GB memory와 2분 수준의 training time만으로 좋은 결과를 보여, accuracy와 efficiency를 동시에 만족한다.

  • 한계
    다만 VGGS는 multi-view consistency를 이용해 anchor를 선택하기 때문에, 서로 다른 view 사이에 overlap이 전혀 없는 극단적인 상황에서는 작동하기 어렵다. 따라서 더 강건한 anchor selection 방법을 설계하는 것이 향후 연구 방향이 될 수 있다.

profile
상어 인형을 좋아하는 사람

0개의 댓글