Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

ShuyaVision

[논문 리뷰] FCN ( Fully Convolutional Networks for Semantic Segmentation ) 본문

Vision AI

[논문 리뷰] FCN ( Fully Convolutional Networks for Semantic Segmentation )

Sangbro 2023. 4. 19. 00:35

 

Introduction

Conv Net은 classification 뿐만 아니라, object detection, part and key-point prediction, local correspondence 등에서 꾸준한 성과를 내고 있다. 더 세밀한 추론을 위해서, 모든 픽셀별로 예측을 수행하는 것이 Semantic Segmentation Task다.

이 논문에서는, 픽셀 단위의 예측을 위한 최초의 end-to-end 방식이자, 지도 사전 학습을 진행한다.
또한, 기존의 CNN을 활용한 모델들은 고정된 크기의 입력을 가지고 출력을 생성하는 모델이었지만, FCN에서는 임의 크기의 입력 이미지를 가지고 출력을 생성할 수 있다. 또한 upsampling Layer를 가지고 있기 때문에 출력을 입력과 동일한 크기로 설정할 수 있다. 따라서, 사전, 사후 처리가 필요 없다.
게다가, 픽셀 단위로 레이블이 지정된 이미지를 사용하여 end-to-end로 학습을 진행했기 때문에, 더 정확하고 자세한 객체 분할 결과를 얻을 수 있다.

Model

1. Fully Convolutional Network (Encoder)

FCN은 classification에서 검증 받았던, AlexNet/VGGNet/GoogLeNet 등을 이용했다. 이러한 model들은 classification을 위해서 마지막 Layer에 Fully Connected Layer를 활용한다. 그런데, FC Layer는 공간 정보를 소실하는 문제점이 있기 때문에 FCN에서는 1x1 convolution으로 이를 대체한다. Segmentation에서는 위치 정보를 아는 것이 필수적이기 때문이다.
또한 FC Layer가 없기 때문에 이미지의 크기가 구조적으로 고정될 필요가 없다.

추가적으로, 1x1 convolution으로 대체했기 때문에, patch wise 방식 + FC Layer와 비교했을 때 계산량도 현저히 줄어들 수 밖에 없다. (Patch wise를 활용하지 않아도 되기 때문 + FC Layer에 비해 1x1 conv는 연산량을 줄일 수 있음)
FCN에서는 이를 convolutionalization으로 표현했다.

위 그림은 AlexNet 뒷단에 위치한 FC Layer들을 1x1 convolution Layer로 바꾼 것을 도식화 한 그림이다.

 

2. Upsampling (Decoder)

 

이렇게 생긴 FCN 모델에서, 마지막 Layer를 기존 이미지와 동일한 크기로 맞추기 위해서는 줄어든 feature map을 upsampling을 해야한다.

가장 단순한 방법으로는 bilinear interpolation을 활용하면 되겠지만, end-to-end 학습 관점에서는 고정된 값을 활용하는 것이 아니라, 학습을 통해서 결정할 수 있는 값을 활용하는 것이 좋다. 이에, 논문에서는 backward convolution, 즉 deconvolution을 사용하며, deconvolution 의 필터의 계수는 학습을 통해 결정되게 했다.

그러나, 단순하게 마지막 Layer를 활용해 Upsampling 하는 것은 결과가 좋지 않았다고 한다. 왜냐하면 Layer가 깊어질 수록 feature의 정보가 손실될 수 있고, 추론적인 정보만 남기 대문이다. 따라서 논문에서는 pooling 과정을 덜 거친 fine layer의 feature map을 이용하는 skip architecture 방식을 이용했다.

 

FCN-16을 기준으로 설명하면, Pool 5를 통해 생성된 1x1 heatmap(최종 Layer)을 2배로 upscaling 한다. (2x upsampled prediction 좌측에서 첫번째)
Pool4로 생선된 2x2x512 feature map에서 1x1x512 conv filter를 사용해 2x2 짜리 prediction (pool4 prediction)을 생성한다.

이 두개를 element wise로 더해서 16x upsampled prediction을 생성한다.

16x upsampled prediction을 16배 up-sampling 하면 32x32 prediction이 생성된다.

 

FCN-8을 기준에서는 이전에 생성한 16x upsampled prediction,

그리고 pool3에 1x1x512 conv filter를 적용해 4x4 짜리 (pool3 prediction)을 생성한다.

이 두개를 element wise로 더한 다음, 8배로 up-sampling을 해서 32x32 prediction을 생성한다.

 

FCN-32s는 skip-architecture를 사용하지 않고 바로 32배 하여 사용하는 결과 값이라고 보면 된다.

 

