DUSt3R : Geometric 3D Vision Made Easy (진행 중)

윤준영·2025년 4월 7일

Computer Vision

목록 보기
10/13
post-thumbnail

1. Abstract & Introduction

Multi-View Stereo (MVS)는 이미지 간의 대응점을 통한 3차원 재구성을 위해 카메라 내부 파라미터와 외부 파라미터를 요구하지만, 이 파라미터를 구하는 과정은 상당히 번거롭다. DUSt3R은 Dense and Unconstrained Stereo 3D Reconstruction의 약자로, 문장에서 예상할 수 있듯이 카메라 파라미터나 포즈에 대한 사전 정보 없이 이미지를 통해 카메라 파라미터와 포즈를 복원한다.
논문에서 소개한 네트워크는 일반적인 transformer 구조로 이루어져있고, 이미지 쌍으로부터 scene을 3D pointmap을 계산한다. 이 pointmap은 scene의 가하학 정보, 픽셀과 scene 간의 관계, 두 시점 간의 관계를 포함한 풍부한 정보를 가지고 있고, 계산된 pointmap을 이용하여 카메라 파라미터와 scene의 가하학 정보를 복원할 수 있다. 복원된 정보를 이용하여 다양한 3D vision task를 수행할 수 있고, 다양한 분야에서 SOTA의 성능을 보이고 있다.
지금까지 대부분의 3D vision 분야의 논문들이 실험을 위해 아직까지도 COLMAP을 사용하였는데, 이 방법론의 등장으로 새로운 패러다임이 제시되었다고 생각한다.

2. Method

- Pointmap

Pointmap X\bold{X}는 이미지 각 픽셀에 대응되는 3차원 좌표로, 해상도가 W×HW \times H인 이미지가 있다면, W×H×3W \times H \times 3 의 pointmap을 형성하게 된다. 본 논문은 카메라에서 scene을 향하는 ray가 하나의 3차원 점을 맞춘다고 가정한다.

- Cameras and scene

카메라의 내부 파라미터 KK와 외부 파라미터 [Rt][R|t], world 좌표계에서 정의된 3차원 좌표 X\bold{X}를 이용하여 이미지 좌표계에 대응하는 픽셀 좌표를 계산할 수 있다.

[ij1]=K[Rt]X\begin{bmatrix}i \\ j \\ 1\end{bmatrix} = K[R|t]\bold{X}

카메라의 내부 파라미터 KK가 주어져 있고, 실제 depth map DD가 있다면, pointmap X\bold{X}는 다음과 같이 계산할 수 있다 (pointmap은 카메라 좌표계에 정의되어있다 가정).

Xi,j=K1Di,j[ij1]\bold{X}_{i,j} = K^{-1}D_{i,j}\begin{bmatrix}i \\ j \\ 1\end{bmatrix}

nn 카메라와 mm 카메라가 있다면, mm 카메라 좌표계에서 정의된 nn 카메라에 대응되는 pointmap Xn,m\bold{X}^{n,m}nn 카메라의 외부파라미터 PnP_nmm 카메라의 외부파라미터 PmP_m 을 통해 다음과 같이 계산할 수 있다.

Xn,m=PmPn1h(Xn)\bold{X}^{n,m} = P_mP_n^{-1}h(\bold{X}^n)

여기서 hh는 homogeneous 좌표계를 뜻한다. Pm,PnP_m, P_n[Rt][R|t] 이다. 즉, Pn1h(Xn)P_n^{-1}h(\bold{X}^n)을 통해 pointmap을 world 좌표계에 정의하고, PmP_m과의 연산을 통해 mm 카메라 좌표계에 정의된 pointmap을 계산하게 되는 것이다.

2.1. Overview

네트워크 ff는 두 개의 이미지 I1,I2I^1, I^2를 입력으로 받아 각 이미지 픽셀에 대응하는 pointmap X1,1,X2,1W×H×3X^{1,1}, X^{2,1} \in \real^{W \times H \times 3}과 각 픽셀에 대응하는 pointmap의 확신 각 픽셀에 대응하는 pointmap의 신뢰도를 나타내는 confidence map C1,1,C2,1W×HC^{1,1}, C^{2,1} \in \real^{W \times H} 를 출력한다. 이렇게 나타낸 이유는 두 pointmap 모두 1번 카메라 좌표계에 대해 나타내므로 다음과 같이 표현한다.

