[ 딥러닝 논문 리뷰 - PRMI Lab ] - Fully Convolutional Networks for Semantic Segmentation (CVPR 2015)
Instance segmentation
Mask R-CNN의 task인 Instance segmentation이 뭔지 알아야 합니다. 이는 영상/이미지에서 의미있는 부분들을 구별해내는 기술을 이야기합니다. 이미지를 영역별로 나눠준 후, 각 개체에 맞게 합쳐주는 task를 얘기합니다.
object detection, classification과 같은 task들과 비교해봤을 때, 정확하게 개체들의 경계선까지 추출해 의미있는 영역들로 나누어져야하므로 더 어려운 작업에 속합니다. 그리고 이는 semantic과 instance로 나뉩니다.
- Sementic segmentation
- 위 사진과 같이 segmentation을 진행할 때, class가 같다면 구분하지 않고 같은 영역 혹은 색으로 분할합니다. 같은 클래스의 다른 개체들이어도 구분을 하지 않습니다. 위 사진에서도 각기 다른 사람 5명이 있지만 person이라는 같은 클래스이므로 하나로 봅니다.
- Instance segmentation
- class가 같더라도 다른 개체라면 이를 구분해 인식합니다. 위 사진처럼 5명 모두 "person"이라는 같은 class지만, instance로 인식해 각자 다르게 영역 혹은 색으로 분할해줍니다. 이는 object detection과 sementic segmentation을 합쳐놓은 task라고도 설명합니다.
- 있다가 볼 Mask R-CNN에서는 RoI 내에서 각 클래스별로 instance인지를 구분하는 mask를 씌워줍니다. 그 후 classification layer를 통해 계산된 classification에 대해 instance가 있다고 판단된 픽셀들에 색을 칠해 Instance segmentation을 진행하는 것이죠
FCN: Fully Convolutional Networks for Semantic Segmentation
FCN은 Sementic Segmentation 모델을 위해 기존에 이미지 분류에서 우수한 성능을 보인 CNN 기반 모델(AlexNet, VGG16 GoogLeNet)을 목적에 맞춰 변형시킨 것입니다.
이러한 [Image classification model] -> [Sementic segmentation model]은 크게 아래 세 과정으로 표현될 수 있습니다.
- Convolutionalization
- Deconvolution (Upsampling)
- Skip architecture
Convolutionalization
Image classification 모델들은 기본적으로 내부 구조와 관계없이 모델의 근본적인 목표를 위해 출력층이 Fully-connected layer로 구성되어 있습니다.
이러한 구성은 네트워크의 입력층에서 중간부분까지 ConvNet을 이용하여 영상의 특징을 추출하고 해당 특징들을 출력층 부분에서 fc를 이용해 이미지를 분류하기 위함입니다.
Sementic Segmentation 관점에서의 fc layer의 한계점
- 이미지의 위치 정보가 사라집니다.
- 입력 이미지 크기가 고정됩니다.
Segmentation의 목적은 원본 이미지의 각 픽셀에 대해 클래스를 구분하고 인스턴스 및 배경을 분할하는 것으로 위치 정보가 매우 중요합니다. 그래서 이와같이 하면 안됩니다.
이 얘기를 VGG net에서도 이야기 했던거 같습니다. VGG16을 예시로 그럼 3 fc-layers를 모두 Conv-layers로 바꾸어 보겠습니다. 실제로 VGG net에서 test시에 FCN을 사용하죠.
Dense layer에서 Conv layer로 변환하는 방식은 아래와 같습니다.
유지되는 이유는 (7x7x512) x 4096 과 (7x7x512) x (1x1x4096)은 어차피 같은 가중치의 개수이기 때문입니다! 이때문에 1x1 conv가 FCN으로의 변환에 많이 사용된다고 했었습니다.
그리고 VGG16에서 다섯 번째 max-pooling(size: 2x2, stride:2) 연산 후 Feature map의 크기는 7x7입니다. (입력 이미지가 224x224 ImageNet인 경우)
즉 이와같이 Convolutionalization을 통해 출력 Feature map은 원본 이미지의 위치 정보를 내포할 수 있게 되었습니다.
그러나 Sementic segmentation의 최종 목적인 픽셀 단위 예측과 비교했을 때, FCN의 출력 Feature map은 너무 coarse합니다.
"coarse" 하다는 거는, FCN에서는 고차원의 정보가 손실되어, 저차원에서는 세밀한 정보를 표현하기 어렵다는 것을 의미합니다. 즉 세밀한 위치 정보나, 물체의 모양, 구조등에 대한 정보가 손실되는 것을 말합합니다.
FCN은 일반적으로 CNN과 비슷하게 여러 계층을 거치면서 이미지의 고차원 특성을 점차 추출해냅니다. 그런데 이 과정에서 pooling 등을 통해 공간적인 정보(spatial information)을 축약하게 되며, 이로 인해 어느 정도의 세부 정보가 소닛ㄹ되곤 합니다.
따라서, Coarse map을 원본 이미지 크기에 가까운 Dense map으로 변환해줄 필요가 있습니다. 적어도 input image size * 1/32 보다는 해상도가 높을 필요가 있습니다!
Deconvolution
Coarse map에서 Dense map을 얻는 몇 가지 방법이 아래에 제시됩니다.
- Interpolation
- Deconvolution
- Unpooling
- Shift and strich
Pooling을 사용하지 않아서 이를 피할 수는 있지만, Receptive field가 줄어들어 이미지의 컨텍스트를 놓칠 수 있게 됩니다. 또한 Pooling의 큰 특징 중 하나는 Feature map의 크기를 줄임으로써 학습 파라미터의 크기를 줄임에 있습니다. 이에 학습 시간도 기하급수적으로 늘어나겠죠.
따라서, Coarse Feature map을 Dense map으로 Upsampling 하는 방법을 고려해야 합니다.
Bilinear Interpolation
10x10 이미지를 320x320 크기로 확대하려 합니다. 이에 대표적인 방법으로 Bilinear Interpolation이 있습니다. 그냥 선형 보간을 4번 적용해주면 됩니다.
Backwards convolution
Dense prediction을 위한 Upsampling 방법에는 Bilinear interpolation처럼 정해진 방법만이 있는게 아닙니다. 즉 Up-sampling도 학습이 가능합니다.
Stride가 2이상인 Convolution 연산의 경우 입력 이미지에 대해 크기가 줄어든 특징맵을 출력합니다. 이것은 Down-sampling에 해당합니다.
Convolution 연산을 반대로 할 경우 자연스럽게 Up-sampling 효과를 볼 수 있습니다. 또한, 이 때 사용하는 Filter의 가중치 값은 학습 파라미터에 해당합니다.
FCNs에서는 Bilinear interpolation과 Backwards convolution 두 가지 방법을 사용하여 Coarse Feature map으로부터 Dense prediction을 구했습니다.
초기 Segmentation을 위한 모델은 아래와같이 VGG 모델을 컨볼루션화한 구조에 Bilinear interpolation 작업을 더함으로써 얻을 수 있습니다.
하지만 여전히 근본적으로 feature map의 크기가 너무 작기 때문에 예측된 dense map의 정보는 여전히 Coarse! 할 수 밖에 없습니다.
Skip Architecture
본 논문에서는 정확하고 상세한 구분을 얻기 위해 Deep & Coarse(추상적인) 레이어의 의미적(semantic) 정보와 Shallow & fine 층의 외관적(appearance) 정보를 결합한 Skip architecture를 정의합니다.
위와같이 시각화 모델을 통해 입력 이미지에 대해 앝은 층에서는 주로 직선 및 곡선, 색상 등의 낮은 수준의 특징에 활성화되고, 깊은 층에서는 복잡하고 포괄적인 개체 정보에 활성화 된다는 것을 확인할 수 있습니다.
그리고 얕은 층에서는 local feature를 깊은 층에서는 당연히 Coarse하니까 global feature를 감지한다고 볼 수 있겠죠.
이러한 특징을 이용해서 FCNs 연구팀은 이러한 직관을 기반으로 앞에서 구한 Dense map에 얕은 층의 정보를 결합하는 방식으로 Segmentation의 품질을 개선하였습니다.
각 Pooling에 Prediction을 위해 추가된 Conv layer의 필터는 0으로, Trainable Backwards convolution은 Bilinear interpolation으로 초기화한 후 학습을 진행하였습니다.
이러한 Skip Architecture를 통해 다음과 같이 개선된 Segmentation 결과를 얻을 수 있었다고 합니다.
성능 지표에서도 FCN-32s -> FCN-16s -> FCN-8s 순으로 결과가 나아지는 것을 확인할 수 있습니다.