상세 컨텐츠

본문 제목

[Paper review] Depth Estimation 설명 + Digging Into Self-Supervised Monocular Depth Estimation 리뷰

Paper review

by 최끝장1234 2022. 2. 15. 22:01

본문

오늘 리뷰할 논문은 Depth Estimation에 관한 논문이다. Depth Estimation은 이미지의 'Depth'를 측정하는 것으로, 쉽게 이해하면 깊이감, 원근감을 찾는다고 생각하면된다. 이러한 Depth Estimation은 자율 주행 자동차의 핵심적인 기술로 활용된다. (운전자 입장에서 어떤 Object가 가까이 아는 것은 상식적으로도 중요하다)

 

먼저 본격적으로 논문을 리뷰하기 전에 Depth Estimation에 대한 기본적인 Background 지식에 대해서 설명을 해보겠다.

Depth Estimation을 위해서는 보통 다른 시선에서 본 두 장의 이미지가 필요하다. 이 두 장의 이미지를 가지고 있으면, 각 두 이미지 사이에는 일종의 matching이 되는 픽셀들이 존재할 것이다. 

블로그 참조 https://skk095.tistory.com/4

위 사진을 예로 들면, 두 쌍의 사진이 있으면, matching을 통해 두 쌍의 픽셀을 찾을 수 있는 것을 확인할 수 있다. 여기서 흥미로운 점은 이 두쌍의 픽셀을 이용하면, 나아가 위 사진 처럼 disparity(시차)라는 것을 계산할 수 있다는 점인데, 이 disparity는 depth에 반비례하는 값으로, 멀리 있는 것(depth가 큰 값을 가짐)은 작고, 비교적 가까이 있는 것(depth가 작은 값을 가짐)은 큰 값을 가진다. 실제로 depth는 이러한 disparity을 통해 구할 수 있는 값으로, 모델에서 최종적으로 disparity 값을 정확하게 구한다면, depth값도 정확하게 구할 수 있다. (물론, 곧바로 depth를 추론하는 모델들 역시 존재한다. 핵심은 여러 view에서 찍은 이미지 사이의 관계를 통해 depth를 계산한다는 점이다.)

 

이제 본론으로 돌아와서 우리는 어떤 식으로 Depth를 딥러닝 모델을 통해 구할 수 있을까? 방법은 크게 두가지로, Supervised LearningSelf-Supervised Learning이다.  Supervised Learning은 말 그대로, 정답 레이블 즉 depth의 Ground Truth값이 존재하는 경우 사용하는 방법이다. 데이터만 존재한다면 이 방법을 활용하는 것이 효과적일 수 있다. 하지만, 다양한 이미지에 대한 depth값을 일일히 구하는 과정도 마냥 쉬운 일이 아니다. 

다음 방법은 Self-Supervised Learning으로 이 방법을 활용하면 depth의 정답 값이 필요없다. 이 말은 들으면 그럼 어떻게? 라는 생각이 들 것 같다. 직접 그린 도식도를 통해 원리에 대해 설명해 보겠다.

Self-Supervised Learning 도식도

먼저 초반에 말했듯이 depth를 추정하기 위해서는 한장의 사진이 아닌 서로 다른 view에서 찍은 사진이 필요하다. 가령 두장의 사진이 있다고 하면 하나가 input 이미지(Target 이미지라고도 한다)로 사용되고, 나머지 하나가 source 이미지로 사용된다. Self-Supervised Learning에서의 모델은 input image가 들어오면 Depth map을 뱉어 내도록 한다. 그리고 핵심적인 process은 위 도식도에서 알 수 있듯이 loss를 계산하는 과정이다. 모델이 뱉어 낸 Depth map과 Source 이미지를 조합하면, input 이미지를 reprojection할 수 있다. 그리고 우리가 가지고 있는 실제 input(=Target) 이미지와 비교함으로써 loss를 계산하는 것이다. 만약 input 이미지에 대해 올바른 depth 값을 모델이 추론했다면, reprojection을 통해 계산한 이미지와 실제 input 이미지는 큰 차이를 보이지 않을 것이다. (loss가 작을 것이다.)

 

Self-Supervied Learning은 또 활용하는 데이터에 따라 Stero Pair 이미지(Left-Right)를 활용하는 Stereo Training 기반 Learning, Monocular Video(frames)를 활용하는 Monocular Training 기반 Learning으로 또 나누어 진다. 자세한 방법은 여기서 설명하지 않겠다. 하나 알아두면 좋은 점은 Monocular Training 기반 Learning은 Depth를 예측하는 Depth Network와 더불어 Video 프레임들 사이의 Camera pose를 추정하는 Pose Network 역시 필요하다. 

 

지금까지 Depth Estimation을 이해하기 위한 배경지식들을 설명해보았다. 이 배경지식들이 없다면 논문을 이해하기가 쉽지 않기 때문에 잘 이해하고 따라오길 바란다.

 