네트워크 구조는 다음과 같다.

우선 기존의 ViT와 마찬가지로 이미지들을 패치로 나누어 flatten한 후 linear projection을 통해 일정한 크기의 latent vector로 나타낸 후 각각의 encoder에 입력하게 된다. 이 때 두 개의 encoder는 weight를 공유하여 동일한 feature 표현을 보장하여 비슷한 feature space에 임베딩하도록 한다.

F1=Encoder(I1)F2=Encoder(I2)F^1 = Encoder(I^1) \\ F^2 = Encoder(I^2)

Decoder는 일반적인 Transformer 구조를 이용하여 각 decoder block에서 self-attention과 cross-attention을 순차적으로 진행한다.

Gi1=DecoderBlock(Gi11,Gi12)Gi2=DecoderBlock(Gi12,Gi11)G_i^1 = DecoderBlock(G_{i-1}^1, G_{i-1}^2) \\ G_i^2 = DecoderBlock(G_{i-1}^2, G_{i-1}^1)

iiBB 개의 decoder block에 대해 1,,B1, \dots, B 번 수행하고, G01,G02G_0^1, G_0^2 는 encoder를 통해 나온 F1,F2F^1, F^2로 정의한다.

G01,G02=F1,F2G11,G12=DecoderBlock(G01,G02),DecoderBlock(G02,G01)GB1,GB2=DecoderBlock(GB11,GB12),DecoderBlock(GB12,GB11)G_0^1, G_0^2 = F^1, F^2 \\ G_1^1, G_1^2 = DecoderBlock(G_0^1, G_0^2), DecoderBlock(G_0^2, G_0^1) \\ \vdots \\ G_B^1, G_B^2 = DecoderBlock(G_{B-1}^1, G_{B-1}^2), DecoderBlock(G_{B-1}^2, G_{B-1}^1)

마지막으로, 각 branch에서의 head가 decoder의 token들을 받아서 pointmap과 confidence map을 출력하게 된다.

X1,1,C1,1=Head1(G01,,GB1)X2,1,C2,1=Head2(G02,,GB2)X^{1,1}, C^{1,1} = Head^1(G_0^1, \dots, G_B^1) \\ X^{2,1}, C^{2,1} = Head^2(G_0^2, \dots, G_B^2)

2.2 Training Objective

학습을 위한 loss function으로는 3D Regression loss와 Confidence-aware loss를 사용한다.

2.2.1. 3D Regression loss

