이번에 읽고 리뷰해볼 논문은 Image Segmentation 분야의 FCN(2014) 논문입니다.
정리된 내용 중 부정확하거나 내용과 다른 부분에 대해선 언제든 피드백 부탁드립니다.
Abstact
본 논문에선 Semantic Segmentation에서 큰 발전을 이룬 FCN에 대해 다뤄보고자 합니다.
FCN은 Fully Convolutional Network의 줄임말로, Fully Convolutional이란 핵심 키워드를 중심으로 합니다.
Fully Convolutional이란, Network의 모든 Layer가 Convolution으로 이루어진 구조를 의미합니다.
기존의 Fully Connected를 Convolution으로 변경했을 때, 어떠한 이득을 취할 수 있을까요?
파라미터 수의 감소로 학습/추론 속도의 개선 그리고 Spatial Information의 손실을 방지할 수 있습니다.
또한 고정된 크기로 정의된 Fully Connected Layer가 없으니, 어떠한 크기의 입력도 받아들일 수 있게됩니다.
이러한 Fully Convolutional 구조와 함께 FCN에선 성능 개선을 위한 추가적인 구조 또한 제안합니다.
해당 구조는 위에서부터 아래로 동작하는 일반적인 구조와 다르게, 이전의 출력을 결합하도록 설계됩니다.
결과적으로 Segmentation 성능을 20% 가량 개선할 수 있었고, 추론 속도 또한 200ms 이하가 소요됩니다.
어떠한 구조를 제안했기에, 이정도의 추론 속도 및 성능 개선이 있을 수 있었을까요?
다음 파트에서부턴, Abstract에서 다룬 여러 내용들을 조금 자세하게 풀어보도록 하겠습니다.
Introduction
AlexNet을 시작으로, Convolution Network를 통해 아래 분야 등에서 여러 성공이 확인되었습니다.
다만 FCN이 등장하기 전 시점을 기준으로 아직까지 Segmentation 과제에서 ConvNet은 입증되지 않았습니다.
물론 Semantic Segmentation 분야에서 FCN 이전에 ConvNet을 사용한 연구는 있을 수 있습니다.
그렇지만 end-to-end이면서, pixel-wise prediction을 적용한 경우는 FCN에서 처음 제안되었습니다.
FCN에선 ConvNet의 Dense Output에 대해 Up-Sampling을 통해 입력과 같은 크기가 되도록 복원하게 됩니다.
이는 Ground-Truth Mask와 Prediction의 직접적인 비교를 가능하게 하여 매우 효율적이라 할 수 있습니다.
이러한 구조적 이점과 함께 FCN에선 기존 SOTA 성능의 ConvNet을 Backbone으로 재해석하여 사용하게 됩니다.
이는 VGG 등을 활용한 Transfer learning 및 Fine tuning을 의미하며, RCNN에서 증명된 성능 개선 방법입니다.
큰 규모의 데이터로 학습된 신경망을 기반으로, 새로운 신경망을 학습했을 때의 어드밴티지를 의미합니다.
앞서 제안된 추가적인 구조는 부족한 정보를 보완하기 위한 구조로 Skip Architecture라고 정의하였습니다.
이는 깊고 얕은 구조를 연결하며, 이를 통해 Local & Global Information을 함께 얻을 수 있게됩니다.
Abstract에서 확인했다시피, 이러한 구조를 통한 성능 개선은 엄청남을 알 수 있습니다!
다음 파트에서부턴 본격적으로 FCN에서 제안하는 내용들에 대해 알아보겠습니다.
Fully Convolutional Network ?
먼저, Fully Connected Layer를 포함하고 있는 일반적인 CNN 구조를 확인해보겠습니다.