이제 본격적으로 논문을 리뷰하고자 한다. 이 논문은 Self-Supervised Monocular Depth Estimation을 다루는 논문으로, 여기서 Monocular는 Single Source Image, input으로 한 장의 이미지를 활용한다고 이해하면 된다. 논문에서 보다 효과적인 Self-Supervised Depth Estimation을 위해 새로운 Model Architecture를 제안하는 대신 3가지의 유용한 method를 소개한다. 이제 하나씩 알아보자. (참고로 Monocular Training을 기반으로 논문도 아이디어를 전개했기 때문에, 나도 이를 기준으로 설명하고자 한다.)

 

논문 그림 참조

위 그림에서 확인할 수 있듯이 (a)는 Depth network이고 (b)는 Pose network는 앞서 언급했듯이 Depth를 예측하는 network와 별개로, Camera Pose를 예측하기 위한 network가 Monocular Training 기반 Learning에서는 필요하다. 

 

논문에서 제시하는 첫번째 method는 Per-Pixel Minimum Reprojection Loss이다.  

 

위 그림에서 (c)에서 설명하는 method이다. (c)에서 중간 이미지가 depth를 예측하기 위한 모델에 들어가는 input이고 양쪽 이미지가 loss를 계산하기 위한 source 이미지들 이라고 생각하면 된다. 먼저 Depth network에서 중간 이미지의 Depth map을 추정하면, 이 map과 pose network에서 구한 Camera Pose, source 이미지을 조합하여, input image를 Reprojection 할 수 있다. source 이미지가 2장이면 2개의 Reprojection loss가 나오게 된다. 기존의 방식(위 그림에서 Baseline)은 이 2개의 loss를 평균한 값을 최종 Reprojection loss로 활용했다. 하지만 논문에서는 두개의 loss 값 중 작은 값을 loss로 사용한다. 왜 그럴까? 이유를 한마디로 말하자면 'matching 되지 않는 픽셀들이 존재할 수도 있기 때문'이다. 가령 (c) 에서 문의 왼쪽 모서리에 matching되는 픽셀이 source 이미지에 존재하지 않는 것을 확인할 수 있다. 만약 기존의 평균을 활용하면 이렇게 무시를 해도 되는 부분들까지 loss에 포함된다. 하지만 loss 값 중 작은 값을 사용하면 상대적으로 이러한 불가피한 오차를 줄일 수 있다.

 

논문에서 제시하는 두번째 method는 Auto-Masking Stationary Pixels이다.

이 method를 이해하기 전 Monocular Training 기반 Self-Supervised Learning에서 가정하는 명제에 대해서 알아야 한다. 이 명제는 '카메라는 움직이되, scene은 정지해있다' 라는 것이다. 만약 모델을 훈련을 할때, scene 안에 object가 움직이면 test time 때, depth가 정확하게 측정되지 않는다고 한다. (hole 현상) 논문에서는 이러한 현상을 미연에 방지하기 위해 앞서 설명한 명제에 위배되는 픽셀들을 무시하는 binary mask를 사용하는 것을 제안한다. (구체적인 식은 논문바람.)

 

논문에서 제시하는 세번째 method는 Multi-scale Estimation이다.

 

위 그림에서 (d)에 해당하는 method이다. 이 method의 목적은 Depth network가 좀 더 정확한 Depth map을 뽑아낼 수 있도록 유도하는 것이다. 구체적인 방법을 설명하면, Depth network의 Decoder 부분에서 low resolution depth map을 뽑아내는 부분에서도 upsample을 통해 Reprojection loss를 계산하도록 하는 것이다. 이러한 method는 최종적으로 Depth network의 Decoder의 초기 layer 부터 최종 layer에 이르기까지 모든 layer가 올바르고, 정확한 depth를 추론할 수 있도록 한다.

 

지금까지 논문에서 제시하는 3가지 method에 대해서 알아보았다. 

논문 사진 참조

논문에서는 위 결과를 보면 알 수 있듯이, 세가지 방법을 모두 사용할때, 좋은 성능을 띈다는 것을 확인했다. Monodepth2(full)이 논문에서 제시하는 모든 방법을 쓴 모델이다.

 

이번 포스팅에서는 Depth Estimation의 기본적인 지식들과 더불어, 이를 위해 유용한 method를 소개하는 논문까지도 살펴보았다. 보통 논문이라 하면, 새로운 모델 architecture을 제시하는 경우가 많은데 이번 논문은 방법론적인 측면에서 Depth Estimation에 유용한 method들을 소개하는 논문인 것 같아서 신선했다. 만약 Depth Estimation에 대한 연구를 진행하고 있다면 논문에서 제시하는 방법들을 사용하는 것도 좋은 선택인 것 같다. 

 

아래는 오늘 리뷰한 논문의 주소이다. 더 자세히 알고 싶은 사람은 한번 읽어보길 바란다.

https://arxiv.org/abs/1806.01260

 

Digging Into Self-Supervised Monocular Depth Estimation

Per-pixel ground-truth depth data is challenging to acquire at scale. To overcome this limitation, self-supervised learning has emerged as a promising alternative for training models to perform monocular depth estimation. In this paper, we propose a set of

arxiv.org

 

관련글 더보기

댓글 영역