이번 포스터에서는 Segmentation 모델인 FCN(Fully Convolution Networks)에 대해 알아보자. FCN은 Fully Convolution Networks for Semantic Segmentation이라는 논문에서 발표되었다. 2015년 CVPR에서 발표된 이 모델은 Segmentation 분야에 획기적인 변화를 가져왔다.


대부분의 분야가 그렇듯이 CNN이 도입되기 전에는 Visual Representation Model를 이용해 이미지에서 feature를 추출하고 조합하여 다양한 테스크를 수행했었다. Segmentation도 마찬가지로 이미지를 보고 어울리는 feature를 수동으로 추출하고 classifier에 넣은 후 segmentation을 진행했었다. 하지만 이러한 방식은 계산량에도 비효율적이고 다양한 사이즈에 대해 범용적이지 못 했으며 성능도 좋지 않았다. FCN은 과거에 발생한 문제들을 해결하는 방법에 대해 제시했다.

FCN 개요


Object Detection이 특정 물체의 위치를 box로 표시(Localization)하고 무슨 class인지 인지(Recognition)하는거라면, Segmentation은 단순히 box로 표시하는 것이 아닌 이미지의 픽셀 단위까지 물체를 구분짓는 테스크를 말한다. 더 나아가 Segmentation에는 Sementic과 Instance로 나눠지는데, Sementic의 경우 class 레벨까지만 구분짓는 것이고, Instance의 경우 ID까지 부여해서 같은 class 내에서도 구분짓는 테스크를 말한다. 아래는 Object Detection과 Segmentation의 차이를 나타낸 사진이다.



FCN은 Sementic Segmentation의 모델 중 하나이다. 풀네임은 Fully Convolution Networks인데, 이름에서도 알 수 있듯이 모든 과정이 CNN만 이루어져 있는 최초 모델이다. 과거에는 Feature를 특저 알고리즘를 이용해 추출하거나 classifier를 하는 과정을 Fully-Connected Layer를 이용했지만, FCN의 경우 이 모든 과정을 CNN으로 대체했다. FCN의 특징은 다음과 같다.

  • 모든 구간을 convolutional neural network(Convolutionalization)를 사용
  • Encoder-Decoder 방식
  • Deconvolution(Upsampling) 기법
  • Skip Architecture 기법


FCN 구조


FCN의 구조를 보면 다음과 같다.



FCN의 Forward 과정은 다음과 같다.

  1. Input 이미지를 입력한다.
  2. Convolution 연산을 통해 Feature를 추출한다.(Feature Extraction)
  3. 1x1 Filter를 이용해 Spatial한 정보를 유지한 상태로 heat map(M x N x class)을 생성한다.
  4. Heat map을 Pooling Layer의 결과들과 combine한다.
  5. Combined된 Heap map을 Input 이미지와 동일한 사이즈(W x H)로 복원한다.
  6. 복원된 Heat map의 각 픽셀별로 softmax를 적용해 픽셀별 class를 예측한다.


위 사진은 논문에 기재되어 있는 사진이고, 아래 사진은 FCN을 더 구체적으로 표현했다.



Forward 과정의 대부분은 다른 모델들과 비슷하기 때문에 여기서 다루지 않기로 하고, FCN만의 특징만 구체적으로 설명을 하고자 한다.


Convolutionalization


FCN의 특징 중 하나는 모든 과정을 CNN으로 사용했다는 것이다. 이러한 처리를 논문에서는 Convolutionalization라고 불렀다. 이 과정을 이해하기 위해서는 우리가 일반적으로 알고있는 모델을 살펴봐야한다. 아래 사진은 Classification모델 중 하나인 AlexNet의 구조이다.



Classification모델은 크게 2개의 부분으로 나눌 수 있는데, Feature Extraction부분과 Classifier부분이다. 보통 Feature Extraction부분은 CNN을 이용하고, Classifier는 Fully Connected Layer(Dense Layer)를 사용하는 것이 일반적이다. 하지만 Classifier에서 Dense Layer를 사용하게되면 위치정보(Spatial Information)가 손실되는 문제가 있다. 그 이유는 Dense Layer를 적용하기 전에 Feature Extraction의 결과를 1차원으로 펴주기 때문이다. 이 과정에서 위치 정보가 손실되고, 이미지와 같이 위치정보가 매우 중요한 데이터에 대해서는 악영향을 줄 수 있다.


