본문 바로가기
Camera Model

[논문 리뷰] DUSt3R (arXiv 2023) : Pose-free 3D Reconstruction

by xoft 2024. 4. 22.

DUSt3R: Geometric 3D Vision Made Easy, Shuzhe Wang (arXiv 2023)

 

여러장의 이미지들을 3D로 만들기 위해선, 일반적으로 카메라 포즈를 알고 있어야 합니다. 특히 MVS(Multi View Stereo)분야에선 카메라 패러미터(intrinsic/extrinsic)가 필수적입니다. 일반적으로 SfM(Structure from Motion)을 사용해서 카메라 추정을 하게 되지만 많은 연산(수분이상)이 필요로 합니다.

본 논문 DUSt3R에서는 이 과정을 생략하고 2D-3D Mapping Network를 사용해서 3D Reconstruction을 할 수 있게 합니다. 이와 동시에 Stereo Pixel Matching, Camera Calibration(=camera intrinsic 추정), Camera Pose estimation(=camera extrinsic 추정), Depth Esitimation 을 하는 새로운 방법에 대해 제안하고 있습니다.

 

참고로 제가 보고 있는 3D-GS(3D Gaussian Splatting)분야서는 MVS에 비해 상대적으로 낮은 퀄리티와 빠른 속도로 3D reconstruction하게 됩니다. 대부분 3D-GS연구에선 카메라 패러미터가 필요로하며, 일부 연구의 경우 카메라 패러미터를 필요로 하지 않습니다.

 

 

 

DUSt3R 알고리즘

이미지 2장을 넣으면, 각 pixel의 3D Pointmap(=3D 좌표)과 Confidence(=신뢰도)값을 출력주는 네트워크입니다. 다양한 type의 indoor, outdoor, synthetic, real-world, object-centric이 포함된 8개 데이터셋(Habitat, MegaDepth, ARKitScenes, MegaDepth, Static Scenes 3D, Blended MVS, ScanNet++ , CO3D-v2, Waymo)에서 이미지 pair와 3D point 정답값 8.5M개를 학습 데이터셋으로 사용하여, 해당 네트워크를 학습시킵니다.

 

ViT와 Transformer decoder부분은 대량의 데이터가 학습 될 수 있도록 설계된 것으로 보이고, 동일한 네트워크가 서로 공유되는 샴(siamese)방법으로 encoder를 설계하면서 두 이미지에 대한 feature를 비교 할 수 있게 한 것으로 보입니다.

Transformer Decoder에선 2개의 featrue가 관계성을 학습 할 수 있도록 해줍니다. 구체적으로는 기준 view에서 나온 feature(=token)은 self-attention을 하고, 참조 view에서 나온 feature는 cross-attention을 하여, algined된 pointmap을 만들게 해줍니다. 아래는 Transformer Decoder를 DecoderBlock이라고 네이밍한 수식입니다.

1은 기준 view, 2는 참조 view를 의미하고, i는 stack되는 network block 인덱스이며, $G_0$는 encoder의 출력 feature에 해당합니다. 모든 block은 두 이미지에 대한 feature를 같이 쓰는 것을 볼 수 있습니다.

이후 Head에선 decoder featrue(=token)는 서로 다른 head network를 통해, 각 pixel마다 pointmap(=3d좌표)와 confidence값을 출력하게 됩니다.

결과값에 대한 표기법을 설명하자면, $\mathbf{X}^2,1$ 의미는 1번 view 카메라 시점을 기준으로 2번 view에서 보이는 3d point의 좌표를 의미합니다. 이렇게 설계함으로써 3D point의 절대적인 위치 추정없이 상대적인 위치를 추정하게 하여 카메라 패러미터 없이 3D를 reconstruction을 할 수 있게 합니다.

다음으로 학습 할 때 Loss에 대해 다루겠습니다.

 

 

 

Loss

Loss는 기본적으로 3D point와의 Euclidean Distance로 만들어집니다.

