또르르's 개발 Story

[32-1] Semantic Segmentation 본문

부스트캠프 AI 테크 U stage/이론

[32-1] Semantic Segmentation

또르르21 2021. 3. 9. 22:52

1️⃣ Semantic segmentation에서 주의해야 할 점

 

Semantic segmentation은 같은 Class (ex. 사람)이지만 서로 다른 물체(ex. 사람1, 사람2, ...)를 구분하지는 않습니다.

같은 Class에서 서로 다른 물체를 구분하는 segmentation은 Instance segmentation입니다.

 

[Chen et al., arXiv 2017]

 

 

2️⃣ Fully Convolutional Networks (FCN)

 

Fully connected layer는 1 x 1 convolutions으로 해석과 구현이 가능합니다.

 

[Long et al., CVPR 2015]

 

따라서 FC(Fully Connected) layer를 FCN (Fully Convolutional Networks)으로 대체할 수 있습니다.

FCN은 어떤 입력사이즈에도 대응이 가능합니다.

 

하지만 FCN은 정보를 담게되는 최종 output의 해상도가 많이 낮아지기 때문에 Upsampling을 통해 해상도를 다시 높여야 합니다.

 

 


✅ Upsampling 종류

 

 

Upsampling의 방법에는 아래 두 가지 경우를 가장 많이 사용합니다.

 

  • Transposed convolution
  • Upsample and convolution

 

(1) Transposed convolution

 

아래 그림과 같이 a, b 입력이 주어졌을 때, Transposed convolution은 filter를 Scaling 한 것에 해당하는 출력 위치에 붙여 넣습니다.

a -> a*x, a*y, a*z

b -> b*x, b*y, b*z

 

여기서 az와 bx는 중첩되는데 중첩되는 부분은 덧셈(+)이 일어나게 됩니다.

중첩된 부분만 계속해서 덧셈이 일어나게 됩니다.

https://www.edwith.org/bcaitech1

 

따라서 중첩이 한 부분만 계속 일어나는 현상을 막기 위해 Upsampling과 Convolution을 같이 이용하는 것입니다.

Transposed는 일부분만 중첩이 일어나게 되는 문제가 생겼다면,

 

https://distill.pub/2016/deconv-checkerboard/

 

Upsampling은 중첩 문제를 없애고 골고루 영향을 받게 만듭니다.

그래서 Transposed convolution은 학습 가능한 upsampling을 하나의 layer로 한 번에 처리한 것으로 볼 수 있습니다.

 

 

(2) Upsample and convolution

 

Upsampling convolution의 경우는 upsampling operation을 두 개로 분리한 것입니다.

 

  • Nearest-neighbor(NN)-resize convolution
  • Bilinear-resize convolution

https://distill.pub/2016/deconv-checkerboard/

 

PyTorch에서는 Transposed Convolution을 아래 그림과 같이 사용할 수 있습니다.

kernel_size = 2, stride=2이기 때문에 한 칸씩 뛰면서 두 칸씩 채워 넣는 형태로 Upsampling을 수행합니다.

이렇게 하면 중첩된 부분이 생기지 않습니다.

 


 

따라서 FCN으로 다시 돌아오면,

아래 사진에서 FCN의 낮은 layer부분 (왼쪽)은 receptive field size가 작기 때문에 굉장히 국지적이고, 작은 detail에 민감한 경향이 있습니다.

상위 layer부분 (오른쪽)에서는 해상도는 낮아지지만, 큰 receptive field를 가지고 영상에서 전반적이고 의미가 있는 정보를 포함하는 경향이 있습니다.

 

[Long et al., CVPR 2015]

 

따라서 이 두 특징을 모두 확보하기 위해서 다음과 같이 fusion을 합니다.

높은 layer에 있던 activation map을 upsampling을 통해서 해상도를 크게 올리고, 

중간층 layer에 있던 activation map을 upsampling을 한 후 computation 해서 최종 출력을 만들게 됩니다.

 

 

아래 사진과 같이 FCN-32s, FCN-16s, FCN-8s는 모두 다른 모델이고, 

pool4에서만 정보를 가지고 만든 모델을 FCN-16s라고 합니다.

pool3, pool4, conv7 정보를 가지고 만든 모델은 FCN-8s라고 부릅니다. (가장 많은 activation map을 사용)

 

[Long et al., CVPR 2015]

 

중간 과정의 layer를 가져다 쓰는 이유는 중간 과정의 layer들을 많이 합칠수록 더 확실한 segmentation이 나오게 됩니다. 아래 그림과 같이 중간 과정이 가장 많이 합쳐진 FCN-8s에서 가장 정답과 유사한 형태를 보이고 있습니다.

 

[Long et al., CVPR 2015]

 

 

