[ICCV2019] Visualization of Convolutional Neural Networks for Monocular Depth Estimation.

이번 리뷰는 컨셉은 매우 간단하면서도 흥미로운 논문으로 가져왔습니다. 바로 Monocular Depth Estimation을 수행하는데 있어 CNN 네트워크는 입력 영상의 어디를 볼까? 를 분석한 논문입니다. 이를 수행하는 컨셉이 정말 간단해서 처음에 당황스러워했지만, 결과도 흥미롭고 다른 모델에 적용해보기도 쉬우며, ICCV에 accept이 된 것을 보아 상당히 저력?이 있는 논문이라고 생각합니다.

Introduction

일단 위에서 말씀드린대로, 해당 논문의 저자는 Monocular Depth Estimation Network가 입력 영상에 어디를 보고 깊이를 추정할까? 라는 궁금증으로 가진 채 이 논문을 시작합니다.

사람의 시각 물리학 분야에서는 오랜 기간 동안 사람이 단일 영상을 보고 거리를 짐작하는 방식에 관하여 빛, 그림자, 물체들의 상대적 크기, 선형적인 투영 등 다양한 요소들을 통해서 추론한다는 것을 보였습니다. 그렇다면 CNN은 과연 사람처럼 행동할까요? 아니면 그들만의 새로운 방식을 가진 채 추론할까요?

사실 인간의 시각 시스템마저도 현재 완전히 분석하고 이해하는데는 어려움이 있는 만큼, CNN이 무엇을 보고 깊이를 추론하는지에 대하여 위의 물음을 정확히 답변하기는 어렵습니다. 그래서 저자는 간접적인 방식으로, 깊이 추정 모델을 시각화하고자 하였습니다.

그렇다면 어떤 방식으로 시각화를 하면 좋을까요? 저자는 우리 인간이 영상 한장으로 깊이를 추정할 때 모든 픽셀들을 하나하나 살피면서 추정하는 것이 아니라, 특정 작은 영역들(물체)에 대하여 연관성을 고려한다는 점에 영감을 받아 CNN도 특정 픽셀값만으로 깊이를 추정하지 않을까 라는 가정을 합니다.

즉 깊이 추정이라는 분야는 pixel-level에서의 예측을 하긴 하지만, 그렇다고 해서 반드시 입력 영상의 모든 픽셀을 다 사용하지는 않을 것이라는 가정입니다. 그래서 저자는 입력 영상에 마스크를 적용하고 이를 깊이 추정 모델의 입력으로 태움으로써, 가장 적은 개수의 픽셀 수를 가진 입력으로 가장 많은 픽셀을 입력으로 사용했을 때의 성능과 유사해지는 마스크 값을 찾고자 하였습니다.

다시 정리를 하자면, 입력 영상 중 일부만을 사용해서 입력 영상 전체를 사용했을 때와 유사한 결과를 보인다면, 마스크를 통해 살아남은 픽셀들이 모델이 깊이 추정을 할 때 중점적으로 보고 있는 요소라는 것이죠.

그렇다면 해당 마스크는 어떻게 만들면 될까요? 사실 모델이 무엇을 보고 있는지에 대한 시각화는 상당히 난해하고 복잡하죠. 아마 대부분은 정확히 무엇을 표현하는지 알기는 어렵고 노이즈하거나 특정 영역에 대한 대략적인 히트맵?같은 결과들을 보고 있는 듯 합니다.

저자는 보다 선명하고 명확하게 확인하기 위해, 추가적인 Encoder-Decoder 형식의 네트워크를 설계하여 마스크를 학습 및 추론하는 forward 방식을 제안합니다. 그리고 실내와 실외 데이터 셋에 대하여 각각 supervised 방식의 monocular depth estimation network에 대한 mask 결과를 분석하였습니다.

Method

그럼 본격적으로 방법론에 대해서 알아보도록 하죠. 먼저 Depth network N에 RGB 영상 I를 넣어서 추정한 Depth Y는 다음과 같이 표현할 수 있습니다.

자 그럼 서론 부분에서 이야기했듯이, 마치 사람이 영상 속 적절한 정보만으로 깊이를 추정하는 것처럼 모델 역시 모든 픽셀이 아닌 일부의 픽셀만으로도 식 1의 Y와 유사한 깊이를 추론할 수 있는지 확인해야합니다. 즉 입력 영상에 마스크를 씌워서 일부 영역들을 제거하는 것이죠.

M은 마스크를 의미하며 0 또는 1의 값을 가지고 있습니다. 즉 이진 마스크를 통해 입력 영상의 픽셀들을 일부는 제거하고 일부는 살리는 형식으로 바꾼 뒤 동일한 깊이 추정 네트워크의 입력으로 넣어 depth map \hat{Y}를 추론하는 것이죠. 이렇게 추정된 값은 실제 Y와 최대한 유사해지도록 Mask를 학습시켜야 합니다.