우리가 잘 알다시피, Conv Layer를 통해 특징을 추출하고 이를 1차원으로 펴서 활용하는 구조를 갖고 있습니다.
이러한 전통적인 구조는 학습이 불가능하거나 엉터리 모델을 만들진 않지만, 문제가 하나 존재합니다.
바로 영상에서 특징을 추출하는 동안 잘 유지하던 공간 정보를 잃어버리는 것입니다.
Segmentation Task에선 픽셀 마다의 주변 공간 정보가 매우 중요한데, 이를 잃는 것은 매우 치명적입니다.
또한 Fully Connected Layer의 선언 당시 Size에 맞추어, 입력 또한 고정되게 됩니다.
이뿐만 아니라 Layer 자체의 파라미터가 많기 때문에, 학습 및 추론 속도 또한 매우 느리고 무겁습니다.
저자는 이런 단점들을 개선하기 위한 방법으로 Convolutionalization을 제안했습니다.
이는 Network에 존재하는 Fully Connected Layer를 모두 Convolution으로 변경하는 방법을 의미합니다.

Convolutionalization을 통해 도출된 출력은 어떤 형태로 어떤 정보를 갖게될까요?
기존 FC Layer가 포함된 Network에선 분류 혹은 회귀에 맞추어 N개의 클래스에 대한 확률 혹은 값을 도출했습니다.
위 이미지의 tabby cat 분포와 같이, 확률에 대한 정보만을 나타내었습니다.
그렇다면 Convolutionalized Network의 출력은?
해상도가 유지된채로 N개의 클래스에 대한 확률을 갖게 될 것이고, 특정 위치의 N번째 맵이 크게 활성화될 것입니다.

위 이미지를 기반으로 예시를 하나 들어보겠습니다.
100개의 클래스에서 10번째가 고양이 클래스라면 N * N의 맵에서 10번째 맵의 고양이 위치가 크게 활성화됩니다.
만약 72번째 클래스가 강아지 클래스라면 N * N의 맵에서 72번째 맵의 강아지 위치가 크게 활성화되게 됩니다.
이처럼 FC Layer가 아닌 Conv Layer를 통해 공간 정보를 유지하는 것이 Segmentation의 핵심입니다.
이렇게 보면, 저자들이 어째서 Conv Layer를 사용할 수 밖에 없었는지 이해할 수 밖에 없을 것 같습니다.
다음 파트에선 줄어든 해상도의 특징맵을 원본 해상도만큼 복원하는 Up-Sampling에 대해 다뤄보겠습니다.
Shift and Stitch or Up-sampling (backwards strided convolution)
Up-Sampling 단계는 저자가 설명하는 End-to-End, Pixel-Wise Training을 위한 필수 과정입니다.
우리가 잘 알고있는 분류를 위한 ConvNet의 경우, 입력의 해상도를 줄여나가며 특징을 추출합니다.
이런 과정에서 특징맵은 채널축으로는 깊어지지만, 입력에 비해 해상도가 크게 줄어들게 됩니다.
Segmentation Task는 입력의 해상도와 동일한 Output Mask를 예측하여 각 픽셀마다 분류를 수행하고자 합니다.
이후 분류된 픽셀마다 실제 정답인 Ground Truth와의 1:1 비교를 통해 분류 성능을 나타냅니다.

따라서 1:1 비교를 위해선 입력과 출력을 동일하게 맞추는 과정이 필요하며, 이를 Up-Sampling이라 합니다.
이러한 Up-Sampling은 단순 Interpolation부터 Trainable Layer를 활용하는 방법까지 다양합니다.
FCN의 논문에선 단순 Interpolation, Shift and Stitch 그리고 Trainable Layer까지 모두 소개합니다.

대표적으로 사용되는 Interpolation이란 보간법으로, 데이터를 압축하거나 팽창시키는 과정에서 활용됩니다.
적은 정보로 값을 근사하거나 줄여주는 과정에서 효과적이고 타당한 결과를 내기 위해 사용됩니다.