FCN 32, 16, 8에 대한 결과값

 

 

전체 Architecture는 아래와 같다

 

 

 

 

추가..

FCN 논문 내에서 비교되는 두 가지 학습 방법론 ( FCN 이전에 많이 사용 )

1. Patchwise learning 방식 (3.4. Patchwise training is loss sampling)

    - 특정 w, h를 가진 patch 설정, CNN에 input으로 준다.

    - input을 classification을 한 후, patch 중앙에 위치한 pixel을 해당 class로 분류한다.

    - 이 과정을 sliding window 과정으로 계속 반복한다.

    Patchwise 방식은 너무 많은 계산량을 요구할 뿐만 아니라, patch를 추출하는 방식에 따라 overlap 되는 경우도 있고, 몇 가지 class가 함께 들어가는 경우도 있을 수 있기 때문에 정확도에도 문제가 생길 수 있다. 또한 class 중복을 피하고자 patch를 너무 작게 설정하면, 당연히 accuracy가 떨어질 가능성이 크다.

2. pixel wise 방식

    - 전체 이미지를 Pooling 과정 없이 Conv를 통해 feature를 추출한다.

    - 아래 그림에서 C x H x W에서 C가 원래 Channel 개수 인데 이를 class의 총 개수로 지정한다. 그러면 한 픽셀당 C개의 vector가 생성되고 이를 argmax 해서 어떤 class에 속하는 지 분류한다.
    Pixel wise 방식 또한 방대한 계산량을 가지게 되고, 또한 구조적인 feature를 뽑지 못하는 문제점을 가지게 된다. 기존에 성능이 잘 나왔었던 Classification, 즉 일반적인 CNN 구조에서는 깊은 Layer 구조를 활용하여 hierarchical feature를 학습한다. 하지만 아래 그림의 pixel wise 방식에서는 이러한 feature를 학습할 수 있는 구조가 아니라고 한다. (Local information 만 뽑기 때문에 semantic 한 정보가 없을 것으로 보임 )
논문 Abstract에 보면, semantic information을 deep, coarse layer에서 가져오고, appearance information을 shallow, fine layer에서 가져온다고 한다. 여기서 semantic information이란 의미론적 정보이고, appearance information은 외관, 즉 윤곽선을 뜻한다. Layer를 거칠 수록 우리가 눈으로 파악하기 어려운 추상적인 정보를 담게 된다. ( Layer를 거치면서 더 많은 receptive field와 함께 연산이 이루어지기 때문에 그렇지 않을까 싶다 )

 

Shift-and-stitch trick (3.2. Shift-and-stitch is filter rarefaction)

3.2 주제인데 FCN에서는 사용하지 않음. Skip-architecture가 더 좋았기 때문

OverFeat 논문에서 쓰였던 방법으로, coarse output 에서 dense prediction feature를 생성하기 위한 방법 중 하나이다. 일종의 Up-sampling 방법이라고 볼 수 있다.

5x5 이미지를 zero-padding을 한 다음에, 2x2 kernel을 통해 max pooling을 진행한다. 그리고 똑같은 5x5를 만들어 내기 위해 빨간색 이미지가 오른쪽으로 shift 하면서 연산한 것과 달리 노랑, 초록, 파랑은 다른 방향으로 shitft 해서 사용한다. 이를 통해 다른 결과를 이끌어 내고 이를 합친다.

(노란색은 3x2, 초록은 2x3, 파랑은 2x2) 이를 통해 5x5 output을 생성해내는 방법이다.

 

 

Interpolation 기법

bilinear interpolation

2 x upsampling을 할 때, 등차 수열을 활용해서 적용하는 방식

 

 

 

Deconvolution (Upsampling 기법)

해당 논문에서는 transpose convolution을 사용했다. ( 실제로는 Deconvolution 기법이 아니라고 한다)

padding = 0, stride = 1, 3x3 kernel을 4x4 input에 적용할 때 이를 그림으로 나타내면 아래와 같다.

3x3 kernel을 4x16으로 바꾸고, input을 16x1로 바꾸고, 2x2 output 또한 4x1로 바꾸어서 계산하면 동일한 결과 값을 얻을 수 있다.

 

4x1 짜리의 input 값과, Sparse Matrix Ct (Transposed Convolution Matrix)를 곱하면 16x1 짜리의 output 값을 얻을 수 있다. 이를 통해 2x2 짜리의 image를 4x4짜리 image로 upsampling 할 수 있다.

 

 

 

reference
Fully Convolutional Networks for Semantic Segmentation

https://m.blog.naver.com/laonple/220958109081

https://89douner.tistory.com/296