코딩하는 해맑은 거북이

[컴퓨터비전] Semantic Segmentation - FCN 본문

AI

[컴퓨터비전] Semantic Segmentation - FCN

#CJE 2023. 6. 13.
본 게시물의 내용은 '부스트캠프 AI Tech - Semantic Segmentation (김현우)' 강의를 듣고 작성하였다.
해당 글은 아래의 2가지를 다룬다.
📌 FCN (Fully Convolutional Networks)
📌 FCN 구조
  🔷 FCN-32s
  🔷 FCN-16s
  🔷 FCN-8s

📌 FCN (Fully Convolutional Networks)

 

1. VGG 네트워크 백본을 사용 (Backbone : feature extracting network) 

2. VGG 네트워크의 FC Layer (nn.Linear)를 Convolution 으로 대체

  • Convolution : 각 픽셀의 위치정보를 해치지 않은채로 특징 추출
  • FC Layer (Fully Connected Layer) : 각 픽셀의 위치정보를 해침

🔹1x1 Convolution을 사용할 경우, 임의의 입력값에 대해서도 상관 없는 이유
: Convolution은 kernel의 파라미터에 의해 영향을 받고, 이미지 혹은 레이어의 크기에 대해서는 상관없기 때문이다.

 

3. Transposed Convolution을 이용해서 Pixel Wise prediction을 수행

4x4 input을 3x3 kernel로 convolution 연산을 수행했을 때(padding:0, stride:1), 2x2 output이 나오게 된다. (DownSampling)

해당 DownSampling으로 작아진 크기의 Feature Map을 원본 입력 이미지와 동일한 크기로 변환하는 것이 Transpose Convolution 이다.

DownSampling

 

3x3 Transpose Convolution Stride=1로 수행하면 원본 이미지의 크기와 동일한 4x4 Output이 나오게 된다.

3x3 Transpose Convolution Stride=1

 

Stride=2를 주게되면 5x5 Output을 만들 수 있고, Padding=1을 주면 3x3 Output을 만들 수 있다.

3x3 Transpose Convolution Stride=2
3x3 Transpose Convolution Stride=1, padding=1

 

🔹Transpose Convolution 더 알아보기

4x4 input과 3x3 kernel의 convolution 연산은 아래 그림과 같이 표현할 수 있다. 이를 다시 Transpose Convolution 연산을 수행해보자.

\(C*{Input}={Output}\)

 

\(C^T*{Output}={Input?}\)

결과를 보면, 원본 4x4 Input과 Transpose Convolution 연산을 수행해서 나온 복원된 Input이 서로 동일하지 않은 것을 볼 수 있다. 즉, Transpose Convolution 연산은 Convolution 연산을 수행하기 전 Input을 그대로 복원하는 연산이 아니다.

Input의 크기만을 복원해주는 연산이라는 것을 알 수 있다.

 

🔹Transpose Convolution 정리

  • 중요한 점은 Convolution과 마찬가지로 학습이 가능한 파라미터를 통해서 줄어든 이미지를 다시 키우는 Convolution 연산이다.
  • 엄밀한 명칭은 Transposed Convolution이라고 부르는게 정확하지만, 많이들 Deconvolution이라는 용어와 같이 사용한다.

 

📌 FCN 구조

🔷 FCN-32s

5번의 Conv 연산을 거쳐 224x224 → 7x7 (224/32) 이 된다.

3번의 1x1 Conv 연산을 통해 각 픽셀별로 클래스에 해당할 Score 값을 계산하고, Deconv 연산을 통해 크기의 32배로 입력 이미지와 동일한 크기로 만들어준다. (32x upsampled)

 

Q. 여기서 문제점은?

Score Map을 32배로 바로 키워버리기 때문에, 세밀한 예측이 어려워진다.

그래서 더 세밀한 예측이 가능하도록 Score Map과 중간 단계의 Feature Map을 합쳐서 정보를 보강한 FCN-16s, FCN-8s가 등장했다.

FCN-16s / FCN-8s

 

🔷 FCN-16s

4번의 Conv 연산을 거친 14x14 Feature Map을 가지므로, 7x7 Score Map을 우선 2배만 키워주고 Element-wise로 더해준다. 이때 Feature Map은 Score Map과 Channel 수가 다르므로, 1x1 Conv 연산을 먼저 거쳐서 num_classes의 Channel을 가지도록 해준다.

더해진 14x14 Map을 Deconv 연산을 통해 크기를 16배로 늘려주어 입력 이미지와 동이한 크기로 만들어준다. (16x upsampled)

 

🔷 FCN-8s

FCN-8s는 3번의 Conv 연산을 거친 28x28 Feature Map도 이용하는 방법이다.

아래 그림을 보면, FCN-8s가 더욱 세밀한 예측을 하는 것을 볼 수 있다.

 

cf) 원본 FCN-32s

기존 논문에는 FC6 Layer는 7x7 Convolution을 사용했다.

이는 FC6 Layer의 Convolution을 지나면, 이미지의 크기가 1x1 으로 변동되는 문제 발생한다.

그래서 논문 저자는 해당 문제를 해결하기 위해 Conv1의 첫번째 conv에 zero padding 100을 적용하였지만 Output size돠 달라지는 문제가 발생한다.

그래서 Input size와 맞춰주기 위해 마지막에 추가로 Crop을 해주었다.

 

 

Comments