다만 이러한 Interpolation만을 출력에 대해 곧바로 적용했을 땐, 낮은 품질의 Mask Result가 생성됩니다.
적은 수의 정보만으로 디테일한 경계 부분을 묘사하기 부족하기 때문입니다. (FCN-32s Mask 예시)
그렇기에 Segmentation Task에선 결과의 품질 개선을 위한 방법으로 Shift and Stitch 방법을 활용하곤 합니다.
논문에서도 설명되며, 과거 Segmentation Task에서 자주 활용된 Shift and Stitch 방법은 어떻게 동작할까요?

해당 방법은 Shift와 Stitch로 나뉘어지며, 원본 데이터와 이를 Shift 한 데이터를 기반으로 Stitch를 진행합니다.
Stitch는 Shifted 데이터에 Pooling을 적용한 뒤, 이를 잘 엮어서 새로운 특징맵을 만드는 방법입니다.
그렇기에 사실 Up-Sampling은 아니지만 Interpolation 이전의 결과 개선을 위한 과정이라 할 수 있습니다.
과거 Segmentation Task에선 이러한 방법이 종종 활용된 것으로 보여집니다.
다만 FCN의 저자는 이러한 방법 대신, 효과적인 Up-Sampling에 대한 새로운 방법을 제안하고 증명했습니다.
저자들은 Interpolation을 통한 Up-Sampling을 Backwards Strided Convolution으로 볼 수 있다 설명했습니다.
이는 Conv Layer 동작되는 방식을 반대로 수행하는 것이, Up-Sampling과 같다고 설명했습니다.

다만 일반적인 Up-Sampling과는 다르게, 이러한 방법이 학습 가능한 Up-Sampling 방법이라는 것입니다.
현재의 특징맵에 대해 최적의 상태로 해상도를 복원할 수 있는 파라미터를 찾게되는 것입니다.
이 방법이 우리에게 잘 알려진 Transposed Convolution Layer이며, 현재까지도 핵심적으로 활용되고 있습니다.
이를 통해 저자들은 Shift and Stitch, 단순 Interpolation 기반의 Up-Sampling을 하지 않아도 된다고 설명합니다.
저자가 제안한 방법엔 Transposed 이외에도 Segmentation 성능 개선을 위한 추가적인 핵심 제안이 존재합니다.
다음 파트에선 추가 제안과 함께 FCN의 전반적인 구조에 대해 다뤄보도록 하겠습니다.
Segmentation architecture
FCN은 특징 추출을 위한 Convolution Network, Up-Sampling을 위한 Transposed Conv로 구성됩니다.
먼저 ConvNet은 기존 Classification Task에서 SOTA의 성능을 도출한 Network를 가져와 재구성합니다.
그렇기에 FCN에선 AlexNet, VGG16, GoogLeNet 3가지 Network를 Backbone으로 구성하여 비교했습니다.

각 Backbone들은 Classifier를 포함한 FC Layer를 제거한 뒤, Classifer 개념인 1x1 Conv Layer를 추가합니다.
이는 잘 알려진 Transfer Learning과 같이, Segmentation Task에 맞는 출력을 내기 위함입니다.
논문에서의 Backbone으론 위 표를 기준으로 가장 성능이 좋은 VGG16을 선택합니다.
이 때의 성능은 Classifer에서 도출된 결과물을 곧바로 원본 해상도로 복구했을 때의 성능을 기준으로 합니다.
이러한 구조는 특징맵을 32배 Up-Sampling 한다는 의미에서, FCN-32라고 합니다.
앞선 내용에서 FCN-16, FCN-8 구조의 Seg 결과를 도출하기 위한 추가적인 개선이 존재한다고 설명드렸었습니다.
해당 방식은 Network의 얕은 지역과 깊은 지역을 연결하는 새로운 연결 구조를 의미합니다.
이는 아래 FCN-32부터 FCN-8까지의 Network 구조를 설명하는 그림에서 확인하실 수 있습니다.