출처 : https://medium.com/@PK_KwanG/cnn-step-2-flattening-50ee0af42e3e


각 픽셀별로 classification을 해야하는 Segmentation에서 위치정보의 손실은 매우 큰 타격이다. 따라서 FCN은 Dense Layer가 적용되는 부분을 1x1 Filter를 이용해 위치정보를 잃어버리지 않으면서 Dense Layer와 같은 역할을 할 수 있도록 했다.


이 부분은 멤버들과 상의 후 결정한다. (1) Dense Layer가 적용되는 부분을 Feature Map의 size와 동일한 filter로 대체 (2) 위와 동일


출처 : https://medium.com/@msmapark2


위 과정을 지나고 나면 최종적으로 1x1x21(classes)의 heat map이 생성된다. 하지만 Segmentation의 경우 모든 픽셀에 대해 classification을 진행해야하기 때문에 1x1 size의 heat map을 input 이미지와 동일한 size로 복원해야한다. 이와 같은 과정이 Upsampling이다.


Upsampling


Upsampling이란 이미지의 해상도를 높이는 모든 기법을 말한다. 즉, CNN에 의해 작아진 Feature map을 다시 키우는 작업이다. 논문에서는 다음과 같은 기법들이 소개되었다.

  • Bilinear Interpolation
  • UnPooling
  • Transposed Convolution
  • Deconvolution

Transposed ConvolutionDeconvolution을 혼용해서 사용하기는 하지만, 두 기법은 수학적으로 다른 방식이다. 논문에서 정확히 어떤 방식으로 Upsampling을 했는지 나오지 않아서 Transposed Convolution로 추측했다.


Bilinear Interpolation


보간법(Interpolation)이란 알려진 지점의 값 사이에 위치한 값을 알려진 값으로부터 추정하는 것이다. 방법은 여러가지가 있지만 Linear의 경우 두 지점 사이의 값을 추정할 때 그 값을 두 지점과의 직선 거리에 따라 선형적으로 결정하는 방법이다. 이미지의 경우 2차원(가로, 세로)으로 확장해야하기 때문에 Bilinear가 된다. Skip Architecture가 적용된 후 마지막 부분에서 Upsampling하는데 사용된다.


출처 : https://darkpgmr.tistory.com/117


\[P=\left(B \frac{h 1}{h 1+h 2}+A \frac{h 2}{h 1+h 2}\right) \frac{w 2}{w 1+w 2}+\left(C \frac{h 1}{h 1+h 2}+D \frac{h 2}{h 1+h 2}\right) \frac{w 1}{w 1+w 2}\]


간단한 알고리즘이기 때문에 구현하기가 매우 쉽지만, End-to-End 방식에서 학습될 수 없는 알고리즘이기 때문에 마지막 부분에만 사용한다.


UnPooling


아래 사진은 MaxPooling에 대해 UnPooling을 적용하는 예시이다.


출처 : https://devkor.tistory.com/entry/CS231n-11-Detection-and-Segmentation


Pooling을 역(Un)으로 적용하는 기법으로 Pooling 시 어느 위치의 값이 pooling되었는지 기억한 후에 확장을 위해 역으로 Unpooling될 때 해당 위치로 복원하는 것이다. 대표적으로 두 가지 방식이 있다.

  • Nearest Neighbor : 복원 시 빈 공간을 복원된 값과 동일한 값으로 채우는 방식
  • Bed of Nails : 복원 시 빈 공간을 모두 0으로 채우는 방식


Transposed Convolution


논문에 정확히 나오진 않았지만, 아마도 이 방법이 사용된 것 같다. Convolution(CNN)을 적용하면 feature map의 크기가 작아진다(padding=0). 반대로 feature map의 크기를 키우고 싶다면 Convolution을 (역)으로 적용하면 된다. 원리는 다음과 같다.


출처 : https://89douner.tistory.com/m/296?category=878997


먼저 위 사진과 같이 Convolution연산이 있다고 하자. 위 과정이 실제로 계산되는 행렬로 표현하면 다음과 같다.


출처 : https://89douner.tistory.com/m/296?category=878997