z는 정답과 예측값의 scale을 위한 factor이며, 각 view에대한 depth값으로 계산됩니다. prediction값과 GT간의 scale ambiguity를 없애기 위해 normalization을 수행합니다. z는 prediction된 point로 normalization한 값이며, $ z = \text{norm}(X^{1,1}, X^{2,1})$로 정의되고, $\bar{z}$는 GT point를 normalization한 값이며, $ \bar{z} = \text{norm}(\bar{X}^{1,1}, \bar{X}^{2,1})$에 해당합니다. norm함수는 아래와 같이 정의됩니다.

각 view point를 기준으로 모든 depth값에 대한 평균을 계산하다고 볼 수 있습니다.

추가적으로 Confidence Score가 고려되면 아래 수식이 됩니다.

하늘 또는 반투명 영역에서 3D point를 정확하게 예측 할 수 없기 때문에, 이를 구분하기 위해서 Confidence(=C)값을 사용합니다. 위 수식을 통해 확실한 물체의 point에 대해서는 C가 높게 나오고, 하늘과 같은 불확실한 물체에 해당하는 point에 대해서는 C가 낮게 나올 수 있게합니다.

$ - \alpha \log C_i^{v,1} $ 는 regularization term으로 C값이 너무 작아지지 않도록 만들어주며, C의 최소값이 1보다 크도록, $C_i^{v,1} = 1 + \exp\left(\tilde{C}_i^{v,1}\right) > 1$ 설계하여, 하나의 view에서만 나타나서 추정하기 어려운 3D point에 대해서는 extrapolate 할 수 있도록 만듭니다.

 

 

 

Training Detail

224x224로 학습하고 가장 긴 축이 512pixel이 되도록 학습합니다. encoder는 Vit-Large로 사용하고, decoder는 ViT-Base로 사용하고, head는 DPT(=ViT를 Depth Estimation에 적용하는 연구)를 사용했습니다. CroCo pretrained model을 사용해서 weight를 초기화 했습니다.

 

 

 

3D Reconstruction Experiments

해당 DUSt3R 기본 모델로 만들 수 있는 실험 결과입니다.

가장 왼쪽의 RGB 이미지 입력으로 DUSt3R를 수행하면 pointmap과 confidence map을 획득 할 수 있고, 2번째 열과 같이 depth map, 3번째 열과 같이 confidence map, 아래 행과 같이 point cloud를 그릴 수 있습니다.

 

여기까지가 DUSt3R 기본 모델에 대한 내용입니다. 이제 이 기본 모델을 응용한 Downstream Application 4가지 Stereo Pixel Matching, Camera Calibration(=camera intrinsic 추정), Camera Pose estimation(=camera extrinsic 추정), Depth Esitimation를 살펴보겠습니다.

 

 

 

 

Point Matching

마지막 그림을보면, 2개 이미지에 대한 pointmap을 겹쳐두었을 때, 정확히 align이 되지 않습니다. Nearest Neighor(NN) Search 알고리즘을 통해 2개 이미지내 pixel간의 correspondence(=관계성)를 만들 수 있습니다. 

view1의 i번째 pixel와 correspondence를 갖는 view2의 j번째 pixel을 찾는 것을 목표로합니다. NN수식을 보면, 1(=k)번째 view시점에서 바라본 1(=n)번째 view에서 나타난 point i와 가장 가까운 2(=m)번째 view에서 나타는 point를 j로 찾고 있습니다. M에 대한 수식을 보면, 양쪽 view에서 모두 성립할 경우에 2개의 pixel이 correspondce가 있다고 간주하게됩니다. 결과적으로 world좌표계에서 3D space에 배치된 point가 가까운 것끼리 correspondence를 갖게 됩니다. 때문에 모든 pixel에 대해 correspondence가 만들어지는 것으로는 안보이고, correspondence가 없는 pixel들도 많이 발생 할 것으로 보입니다.

 

 

 

 

Recovering Intrinsics

카메라 intrinsic parameter(이전글) 는 2D Translation Matrix, 2D Scaling Matrix, 2D Shear Matrix로 구성되어 있습니다.

2D Translation Matrix는 principal point(=주점)의 위치이며, 일반적으로 이미지의 정가운데로 설정합니다. 2D Shear는 얼마나 기울어 졌는지를 나타냅니다. 일반적으로 카메라가 기울어져있지 않기에 Shear Matrix는 고려하지 않습니다. 일반적으로 intrinsic paramter를 추정할 때, focal length(초점거리=이미지 센서와 image plane 사이 거리)로 구성되어 있는 Scaling Matrix만을 추정하며, 본 논문에서도 focal length만 추정하고 있습니다.

 