3️⃣ U-Net

 

다양한 Semantic segmentation의 기원이라고 부를 수 있는 network입니다.

 

U-net의 architecture는 다음과 같습니다.

 

[Ronneberger et al., MICCAI 2015]

 

Contracting path는 다음과 같습니다.

Contracting path 부분은 입력영상을 받고, Pooling을 통해서 receptive field를 확보합니다.

이때, receptive field를 크게 확보하기 위해서 해상도를 낮추고, channel 수를 높입니다.

 

[Ronneberger et al., MICCAI 2015]

 

달라지는 부분은 Decoder라고 부르는 Expanding Path 부분입니다.

한 번에 upsampling 하는 대신에 단계별로 activation map의 해상도와 channel size를 올려줍니다.

 

이때 activation map의 해상도와 channel size는 Contracting path에서 오는 대칭으로 대응되는 layer와 동일하게 맞춰서 낮은 layer 층에 있었던 activation map을 합쳐서 사용할 수 있도록 만들어줍니다.

즉, 해상도를 점진적으로 늘리면서 대칭되는 특징들을 skip connection을 통해서 가져와서 fusion을 합니다(여기서 fusion은 concat을 의미).

 

Expanding Path 부분에서는 channel size가 점점 줄어들게 되지만, 해상도는 점점 늘어나는 구조를 가지고 있습니다.

 

[Ronneberger et al., MICCAI 2015]

 

그래서 낮은 layer에서 전달된 feature들이 높은 layer들에게 localized information을 주게 됩니다.

즉, 낮은 layer에서의 feature들은 공간적으로 높은 해상도와 약간 바뀌는 것으로 민간함 정보를 제공하기 때문에 경계선이나 공간적으로 중요한 정보들을 뒤쪽 layer에 바로 전달하는 중요한 역할을 합니다.

 

 

U-Net에서 주의해야 할 점은 홀수 해상도 map이 나오면 안 된다는 점입니다.

 

7 x 7 feature map을 DownSampling 하면 3 x 3 feature map으로 만들어지는데

3 x 3 feature map을 다시 Upsampling 하게 되면 6 x 6 feature map으로 만들어지게 됩니다.

그렇게 되면 원래 해상도 크기와 차이가 나게 됩니다.

 

 

Ronneberger et al., MICCAI 2015]

 

4️⃣ DeepLab

 

DeepLab에서는 두 가지의 중요한 개념이 있습니다.

 

  • CRF : Conditional Random field

    pixel과 pixel 사이의 관계를 이어주고, Regular 한 grid를 그래프로 보는 것

    경계를 잘 찾을 수 있도록 modeling

    DCNN을 거친 output image에서 Input image의 경계선을 활용해서 경계에 잘 들어맞도록 확산을 시켜주는 방법

[Chen et al., ICLR 2015]

 

  • Dilated Convolution (Atrous Convolution)

    convolution kernel 사이에 Dilation factor만큼 일정 공간을 넣어주는 방법입니다.

    Weight 사이를 dilation factor만큼 띄어서 실제 kernel보다 더 넓은 영역을 고려할 수 있게 만듦

    다만, parameter 수는 늘어나지 않습니다.

Convolution Kernel
Dilation factor만큼의 Convolution Kernel

 

DeepLab의 Convolution의 연산 양의 어마어마하기 때문에 DeepLab은 Depthwise separable convolution을 통해 연산수를 줄입니다. ($D_{K} / D_{F}$ : Kernel / feature map size, $M/N$ : input / output channels)

 

 

http://machinethink.net/blog/googles-mobile-net-architecture-on-iphone/]

 

Depthwise separable convolutionDepthwise Convolution과 PointWise Convolution 두 과정으로 나뉩니다.

 

(1) Depthwise Convolution은 channel 별로 convolution을 해서 각각 값을 뽑습니다.

 

(2) PointWise Convolution은 1 x 1 convolution을 통해서 하나의 값의 출력이 되도록 만듭니다.

 

http://machinethink.net/blog/googles-mobile-net-architecture-on-iphone/]

 

이렇게 나누게 되면 Convolution의 표현력도 어느 정도 유지가 되면서 계산량도 획기적으로 줄어들게 됩니다.

 

 

Deeplab v3+의 architecture는 다음과 같습니다.

 

[Chen et al. , ECCV 2018]

 

'부스트캠프 AI 테크 U stage > 이론' 카테고리의 다른 글

[33-1] CNN visualization  (0) 2021.03.10
[33] Object detection  (0) 2021.03.10
[32] Image Classification (2)  (0) 2021.03.09
[31-1] Annotation data efficient learning  (0) 2021.03.08
[31] Image Classification (1)  (0) 2021.03.08
Comments