VGG의 Pooling Layer에서 나온 출력물을 Transposed Conv를 통해 Up-Sampling을 수행합니다.
이후 2배 증가된 해상도의 출력과, VGG의 이전 출력물을 결합하는 방식으로 특징맵의 정보를 보완해나갑니다.
이렇게 Network의 얕은 정보(큰 해상도)와 깊은 정보(작은 해상도)의 정보 결합은 어떤 의미일까요?
Pool3, Pool4에서 도출된 정보들은 Pool5에 비해 이 객체가 무엇인지에 대한 풍부한 의미 정보는 없지만,
큰 해상도로 인해 입력 이미지 내에서 객체의 위치 및 공간에 대한 정보는 더욱 잘 포함하고 있습니다.
Segmentation Task의 특성 상, 객체의 위치 및 공간 정보는 매우 중요하게 작용합니다.
다만 특징을 추출하는 과정에서 입력 해상도가 크게 줄어들기에, 하위 계층에선 이 정보를 보존하기 매우 어렵습니다.
이를 잘 보존하는 것이 성능을 개선하기 위한 핵심이라고 할 수 있습니다.
저자는 정보 보존 대신, 보존된 정보를 활용하는 방법으로 Prediction 과정에서 이전 정보를 추가 결합해주었습니다.
이러한 결합 방법을 Skip Connection이라고 설명하며, 이것이 FCN의 성능 개선을 위한 핵심이라고 할 수 있습니다.
결과적으로 Skip Connection을 통해 낮은 해상도의 특징이 갖는 객체의 경계 부분 디테일을 보완할 수 있었습니다.
다음 파트에선 Skip Connection을 활용한 연구 결과 및 결론에 대해 확인해보겠습니다.
Results and Conclusion
Segmentation Task에서 정량적인 성능을 측정하는 대표적인 방법으로 IoU Metric을 주로 사용합니다.

IoU Metric은 실제 정답 Mask와 예측 Mask 사이에서, 각 Mask가 서로 얼마나 잘 겹쳐있는지를 평가하게됩니다.
두 Mask의 교집합 영역을 합집합 영역으로 나누어서, 0~1 사이의 겹친 비율을 알아내어 평가합니다.
또한 IoU와 같은 개념으로 자주 사용되는 mIoU는 각 클래스에 대한 IoU를 평균내어 계산하는 것을 의미합니다.
마치 mAP와 같은 개념으로, 전체 클래스에 대한 성능을 측정하기 위해 사용됩니다.

이러한 지표를 바탕으로, 이전 연구들과의 성능 비교를 진행했을 때의 결과는 위와 같습니다.
많은 파라미터를 보유한 VGG16을 Backbone으로 활용했음에도, Fully Convolutional Network가 갖는
End-to-End 구조와 여러 장점으로 인해 Inference Time이 크게 감소된 것을 확인할 수 있습니다.
또한 이전의 여러 연구와 비교를 진행했을 때, 전반적인 성능 또한 크게 개선된 것을 확인할 수 있습니다.
보통 새로운 연구라고 한다면, Trade-off 관계로 어떤 것이 증가한 대신 다른 부분이 부족해지는 경우가 있지만,
FCN의 경우 Segmentation Task에 대한 새로운 비전을 제시할 수 있을만큼 큰 개선을 보여주었습니다.

또한 앞선 내용처럼, 전반적인 예측 성능 및 객체의 경계 부분에 대해서도 큰 개선이 있음을 확인할 수 있습니다.
FCN에서 제안된 여러 연구 내용들은 향후 Segmentation Task에서 가이드라인처럼 활용될 수 있을 것 같습니다.
FCN 이후의 U-Net, DeepLab 등에선 어떤 식으로 발전되었을지 추후 하나하나 리뷰해보도록 하겠습니다.
오래 전 읽었던 논문을 다시 정리하려니, 도저히 다시 안보고는 상세 내용이 잘 안떠올랐습니다 ..
금방 정리하려고 한 내용인데도 많은 시간이 필요했습니다 .. 항상 미리미리 정리하는 습관은 늘 중요한 것 같습니다.
긴 글 읽어주셔서 감사합니다.