DUSt3R 기본 모델로 pixel별 3D point를 예측했었습니다. 이 관계를 기반으로 아래 수식으로 focal length를 예측 할 수 있습니다.

$ i' , j' $ 부분은 좌상단이 원점인 pixel 좌표계에서 이미지 중앙이 원점인 camera좌표계로 바꿔서 계산하기 위해, $ i' = i - \frac{W}{2} \quad \text{and} \quad j' = j - \frac{H}{2} $를 해주게됩니다. 그리고 가장 오른쪽 식은 해당 pixel에 해당하는 3D point의 x,y 좌표를 z값으로 나누어, 2D Image plane으로 projection되는 수식이 됩니다. 해당 수식이 최소값을 갖도록 만드는 focal length를 찾아주면, 2D 이미지와 3D point가 align 되게 됩니다. 이는 반복 최적화 문제로 풀게 되는데, 거리에 반비례하는 가중치로 추정값(=f)을 업데이트하는 Weiszfeld algorithm을 사용해서 해를 찾습니다.

 

 

 

 

Relative Pose Estimation

논문에서는 두가지 방식을 소개하고 있습니다. 첫번째 방식은 위에서 언급한 2D Point Matching과 Recovering Intrinsic을 수행한 후에, epipolar matrix와 relative pose를 추정하는 방법입니다. Epipolar Geometry이전글 에 언급된 Essential Matrix를 찾는 과정으로 볼 수 있으며, 이는 해당글에 언급된 Eight-Point 알고리즘으로 계산 될 수 있어보입니다.

 

두번째 방식은 서로 다른 view시점에서 보여지는 3D pointmap이 동일해지도록 최적화 문제를 푸는 방법입니다.

위 수식을 바탕으로 최적의 rotation matrix R와 translation matrix t 그리고 scale인자 σ를 찾습니다. 최적화문제는 SVD(= Singular Value Decomposition =특이값분해)기반의 procrustes alignment알고리즘을 통해 계산하고 있습니다. procrustes alignment알고리즘은 noise와 outlier에 민감하기 때문에, 주어진 3차원 포인트와 그에 상응하는 2차원 이미지 포인트를 바탕으로 카메라의 포즈(위치와 방향)를 추정하는 PnP알고리즘과 랜덤 샘플링 방식의  RANSAC(Random Sample Consensus)알고리즘을 사용하여 위 수식의 해를 찾고 있습니다.

 

 

 

 

Absolute Pose Estimation

논문에선 visual localization이라고도 합니다. 이것도 두가지 방법이 있습니다.

첫번째 방법은 위에서 언급된 1) intrinsic을 추정하고, 2) 2D point matching을 추정하고, 3) PnP RANSAC으로 최적의 rotation, translation matrix를 찾습니다. 개인적인 생각으론 relative pose estimation의 첫번째 방법으로 argmin 방정식을 정의한 후에, 2번째 방법의 RANSAC PnP 최적화 알고리즘으로 문제를 푸는 것처럼 보여집니다.

두번째 방법은 GT pointmap을 이미지를 제공하여, 위에서 언급한 relative pose estimation을 수행시에 해당 GT로 scale을 맞추는 방법입니다.

 

 

 

 

Visual Localization Experiments

 

학습데이터에 사용되지 않은 7Scenes와 Cambridge Landmark 데이터셋으로 테스트하였고, Absolute Pose Estimation한 결과를 비교했습니다. /앞쪽부분은 median translation error (cm)이고 /뒤쪽부분은 rotation error (degree)입니다. NoCroCo는 CroCo로 initial weight를 초기화하지 않는 경우이고, 224,512는 입력 이미지 해상도 입니다.

 

Query 이미지가 주어지면 가장 관련된 이미지들을 Test 데이터셋에서 찾아 2개 이미지간의 pixel을 matching하는 방법을 사용해서 camera pose를 계산했다고 합니다. 부가적인 설명이 없어서 정확한 의미가 와닿지 않는데, 'Query 이미지'와 '관련성이 높은 Test 데이터셋 이미지들'을 DUSt3R모델로 상대  Pose를 계산하고, 이 값과 PnP알고리즘으로 계산한 상대 Pose값의 차이로 오차를 계산하는게 아닐까 합니다. (알고 계신분 있으시면 댓글 부탁드립니다.)