(3x3) Filter가 (4x4) Input 이미지에 적용된다고 할 때, 행렬 계산이 가능하도록 하기 위해 1차원으로 늘린다. 이때 Input 이미지의 size에 맞게 (3x3) Filter를 (1x16) 사이즈로 확장한다. 그리고 Filter가 적용되는 총 횟수(n)에 맞게 Filter의 행을 추가한다(n x 16). 최종적으로 (nx16) 필터와 (16x1) Input 이미지를 연산하면 (nx1) Output이 나온다.


위 과정은 Convolution의 진행과정이다. 하지만 목표는 (nx1) Output에 특정 값을 곱해서 (4x4) Input 이미지로 복원하는 것이다. 즉, (nx1) Output이 Input이 되고, (4x4) Input 이미지가 Output이 되는 것이다. 방법은 간단하다. Filter행렬을 전치행렬(Transposed)로 바꿔주면 된다.


출처 : https://naokishibuya.medium.com/up-sampling-with-transposed-convolution-9ae4f2df52d0


FCN에서 Transposed Convolution은 Maxpooling으로 작아진 feature map을 MaxPooling 전으로 복원하는 부분에 사용된다.


Deconvolution


Transposed Convolution과 계산과정이 비슷하지만, 실제 대응되는 부분이 다르기 때문에 보통 ‘수학적’으로 다른 연산이라고 말한다. 아래는 Deconvolution을 가장 잘 표현한 사진이다.


출처 : https://naokishibuya.medium.com/up-sampling-with-transposed-convolution-9ae4f2df52d0


CNN에 의해 작아진 Feature map에 Stride 크기만큼 padding을 적용해 마치 큰 feature map에 CNN을 하는 것처럼 하는 방식이다. 이 방식이 Transposed Convolution과 비슷한 계산과정인 것 같은데, 행렬로 표현해서 계산을 하면 염연히 다른 방식으로 계산이 이루어진다고 한다.(사실 안 해봤다.ㅎㅎ)


Upsampling에 대해서 알아보았으니 이제 모든 과정을 합쳐보면 다음과 같다. CNN Layer를 통해 Feature map의 크기를 줄여가며 Feature를 추출하고 Heat map을 만들고, Heap map을 Transposed Convolution과정을 통해 Input 이미지와 동일한 size로 만들어 classification을 진행한다. 아래는 지금까지 설명한 과정을 표현한 사진이다.


출처 : https://www.researchgate.net/figure


이렇게까지만 해도 FCN이 목표로 하는 Segmentation 작업을 실시할 수 있다. 하지만 결과는 매우 좋지 않았다. 그 이유는 Up-Sampling을 하는 과정에서 너무 많은 정보의 부족 현상이 발생했기 때문이다. Down-Sampling을 통해 만들어진 (28x28)의 feature map이 (224x224) Output으로 만들어지기 위해서는 큰 Stride로 설정해야하는데, 무에서 유를 창조하는 과정이기에 많은 정보가 누락되어있다. 실제로 결과를 보면 다음과 같다.



위에서 발생하는 정보 부족 현상을 해결하기 위해 FCN은 Skip Architecture라는 구조를 제시했다.


Skip Architecture


FCN은 정보 부족현상을 방지하기 위해 Down-Sampling의 최종 결과인 conv7의 output과 Down-Sampling 중간 과정에 있는 $pool_5$, $pool_4$ 등과 같은 feature map을 결합하여 Up-Sampling을 진행했다. 중간 과정에서 나온 feature map을 바로 Up-Sampling에 사용했기 때문에 논문에서 Skip Architecture라고 하는 것 같다. 구체적으로 해석하면 Deep&Coarse층의 Sementic(의미론)적인 정보와 Shallow&Fine 층의 Appearance(외관적) 정보를 결합한 것이다. FCN에서 소개한 Skip-Architecture가 적용된 FCN의 종류는 다음과 같다.

  • FCN-32s : Skip Architecture가 없는 FCN이지만 마지막 Layer를 사용했다는 점에서 비슷한 의미를 가지고 있다.
  • FCN-16s : $pool_4$의 output과 마지막 Layer의 ouput(Heat map)을 결합한 FCN모델
  • FCN-8s : $pool_3$, $pool_4$의 ouput과 마지막 Layer의 output(Heat map)을 결합한 FCN모델