허나 무작정 같아지도록 학습을 시키면 마스크는 아마 0이 아닌 1의 값만을 내뱉는 즉 1값으로만 채워진 one tensor가 될 것입니다. 하지만 이는 저자가 원하는 방향이 아닙니다. 저자가 원하는 것은 입력 영상 속 픽셀들 중 가장 적은 수의 픽셀 만으로 동일한 성능이 나오는 것이죠.

그래서 저자는 0 또는 1 값을 가지는 이진 마스크가 아닌, 0~1 사이에 연속적인 값을 가지는 마스크를 예측하도록 모델을 학습시켰으며, Y, \hat{Y}이 같아지는 loss 뿐만 아니라, 마스크 값의 전체 합이 커지지 않도록 하는 sparseness loss를 추가로 적용합니다.

수식 3은 위의 설명을 수식으로 표현한 것으로, 두 추론한 깊이값이 유사해야하는 dif loss와 마스크의 총합이 작아야하는 sparseness loss가 같이 있는 모습입니다.

Learning Predict Mask

자 그럼 수식 (3)에 대해서 그냥 단순히 loss 계산하여 backprop하면 될까요? 사실 해당 논문 이전에도 옛날부터 CNN을 시각화하려는 논문은 종종 존재하였습니다.

그림1. 학습된 분류 모델이 입력에 어느 부분을 보는지를 분석한 사전 연구의 결과물(2013년). 상당히 직관적이지 못하며 사람이 쉽게 해석하기 어렵다.

그림1은 다소 옛날에 물체 분류 분야에서, 학습된 분류 모델을 분석 및 시각화하고자 선택된 class 중 가장 높은 스코어를 가지는 최적의 입력은 무엇인지에 대한 정성적 결과를 나타낸 것입니다. 보시다시피 형체가 무엇인지 어림짐작은 할 수 있지만.. 모델을 이해하기 위한 결과물 자체가 한눈에 쉽게 해석하기 쉽지 않습니다.

이처럼 이렇게 불안정한 결과값이 나오는 기존 방식들의 문제를 해결하기 위해, 저자는 저가 위에서 잠깐 언급했다시피 Mask를 만들기 위한 추가적인 네트워크를 하나 설계합니다. 즉 RGB 영상을 통해 마스크를 예측하고, 예측된 마스크를 다시 RGB 영상에 적용한 후 깊이 추정 모델에 넣어주는 것이죠.

수식(4)는 위의 설명을 수식화 한 것으로, 별거 없습니다. 그냥 수식(3)에서 Mask M은 G라는 마스크 생성 네트워크에 RGB 영상 I를 넣어서 만든 것인게 끝입니다.

수식(4)(그림4-(c))와 같은 방식으로 진행을 하면, 그림2와 같이 수식(3)(그림4-(b))으로 진행한 것보다 훨씬 노이즈가 줄며, 해석하기 쉬운 결과를 추론한다고 합니다.

그림2. 수식(3)과 수식(4)를 통해 시각화한 결과. 수식(3)과 같이 곧바로 최적화하는 방식은 노이즈가 많이 발생하고 해석하기 어려운 것을 확인할 수 있다.

저자는 마스크를 학습시키기 위한 loss에 대하여 또 다른 방식도 적용해보았다고 합니다. 바로 위에서 설명한 최소한의 픽셀만으로 동일한 깊이를 추정하는 방식과 정 반대인, 최대한의 픽셀로 서로 다른 깊이를 추정하도록 말이죠.

물론 이 방식은 그리 좋지 못한 결과를 보여주었으며, 아무래도 학습이 잘못된 방향으로 갈 수 밖에 없는 제약조건이 아니었는가 싶습니다. 수식(5)를 통해 학습시킨 정성적 결과는 그림2-(d)에서 확인할 수 있으며, 입력이 어떠한 장면이든지 간에, 거의 유사한 결과를 보이는 것으로 보아 잘못된 방향으로 학습이 된 것을 확인할 수 있습니다.

Pipeline

위에 설명한 내용들을 파이프라인으로 나타낸 그림입니다.

그림3. 전체 파이프라인

매우 간단해서 아마 그림만 보면 위에 내용을 다 정리할 수 있을 듯 합니다.

참고로 마스크를 생성하는 네트워크 (G)는 이미지넷으로 사전학습된 DRN-D-22 network를 사용했다고 합니다.

Experiments

다음 표는 실내 데이터 셋인 NYU-v2 데이터 셋에 대하여 마스크를 적용한 입력으로 추로한 결과와 실제 GT간에 RMSE값을 나타낸 것입니다.

여기서 3번째 열에 속하는 M’은 기존 연속적인 값을 가지는 M에다가 0.025 threshold를 적용하여 0 또는 1 값을 가지는 이진 마스크를 적용하였을 때 결과입니다. 보시면 마스크를 적용하지 않았을 때 대비 약 33% 정도 에러가 증가하는 것을 확인할 수 있습니다.(0.555 -> 0.740)