7Scene데이터셋에서 관련성이 높은 이미지 1개를 썼다고 되어 있고, Cambridge데이터셋에선 관련성이 높은 이미지 20개를 썼다고 되어 있습니다.

 

FE(feature matching기법), E2E(end-to-end learning기법) 연구들과 비교하였으며, SOTA성능은 아니지만, 제시된 방법이 visual localisation를 목적으로 학습 하지 않았음에도 적은 오차를 가진 Absolute Pose Estimation 결과를 보이고 있습니다.

 

 

 

 

Global Alignment

이전까지는 2장의 입력에 대해서만 언급하고 있습니다. 여기서부터는 3장 이상의 image들로부터 예측한 pointmap을 3D space에서 alignment하는 방법에 대해 다룹니다.

 

여러장의 이미지를 다루기 위해 Graph형태의 자료형을 우선 만듭니다. 각 이미지는 Vertex이고 두개의 이미지가 같은 visual contents를 공유하고 있으면 Edge로 정의합니다. 이 그래프를 만들 때, 널리 공개된 이미지 탐색 알고리즘을 쓰거나 모든 pair에 대해 DUSt3R알고리즘을 사용해서 overlap된 영역을 기반으로 edge관계를 정의 했다고 합니다.

 

앞서 2장의 이미지로 학습된 DUSt3R모델로 모든 edge pair에 대한 pointmap과 confidence score를 계산합니다(관련 코드1, 관련 코드2). 그리고 여러장의 이미지들로 Global Optimization은 아래 수식을 계산하는 것을 목표로 합니다.

$ C_i^{v,e} $ : 이미지e 카메라 시점에서, 이미지 v에 나타난 i번째 pixel에 대한 confidence 값 (=DUSt3R모델 결과값)

$ X_i^{v,e} $ : 이미지e 카메라 시점에서, 이미지 v에 나타난 i번째 pixel에 대한 3D point 좌표값 (=DUSt3R모델 결과값)
$ x_i^{v} $ : world좌표계에서, 이미지 v 에 나타난 pxiel i에 대한 3d point 좌표값 (=찾고자 하는 값)
$ \sigma_e $ : edge관계에 있는 2개 이미지간의 scale factor. (=찾고자 하는 값) (0이 되는 것을 방지하기 위해, 모든 edge에 대해 $ \prod_{e} \sigma_e = 1 $ 이 되도록 설계되었습니다.)
$ P_e $ : 2개 이미지간의 relative pose (=찾고자 하는 값)

 

논문에 나와 있는 내용만으로는 N개의 카메라에 대한 3개의 parameter가 어떻게 최적화되는지는 모르겠습니다.

해당 코드 를 분석하면 정확한 의미를 파악 할 수 있겠는데, 이 글에선 코드분석에 대해 다루지 않겠습니다. 학습 loop 코드를 보면 300번의 iteration으로 학습이 됩니다.

추측컨데, 앞서 언급한 이미지가 2장에 대한 intrinsic추정, relative/abosolute pose추정기법으로 획득한 정보를 바탕으로, 어느 정도 해에 가까워 상태에서 최적화 문제를 푸는것이 아닐까합니다.

 

위 수식을 optimization해서 $x$, $P$, $σ$를 모두 찾는 된다면, pinhole 카메라 모델을 사용해서, 카메라 Pose값과 intrinsic값 depth값을 추정 가능합니다.

이 방법은 전통적인 bundle adjustment방법과 다르게 global optimization을 빠르고 단순하게 해결 하고 있습니다. bundle adjustment에서는 2D reprojection error를 최소화 하지만, 여기서는 3D projection error를 같이 최소화합니다. gradient descent방법론을 사용해서 수백 step안에 빠르게 optimization이 가능하다고 합니다.

 

 

 

 

Global Alignment Experiments

 

 

 

 

Monocular Depth Estimation Experiments

 

 

 

 

Multi-view Depth Estimation Experiments

 

 

 

 

3D Reconstruction Experiments

 

댓글