FCN은 Semantic Segmentation task를 수행하기 위해 기본 Image Classification 분야에서 우수한 성능을 보인 모델들(AlexNet, VGG16, GoogLeNet)을 변형시킨 모델입니다. 구체적으로, Image Classification 모델을 먼저 학습시킨 후 모델을 튜닝해 학습하는 전이 학습이 이루어집니다. (본 포스팅에서는 VGGnet 등의 기존 모델 구조에 대해서는 이야기하지 않도록 하겠습니다)
위에서 언급한 '변형'은 모델의 마지막 부분에서 이루어집니다. 기존에는 FC layer를 통해 각 클래스에 속할 확률을 내보냈지만, FCN에는 이 FC layer들을 모두 convolution layer로 변경하였습니다. 그 이유는 다음과 같은데요,
1) 이미지의 위치 정보가 사라진다
2) input image의 size가 고정된다.
image classification에서는 위치 정보가 중요하지 않습니다. 하지만 semantic segmentation에서는 각 픽셀이 어느 클래스에 속하는지를 모두 구분해 주어야 하기 때문에, 인접한 픽셀끼리는 같은 클래스에 속할 확률이 높습니다. FC layer는 이미지의 위치 정보를 모두 없애니 위치 정보를 보존할 수 있는 convolution layer로 바꾸어 주었습니다. 변경된 구조를 아래 그림에서도 확인할 수 있습니다.
이 과정을 통해 '위치 정보를 가지는 fature map'을 가질 수 있게 되었습니다. 여기서 문제점 한 가지가 발생하는데요, 바로 feature map의 크기가 원본 이미지보다 훨씬 작다는 것입니다. VGG16에서는 224 * 224 크기의 이미지가 7 * 7까지 작아지게 됩니다. 크기를 계속 224 * 224로 유지하면 이러한 문제가 발생하지 않겠지만, 그렇게 되면 계산량이 매우 늘어나게 됩니다. 따라서 어느 정도 위치 정보의 손실은 발생할 수밖에 없으며, 작아진 feature map을 원래 크기로 복구해야 합니다.
이 과정에서 upsampling이 사용되는데요, upsampling에서는 Transposed Convolution과 interpolation 방식을 활용합니다.
1) interpolation
interpolation(보간법)은 빈 영역의 추정을 우리가 중등교육에서 배운 내분점 개념을 활용하여 추정하는 것입니다.
2) Transposed Convolution
interpolation은 수식이 정해져 있지만, convolution처럼 학습이 가능한 upsampling도 존재합니다. 아래 그림에 Transposed convolution의 특징이 잘 나타나 있습니다.
이와 같은 방법을 통해 크기를 늘릴 수 있었지만, 기본적으로 7 * 7 크기의 feature map에서 224 * 224 까지 upsampling을 수행해야 하기 때문에 매우 추상적으로만 예측이 가능합니다. 아래 두 그림에서, 오른쪽 정답과 32배로 upsampling된 왼쪽 그림을 비교해 보면 이 사실을 바로 알 수 있습니다.
이를 해결하기 위해 논문에서는 skip architecture를 제안합니다.
위 그림을 보시면 input과 가까운 layer에서는 윤곽 같은 정보를 자세히 담고 있는 반면, 출력층과 가까운 layer에서는 보다 추상적인 정보를 담고 있습니다. skip architecture의 핵심은 마지막 layer만 사용하는 것이 아니라, 더 세부적인 정보가 잘 남아있는 이전 layer의 정보 역시 활용하여 upsampling을 시도하는 것입니다.
위 그림을 확인하면, 마지막 layer의 정보만 이용하는 것이 아니라, 그 이전의 layer도 함께 사용하는 것을 확인할 수 있습니다. vggnet에서는 feature map의 크기가 계속해서 가로세로 두 배씩 작아집니다.
FCN-16의 경우는 다음의 방식으로 이루어집니다. 마지막 layer를 2배 upsampling하면 이전 layer와 크기가 같아지게 됩니다. 이 upsampled layer를 이전 layer와 더해 준 후, 한 번에 16배 upsampling을 수행하게 됩니다.
FCN-8은 FCN-16에서 한 단계 더 나아간 방식인데, 똑같은 방식으로 2층 앞의 layer도 사용해 한 번에 8배 upsampling을 수행하게 됩니다.
이러한 시도는 분명히 효과가 있었습니다. 아래 결과를 보시면 FCN 32, FCN 16, FCN 8 순으로 성능이 지속적으로 높아지는 것을 확인할 수 있습니다.
성능 지표에서도 마찬가지로 FCN-8에서 성능이 가장 좋음을 확인할 수 있습니다.
댓글 영역