Fully Convolutional Networks for Semantic Segmantation
Jonathan Long, Evan Shelhamer, Trevor Darrell; Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition (CVPR), 2015, pp. 3431-3440
Abstract
이번 논문은 2015년에 공개된 Semantic Segmentation 분야 논문으로, 각 픽셀 별로 일정한 Bounding Box 크기만큼 Classification을 적용하여 해당 픽셀의 종류를 추론하는 기존 접근 방식을 획기적으로 바꾼 논문이다. 기존에 사용되던 Fully Connected Layer 대신 1x1 Convolution을 사용하여 연산량을 획기적으로 줄였으며 Segmentation 성능 향상 또한 이루어냈다.
해당 논문의 저자들은 AlexNet, VGG16, GoogLeNet과 같은 Contemporary Classification Network 구조를 목적에 맞게(Semantic Segmentation을 위해) fine-tuning 하여 변형시킨 것이다. 이 과정은 크게 다음과 같은 세 과정으로 표현 가능하다.
- Convolutionalization
- Upsampling
- Skip architecture
이 논문을 통해 제시된 FCN 구조는 당시 Segmantation 분야에서 SOTA를 달성했다.
Semantic Segmentation이란
본격적으로 논문을 보기에 앞서 Semantic Segmentation이 무엇인지 알아보자. Semantic Segmentation은 단어 그대로 '의미론적 분할'로, 컴퓨터비전 분야에서 많이 다뤄지는 핵심적인 분야 중 하나이다. 단순히 사진을 보고 분류하거나 객체를 탐지하는 Image Classification이나 Object Detection에 비해 다소 어려운 문제 중 하나로, 최근 자율주행이 큰 관심을 받게 되며 함께 관심을 받고 있다.
- Image Classification: 이미지 내 물체를 Classify (Object Class 인식)
- Object Detection: 이미지 내 물체의 탐지 및 인식. 객체의 클래스 뿐만 아니라 위치와 크기 또한 알아내는 것이 목적
- Semantic Segmentation: 픽셀 단위로 object class를 classify하는 문제. 각 픽셀 별 레이블을 예측한다.
Semantic Segmentation은 이미지를 입력으로 하여 이미지 내 픽셀의 클래스를 예측한다. One-Hot Encoding으로 각 class에 대해 출력 채널을 만들어서 segmentation map을 만든 후 argmax를 통해 최종 output을 만들게 된다.
Semantic Segmentation은 기본적으로 같은 클래스에 대해서는 instance 구분을 하지 않는다. 예를 들어, 사진 속에 사람이 여러 명 존재할 때, 모든 사람(의 픽셀)은 '사람'이라는 레이블로 레이블링 되지만, 각 사람 간의 레이블 차이를 두지 않는다. instance를 구별하는 모델은 Instance Segmentation이라는 이름으로 분리되어 있다.
Image Classification에서 Semantic Segmentation으로
해당 논문은 Image Classification Task에서 주로 사용되던 Comtemporary Classification Network 구조를 변형하여 Semantic Segmentation Task 수행에 이용하였다. 앞에서도 언급하였듯이 해당 과정은 크게 세 가지로 나뉘는데, 각 과정을 살펴보도록 하자.
1. Convolutionalization
이 과정을 이해하기 위해서는 Image Classification 모델을 살펴볼 필요가 있다. Image Classification 모델들은 기본적으로 출력층이 Fully-Connected Layer(이하 FC Layer)로 구성되어 있다. 앞서 합성곱 층과 풀링 층에 의해 추출된 영상의 특징을 FC Layer에 통과시켜 레이블을 분류하는 것이 일반적인 Image Classification의 과정이다. 하지만 Semantic Segmentation 관점에서 이러한 FC Layer는 한계점을 갖는다.
Convolution 구조를 거쳐 만들어진 Feature map을 FC Layer에 넣어주기 위해서는 이를 1차원으로 변환하는 과정이 필요하다. 이 때문에 feature map에서는 유지되던 위치 정보가 소실되게 되는데, 원본 이미지의 각 픽셀에 대해 클래스를 구분하고 인스턴스 및 배경을 분할하는 Segmentation에서는 위치 정보가 소실되면 타격이 크다.
따라서 논문의 저자들은 이러한 FC Layer의 한계를 보완하기 위해 모든 FC Layer를 Conv Layer로 대체하는 방법을 사용하였다. 기존 CNN 구조의 출력층 쪽 Dense Layer를 모두 Conv Layer로 바꿔 출력 Feature map이 위치 정보를 유지할 수 있도록 한 것이다.
하지만 이렇게 나온 Feature map은 원본 이미지에 비해 해상도가 낮은 Coarse map이 된다. 이는 합성곱 층 뒤의 풀링 층에 의한 것으로, 이를 원본 이미지에 가까운 Dense map으로 변환시켜줄 필요가 있다.
2. Upsampling
Coarse map에서 Dense map을 얻는 방법에는 다음과 같은 방법들이 존재한다.
- Unpooling
- Shift and stitch
- Bilinear Interpolation
- Deconvolution
먼저 Unpooling은 이름처럼 Pooling의 반대라고 볼 수 있는 방법이다. 주변 픽셀들을 동일한 값으로 채우거나 0으로 채워 Upsampling 하는 방식으로, 손쉽게 연산을 수행할 수 있다는 장점을 가진다. 다만 이는 원래 Pooling을 적용하였을 때 상태의 위치 정보를 기억해내지 못한다는 한계가 있다. 이러한 문제를 해결하여 위치 정보를 기억한 다음, 그 자리에 원래의 값을 위치시키고 주변을 0으로 채워주는 Max Unpooling 기법이 등장했다. 이는 이후 FCN의 후속 논문인 Deconvolution Network의 핵심이 된다(이는 추후 리뷰하며 자세히 다뤄보도록 하겠다.).
다음으로 Shift and stitch 방식이다. 해당 내용은 풀링 층 이전에 패딩을 만드는 과정에서 차이를 두어(shift) max-pooling을 진행한 후, 각 결과 feature map을 엮어 붙이는(stitch) 방법이다. 패딩을 주는 방식은 세임 패딩(same padding)과 비슷하지만 커널 크기만큼 스트라이드를 주어 출력되는 feature map은 작아지는 점이 다르다. 패딩은 다음 그림과 같은 방식으로 달라지며, 결과로 출력된 각 feature map을 조합하여 원래의 이미지와 사이즈가 같은 feature map을 생성한다.
그다음 두 가지(Bilinear Interpolation & Deconvolution) 방법이 해당 논문에서 사용한 방법이다.
먼저 Bilinear interpolation은 Linear interpolation을 2차원으로 확장시킨 개념으로, 작은 size의 feature map을 입력값과 동일한 사이즈로 키운 후 빈 영역을 추정하는 방식이다.
위와 같은 방식을 확장된 feature map에 적용하면 빈 영역을 예측하는 방식으로 Upsampling이 가능해진다.
Deconvolution의 경우 이 논문에서 핵심적으로 사용한 방법으로, transpose convolution, backward convolution 등으로도 불린다. 이름에서처럼, convolution layer를 거꾸로(backward) 적용하는 Deconvolution은, Convolution의 Transpose와 feature map을 행렬곱하여 입력 크기를 복원하는 것이다.
3. Skip architecture
논문의 저자들은 Deep & Coarse Layer의 Semantic 정보와, Shallow & Fine Layer의 Appearance 정보를 결합한 Skip architecture를 정의했다. 해당 논문에서는 위와 같은 Upsampling 과정을, 앞서 FC Layer를 대체한 Conv Layer의 결과 feature map에 대해 수행하여 주었다. 이렇게 생성된 Dense map을 합쳐 결과를 구하면 Segmentation 성능이 올라가는 것을 확인하였다고 논문은 주장하고 있다.
즉, 더 깊은 합성곱 층에서 만들어진 Dense map은 Global한 Semantic 정보를 abstract 하게 표현하고, 상대적으로 얕은 합성곱 층에서 만들어진 Dense map은 Local 한 Appearance 정보를 detail 하게 표현하므로 이를 잘 결합하면 Segmentation의 성능이 좋아진다는 것이다. 사실 이러한 아이디어는 CNN의 기본 아이디어와도 유사한 것으로, CNN에서도 얕은 층에서는 직선 및 곡선, 색상 등 낮은 수준의 특징에 활성화되고, 깊은 층에서는 보다 복잡하고 포괄적인 개체 정보에 활성화되므로 이를 종합적으로 사용하여 성능을 올린다는 아이디어와 유사하다.
Results
실제 성능 지표에서도 FCN-32s → FCN-16s → FCN-8s 순으로 결과가 좋아지는 것을 확인할 수 있으며, 다른 모델이나 기타 논문에서 제안한 구조에 비해서도 좋은 성능을 보이는 것을 확인할 수 있다.
Conclusion
해당 논문은 이 리뷰를 작성하는 시점 기준 30,000회 이상 인용될 정도로, 컴퓨터 비전에 지대한 영향을 준 논문이다. 특히 FCNs이라는 End-to-End 방식의 Fully-Convolution Model을 제시함으로써 Dense Prediction 혹은 Semantic Segmentation의 초석을 닦은 연구로써 이후 많은 관련 연구들에 영향을 주었다. 1x1 Convolution을 사용하여 입력 크기에 상관없이 Task를 수행할 수 있는 기법을 제시했다는 점도 눈여겨볼만하다.
다만, Upsampling에만 의존하여 결과값을 추출한다는 한계점 또한 존재한다. 합성곱 층과 풀링 층을 거치며 소실된 위치 정보를 복원하는 데에 Upsampling만으로는 부족했다라고도 볼 수 있겠다.
이러한 문제점을 개선하고자, Max Unpooling 기법을 활용한 Deconvolutional Networks가 등장했다.
Reference.
[1] J.Long et al, Fully Convolutional Networks for Semantic Segmentation, 2015, CVPR
https://openaccess.thecvf.com/content_cvpr_2015/html/Long_Fully_Convolutional_Networks_2015_CVPR_paper.html
[2] 'How does shift-and-stitch in a fully convolutional network work?', Stack overflow
https://stackoverflow.com/questions/40690951/how-does-shift-and-stitch-in-a-fully-convolutional-network-work
[3] '1편: Semantic Segmentation 첫걸음!', 심현주
https://medium.com/hyunjulie/1%ED%8E%B8-semantic-segmentation-%EC%B2%AB%EA%B1%B8%EC%9D%8C-4180367ec9cb
[4] 'FCN 논문 리뷰 — Fully Convolutional Networks for Semantic Segmentation', 강준영
https://medium.com/@msmapark2/fcn-%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0-fully-convolutional-networks-for-semantic-segmentation-81f016d76204
댓글