여기서 lambda는 수식 4에서 sparseness loss의 스케일을 나타내는 값으로, 람다 값이 커지면 마스크가 더 sparse 해지는 것을 의미합니다. 이진 마스크 M’의 경우 연속적인 마스크 M과 비교하였을때 람다가 작은 경우에는 거의 유사하거나 더 좋은 결과를 보이지만, 람다값이 커질수록 에러도 조금 더 크게 증가하는 모습입니다.

그림4. lambda값에 따른 추론된 깊이와 마스크의 차이에 대한 정성적 비교 결과.

그림4를 보시면 람다값에 따른 마스크와 depth map을 정성적으로 비교확인할 수 있습니다. 확실히 lambda값이 1인 경우 거의 모든 픽셀 영역이 활성화 된 것을 확인할 수 있으며, lambda가 5인 경우에는 마치 엣지맵처럼 물체 경계면 위주로 활성화되는 모습입니다.

다음은 Depth network의 Backbone을 다양하게 변경한 후 마스크를 학습 및 정성적으로 비교한 결과입니다. 백본을 변경하였다 하더라도 대부분 물체 경계면이 활성화되는 유사한 경향성을 보여주고 있으며, 저자는 이를 통해 마스크를 추출하는 방식이 안정적으로 학습 및 추출된다고 주장합니다.

또한 보다 용이한 비교를 위해 실제 edge map을 추출하여 보였습니다. 보시면 edgemap과 마스크 결과가 매우 유사해보지만 또 크게 다른 점이 존재합니다. 마스크를 적용한 결과값들은 물체의 영역이 채워져있는 경우가 종종 있습니다. 또한 에지가 강하게 존재하는 영역에서 마스크의 경우 약하거나 없는 경우도 존재하였으며 그 반대의 경우(에지맵에서는 에지가 약하지만, 마스크에서는 강하게 활성화가 되는 경우)도 있습니다.

저자는 edge map이 마스크와 유사한 부분과 유사하지 않은 부분에 대하여 정량적인 평가를 하고자, edge map을 M으로 놓고 실제 영상에 곱한 뒤 깊이를 추정하여 정확도를 평가해보았습니다.

그 결과는 그림6과 같으며, 마스크를 적용했을 때와 비교하였을 때 성능이 크게 감소하는 것을 확인할 수 있었습니다. 즉 edge map은 네트워크를 통해 추출한 마스크와는 많이 다르다는 것을 확인할 수 있습니다.

그리고 저자는 실내 데이터 셋을 이용한 깊이 추정을 하는데 있어 CNN이 물체 경계면 뿐만 아니라, 작은 물체 내부에 영역들을 활용하여(물체를 인지함) 깊이를 추정한다는 결론을 내렸습니다.

KITTI dataset

다음은 실외 데이터 셋으로 학습한 경우에 대해 알아봅시다. 키티 데이터 셋도 실내셋과 유사하게 에지 맵과 유사한 영역도 있는 반면, 에지 맵과 다른 영역도 존재합니다.

첫번째 열에서 가드레일 부분에는 강한 에지가 존재하며, 마스크 역시도 이를 보고 있는 모습입니다. 하지만 도로 위 차선에 경우 에지는 강하게 나타나지만, 마스크에서는 잘 활성화가 되지 않는 모습이죠.

하지만 한가지 큰 특징이 있다면, 위에 정성적 결과인 3장 뿐만 아니라 대부분의 영상에서 소실점 부근에 강한 활성화가 보였다고 합니다. 아마도 supervised로 학습한 깊이 추정 모델이기 때문에 가까이 있는 거리보다는 소실점 부근에 멀리 있는 영역에서 더 큰 에러가 발생할 것이고, 이때문에 멀리 있는 영역들이 더 큰 가중치를 가진 체 학습을 하지 않았는가 싶네요.

또는 소실점이 예로부터 장면의 기하학적인 이해를 하는데 가장 중요한 단서이기 때문에 모델이 이를 잘 활용했다..? 라는 추측도 하지만 무엇이 정답인지는 알 수가 없습니다. 하지만 확실한건, 실외에서는 모델이 소실점 부근, 즉 멀리 있는 영역을 보다 중점적으로 보고 있다고 생각하시면 될 것 같습니다.

결론

해당 논문은 상당히 흥미로우면서도 생각보다 이론이 어렵지 않아 쉽게 적용해볼 수 있는 좋은 논문인 듯 합니다. 게다가 코드도 공개하고 있어 구현하는데 더더욱 어려움이 없겠네요. 픽셀 레벨 추론을 수행하는 모델이 입력에서 어느 부분을 중점적으로 보고 있는지를 시각화 하고 싶으시다면 해당 논문을 적절히 사용해봐도 좋을 듯 합니다.

Author: 신 정민

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 항목은 *(으)로 표시합니다