FCN-32s은 Normal한 FCN이지만 다른 FCN과 구별하기 위해 32s라는 이름을 지은 것 같다.


FCN-32s는 지금까지 설명한 FCN구조와 동일하기 때문에 따로 다루지 않고, FCN-16s와 FCN-8s에 대해서만 다뤄보기로 하자.

  • 마지막 Layer의 output(Heat map)은 $pool_5$와 이후에 1x1 Filter까지 거친 (NxNxclasses)를 말한다.($pool_5$로 칭함)
  • 그림을 보면 2x, 16x Upsampling 등이 있는데, 최종 목표는 $pool_5$을 기준으로 x32를 하는 것이다.
  • 2x, 16x Upsampling에서 2x, 16x은 직전 결과에 적용되는 수치이다.
  • 사진에 나오는 예시는 (224x224) Input 이미지를 사용했다. 따라서 $pool_4$는 (14x14)이고 $pool_5$는 (7x7)이다.

FCN-16s


아래 사진은 FCN-16s의 구조이다.


출처 : https://medium.com/@msmapark2


FCN-16s는 $pool_4$와 $pool_5$를 결합한 구조이다.

  1. 512 channel인 $pool_4$에 (1x1) Filter를 적용해 Class수의 channel을 가진 feature map을 출력한다.
  2. $pool_5$의 경우 이미 class개수의 channel로 출력이 된 상태
  3. $pool_5$를 $pool_4$와 같은 사이즈로 Upsampling(Transposed Convolution)해준다.
  4. $pool_4$와 $pool_5$를 element-wise 방식으로 더해준다.(대응하는 픽셀끼리 더하기)
  5. (4)번의 결과를 Input 이미지와 같은 size로 Upsampling(Bilinear Interpolation)한다.
  6. (5)번의 결과의 각 픽셀별로 classification을 진행한다.(Softmax)


FCN-8s


아래 사진은 FCN-8s의 구조이다.

출처 : https://medium.com/@msmapark2


FCN-8s는 $pool_3$, $poo_4$, $pool_5$가 결합한 구조이다. FCN-16s와 과정은 동일하다.

  1. FCN-16s과정에서 4번까지 진행한다.($pool_4$와 $poo_5$가 class개수의 channel로 결합된 상태)
  2. 결합된 heat map을 $pool_3$와 같은 size로 Upsampling(Transposed Convolution)해준다.
  3. 216 channel인 $Pool_3$에 (1x1) Filter를 적용해 Class수의 channel을 가진 feature map을 출력한다.
  4. (1)번의 결과와 (3)번의 결과를 element-wise 방식으로 더해준다.(대응하는 픽셀끼리 더하기)
  5. (4)번의 결과를 Input 이미지와 같은 siae로 Upsampling(Bilinear Interpolation)한다.
  6. (5)번의 결과의 각 픽셀별로 classification을 진행한다.(Softmax)


FCN의 Skip Architecture구조는 단순히 Line Topology하게 설계되어 있는 모델에서 DAG(Directed Acyclic Graph) Topology구조로 변환해주는 역할을 한다. Down-sampling이 되는 과정에서 추출되는 appearance feature를 같이 적용함으로서 성능을 향상시킨 것이다.


결과


아래는 FCN-32s, FCN-16s, FCN-8s과 정답 Label을 비교한 사진이다. 확실히 pool의 출력값을 많이 사용한 FCN-8s의 성능이 가장 좋다.


아래는 다양한 구조의 성능비교를 수치화한 사진이다.



RGBD와 HHA의 경우 RGB이전에 사용하던 이미지 출력방식?을 이용한 방법이다. 결론은 FCN의 방식의 성능이 가장 좋다는 것이다. 또한 가장 강조하고 있는 사실은 FCN 방식 이전에 사용하던 Patch방식은 정확도도 좋지 않고 시간도 오래 걸린다는 것이다.


지금까지 FCN에 대해 알아보았다. 현재 발표되고 있는 여러 Segmentation 모델들은 대부분 FCN을 기초로 만들어지고 있다. 따라서 FCN논문에서 다뤄진 내용들은 매우 중요하다. Segmentation에 대해 전반적으로 알 수 있었기 때문에 매우 좋았다.


읽어주셔서 감사합니다.(댓글과 수정사항은 언제나 환영입니다!)