실제 pointmap을 Xˉ1,1,Xˉ2,1\bold{\bar{X}}^{1,1}, \bold{\bar{X}}^{2,1}이라 하자. 실제 pointmap은 이전에 이야기했듯, 카메라의 내부 파라미터와 실제 depth를 알고 있다면 쉽게 구할 수 있다. 네트워크는 실제 pointmap에 대응하는 depth map D1,D2D^1, D^2에서 유요한 픽셀 iDv(v{1,2}i \in D^v \enspace ( v \in \{1,2\})에 대해 실제 pointmap과 예측된 pointmap 간의 Euclidian distance를 최소화하는 방향으로 학습한다.

Lregr(v,i)=1zXv,11zˉXˉv,1z=1D1+D2v{1,2}iDvXiv\mathcal{L}_{regr}(v,i) = \bigg| \bigg|\frac{1}{z}\bold{X}^{v,1} - \frac{1}{\bar{z}}\bold{\bar{X}}^{v,1}\bigg| \bigg| \\ z = \frac{1}{|D^1|+|D^2|}\sum_{v \in \{1,2\}}\sum_{i \in D^v}||\bold{X}_i^v||

여기서 z는 예측된 pointmap과 실제 pointmap간의 scale을 normalize하기 위해 사용된다.

2.2.2. Confidence-aware looss

하늘처럼 무한한 곳이거나, 투명한 물체와 같은 부분에 대해서는 잘못 계산된 3차원 좌표들이 있을 수 있다. 따라서 이 부분에 해당하는 픽셀에 대해 얼마나 확신하는지를 나타내는 점수를 함께 학습한다. 최종 학습의 목적 함수는, 모든 유효한 픽셀에 대해 regression loss에 confidence를 곱한 것이다.

Lconf=v{1,2}iDvCiv,1Lregr(v,i)αlogCiv,1\mathcal{L}_{conf} = \sum_{v \in \{1,2\}} \sum_{i \in D^v} C_i^{v,1}\mathcal{L}_{regr}(v,i) - \alpha \log{C_i^{v,1}}

2.3. Downstream Applications

2.3.1. Point matching

2차원 이미지에서는 SIFT와 같은 feature를 얻는 기법을 이용하여 keypoint를 찾았다. 본 논문은 두 카메라에 대해 얻은 pointmap을 이용하여, pointmap간의 가장 가까운 점들을 찾는 Nearest Neighbor 기법을 이용하여 두 카메라 모두 대응하는 3차원 좌표를 계산한다.

2.3.2. Recovering intrinsics

카메라의 내부 파라미터는 다음과 같이 정의된다.

K=[fx0Cx0fyCy001]K = \begin{bmatrix}f_x & 0 & C_x \\ 0 & f_y & C_y \\ 0 & 0 & 1\end{bmatrix}

우선 이미지의 높이와 너비를 알고 있고, 높이와 너비가 같으므로 주점인 Cx,CyC_x, C_y는 쉽게 구할 수 있다.

Cx=Cy=H2C_x = C_y = \frac{H}{2}

내부 파라미터를 구하기 위해서는 카메라의 focal length만 계산하면 된다.
이미지 평면의 좌표는 카메라 좌표계에서 정의된 pointmap과 카메라의 내부 파라미터 간의 내적을 통해 계산된다. (1번 카메라에 대한 수식)

[ij1]=[f0C0fC001][Xi,j,01,1Xi,j,11,1Xi,j,21,1]\begin{bmatrix}i \\ j \\ 1 \end{bmatrix} = \begin{bmatrix}f & 0 & C \\ 0 & f & C \\ 0 & 0 & 1 \end{bmatrix}\begin{bmatrix}X^{1,1}_{i,j,0} \\ X^{1,1}_{i,j,1} \\ X^{1,1}_{i,j,2}\end{bmatrix}

Focal length인 ff는 다음과 같은 수식을 최소화하는 ff를 구하여 카메라의 focal length를 계산할 수 있다.

f1=arg minf1i=0Wj=0HCi,j1,1(i,j)f(Xi,j,01,1,Xi,j,11,1)Xi,j,21,1f_1^* = \argmin_{f_1}{\sum_{i=0}^{W} \sum_{j=0}^{H} C_{i,j}^{1,1}\bigg|\bigg| (i,j)-f\frac{(X_{i,j,0}^{1,1}, X_{i,j,1}^{1,1})}{X_{i,j,2}^{1,1}} \bigg|\bigg|}

여기서 Ci,j1,1C_{i,j}^{1,1}은 주점이 아닌 1번 카메라 pointmap의 각 픽셀에 대응하는 신뢰도를 계산한 confidence map이다.

2.3.3. Relative pose estimation

두 카메라 간의 상대적인 위치를 추정하는 방법은 세 가지가 있다.

  1. 두 이미지 간의 2D matching을 진행하고, 위의 방법을 통해 두 카메라의 내부 파라미터를 계산한다면, epipolar geometry를 통해 두 카메라 간의 변환관계를 설명하는 R,tR, \bold{t}를 계산할 수 있다.
  2. Procrustes alignment를 이용해서 두 pointmap을 비교할 수 있다.
    P=arg minσ,R,tiCi1,1Ci1,2σ(RXi1,1+t)Xi1,22P^* = \argmin_{\sigma,R,\bold{t}}{\sum_{i}{C_i^{1,1}C_i^{1,2}||\sigma(RX_i^{1,1}+\bold{t})-X_i^{1,2}||^2}}
  3. 더 robust한 솔루션은 RANSAC과 PnP (Perspective n point) 알고리즘을 사용하는 것이다.

2.4. Global Alignment

profile
AMC AI research engineer

1개의 댓글

comment-user-thumbnail
2025년 4월 8일

아주 흥미로운 글입니다!

답글 달기