Paper/3D vision

DUSt3R: Geometric 3D Vision Made Easy

침닦는수건 2024. 3. 12. 20:00
반응형

내 맘대로 Introduction

 

새로운 컨셉의 3D recon. 논문이다. intrinsic을 모를 때도 사용이 가능한 image to 3D point 형태의 모델인데 Croco 와 같이 binocular image로 학습된 backbone을 사용해서 네트워크가 geometry를 알아서 배워서 바로 lifting할 수 있도록 했다. 

 

이게 되냐? 싶지만 데이터를 850만 장이나 사용해서 커버했다. 아이디어는 scene coordinate라는 형태로 이미 연구가 되었던 분야이므로 새롭진 않으나 엄청나게 데이터를 많이 먹이면 가능하다는 것을 보여준 것이 의미가 있다. 또, 가능하다는 것이 입증되었으니 기존 SfM, MVS와 같이 카메라 파라미터에 엄청 의존하는 방식에서 벗어나서 데이터 빨로 recon.할 수 있는 시대가 왔다고 보인 셈이다. 

 

전체 구조는 Croco와 사실 같다. Croco의 하나의 downstream task 인 모양이다. 

 

메모

목적 자체가 카메라 파라미터 전혀 없이 이미지만 갖고 3D recons하는 것이다. 

recons이 된 이후에는 결과를 활용해 역으로 카메라 파라미터를 찾아낼 수 있으므로 역과정까지 contribution으로 주장한다.

image to 3d point에서 3d point가 진짜 camera coordinate의 xyz를 갖는 point다.

scale ambiguity 문제가 있음에도 그냥 직접 예측하도록 무식하게 한다. (데이터로 극복한다)
shared encoder + 이미지 별 decoder 형태로 주어진 2개의 이미지를 각각 3d point로 올리는 구조다.

이 때 두 개의 decoder가 cross attention하게 되어있음. 1번 recon하는데 2번이 도움주고, 2번 recon하는데 1번이 도움주는 구조.

특이점은

1번 이미지건 2번 이미지건 3d point의 좌표계는 1번 이미지 좌표계를 쓴다는 점이다. 

네트워크는 Croco랑 완전 똑같음. 

마지막에 head까지 따로 뒀다는 점만 다름.

one encoder

two decoder

two head
scale ambiguity 있는 것 안다. 하지만 안 건든다. 데이터로 극복할 거니까. 

핵심 loss는 역시나 3d point를 직접 GT랑 비교하는 것이다.

하지만 scale ambiguity를 loss 단에서 신경을 쓰긴 했다. 각 point를 거리로 normalize해서 unit ray로 만들고 loss를 매겼다.

normalize과정에서 수식(3)과 같이 D1, D2 평균을 취하는 이유는 앞서 decoder1, decoder2 둘 다 image 1 coordinate의 output를 내기 때문이다. 

같은 좌표계에서 2개의 예측값이 있으니 평균내서 쓴 것.
pixel 별 3d point + confidence도 나옴. 이는 안보이는 point, invalid point를 커버하기 위함임

최종 loss에서 confidence로 앞선 regression loss를 masking해서 사용함.

이미지와 3d point 를 알고 있으니 사실 이 중간 부산물들을 역계산할 수 있는 건 당연한 일이다. 

2D correspondence 역 추정하기

intrinsic 역추정하기

two image relative pose 역추정하기 (좌표계를 image 1 좌표계만 쓰므로 1번 inference해서는 못구함. 1-2 순서로 한 번 돌리고, 2-1 순서로 뒤집어서 한 번 돌린 뒤 비교해야 함. 즉 inference 2번 돌아야 함.)

two image absolute pose 역 추정하기( intrinsic, rel.pose 아니까 풀 수 있음. 당연히)

만약 sequence 데이터에 적용하고 싶으면 어떻게 하느냐.

1) image retrieval 이용해서 이미지 pair를 잔뜩 생성한 다음 결과를 다 뽑는다.

2) 전체 결과를 1개 좌표계에 맞아떨어지도록 전체 최적화

이게 기존 BA보다 빠른 이유는 BA는 2d reprojection error라서 intrinsic 정확도가 중요함. SfM처럼 intrinsic 도 같이 최적화할 경우에는 자유도가 너무 높아서 느리고 구림.

근데 이건 3d point가 이미 있어버리니까 3d point만 맞추면 되는 3d reproejction error라서 빠르고 정확함.

데이터는 사실 쓸 수 있는거 다 썼고
pretrained Croco 사용했음.

 

반응형