코딩하는 해맑은 거북이

[컴퓨터비전] Semantic Segmentation 본문

AI

[컴퓨터비전] Semantic Segmentation

#CJE 2023. 3. 29.
본 게시물의 내용은 '부스트캠프 AI Tech - CV (오태현)' 강의를 듣고 작성하였다.
해당 글은 아래의 내용을 다룬다.
📌 Semantic segmentation
   🔷 Fully Convolutional Networks (FCN)
   🔷 Hypercolumns for object segmentation
   🔷 U-Net
   🔷 DeepLab

 

📌 Semantic segmentation

영상의 픽셀 단위로 구분하는 문제이다.

영상 속에 object의 마스크를 생성한다. 단, 같은 클래스에 포함되지만 다른 물체는 구분하지 않는다.

 

🔷 Fully Convolutional Networks (FCN)

입력에서부터 출력까지 모두 미분가능한 뉴럴네크워크 형태(end-to-end)로 구성되어 학습을 통해서 target task를 해결할 수 있는 구조

임의의 해상도의 영상을 입력으로 주어질 수 있고,

출력도 입력 해상도에 맞춰서 segmentation map이 나온다(Upsampling).

* end-to-end : 입력부터 출력까지의 전체 프로세스를 하나의 신경망 구조로 구성하는 것. 즉, 입력부터 출력까지 모든 단계를 한번에 처리하는 방식을 의미한다.

 

cf) Fully Connected Layer vs Fully Convolutional Layer

Fully Connected Layer : 공간정보를 고려하지 않고, 고정된 차원의 벡터가 출력된다.

Fully Convolutional Layer : spatial coordinates를 유지한 채 classification map이 출력된다. 보통 1x1 convolution으로 구현된다.

 

 

공간정보를 고려하기 위해 각 위치마다 채널축으로 flatten을 하고, 나온 각각의 벡터에 대해서 Fully-Connected를 시행한다.

1x1 Convolution을 통해서 필터의 갯수 m만큼 내적을 해서 계산한다. 이를 통해 공간정보가 유지된다.

 

결론 : Fully-Connected Layer는 1x1 convolution으로 해석과 구현이 가능하므로 Fully-Connected Layer를 convolution Layer로 대체함으로써 어떤 입력 사이즈에도 대응가능한 Fully Convolutional Networks를 만들 수 있다

 

 

Fully Convolutional Networks를 sementic segmentation으로 만들어서 사용하면 굉장히 작은 score map을 얻게된다.

→ receptive field를 크게 만들기 위해 사용하는 stride나 pooling layer로 인해서 최종 activation map의 해상도는 굉장히 저해상도(low-resolution)가 된다. 이러한 저해상도를 해결하기 위한 방법으로 Upsampling이 도입된다.

 

Q. 고해상도 출력을 만들기 위해 stride나 pooling layer를 제거하면 되지않을까?

stride나 pooling layer를 제거하게 되면 고해상도 activation map을 유지할 수 있게 되지만, 똑같은 layer의 갯수를 사용했을 때 receptive field의 사이즈가 굉장히 작기 때문에 영상의 전반적인 내용을 파악하지 못하게 된다. 그래서 일단은 activation map을 굉장히 작게 만들어서 receptive field의 사이즈를 최대한 크게 만드는 것이 성능에 좋고, 그 후에 Upsampling을 통해서 강제로 해상도(resolution)을 맞춰주는 접근을 하게되었다.

 

- Upsampling : 저해상도를 해결하기 위한 방법.

Fully Convolutional Networks에서는 작은 activation map을 원래 입력의 해상도(resolution)로 늘려주는 것이다.

 

- Transpose convolution & Upsample and convolution : Upsampling의 대표적인 방법

예시로 a, b의 2개의 input이 주어졌을 때, filter를 scaling한 것을 해당하는 ouput에 붙여주는데 이를 Transpose convolution이라 한다. 중첩되는 부분에서는 더하기가 일어난다.

주의할점은 일정부분으로만 중첩(overlap)되어 더해져서 Checkboard artifacts 현상이 발생한다.

그러므로 Transpose convolution을 사용할 때, convolution filter의 크기와 stride size를 잘 조정해서 중첩이 생기지 않도록 tuning을 해주어야 한다.

또한, 이러한 overlap 현상을 막기위한 대안으로 Upsampling과 Convolution을 같이 이용하는 방법이 있다.

Upsampling과 Convolution을 같이 이용하는 방법으로 Nearest-Neighbor(NN) Interpolation, Bilinear Interpolation이 있다.

Transpose convolution

 

Transpose convolution & Upsample and convolution

 

 

- FCN에서 낮은 레이어와 높은 레이어의 특징

upsampling을 해도 해상도가 이미 줄어진 상태에서 잃어버린 정보를 다시 살리는 것은 쉽지않다.

낮은 레이어 쪽에서는 작은 receptive field를 가지기 때문에 Fine / Low-level / Detail / Local 한 특징이 있다.

(국취적이고 디테일한 부분을 보고, 작은 차이에도 굉장히 민감함)

높은 레이어 쪽에는 해상도가 많이 낮아지지만, 큰 receptive field를 가지기 때문에 Coarse / Semantic / Holistic / Global 한 특징이 있다. (영상에서 전반적이고 의미론적인 정보를 많이 포함한다)

 

 

Semantic Segmentation에서는 낮은 레이어와 높은 레이어 둘다 필요하다

각 픽셀별로 의미를 파악해야하고, 영상 전체를 바라보면서 하나의 픽셀이 물체의 경계선 안밖 중 어디에 포함되는지 파악해야한다. 즉, 경계부분을 디테일하게 파악해야한다.

 

- 낮은 레이어와 높은 레이어의 각각의 특징을 모두 확보하는 방법

높은 레이어에 있는 activation map을 Upsampling해서 가져온 것과

중간층 레이어에 있는 activation map을 Upsampling을 해서 가져오고, 이들을 concatenation을 해서 최종 출력을 만든다.

여러 중간층 레이어에서 나온 값들을 합쳐서 만든 것이 가장 좋은 성능을 보인다.

 

- FCN의 특징

  • Faster
    • end-to-end architecture로 nerual network layer로 구성되어 있어 GPU로 병렬처리 가능해서 빠르다
  • Accurate
    • segmentation task와 적합하고, low-level feature와 high-level feature 를 모두 고려해서 좋은 성능을 보인다.

 

 

🔷 Hypercolumns for object segmentation

FCN과 유사한데, Hypercolumn은 낮은 레이어와 높은 레이어의 feature을 해상도를 맞춰서 융합해서 쓰는 것이 가장 강조되었다.

 

- Overall architecture

end-to-end 방식이 아니고, 다른 알고리즘을 활용해서 나온 bounding-box를 추출한 뒤에 적용하는 모델로 소개되었다.

 

 

🔷 U-Net

입력영상과 비슷한 사이즈를 가지는 출력모델, Object Detection, Segmentation 등 영상의 일부분을 자세하게 봐야하는 기술들은 U-Net의 기원이 있는 경우가 많다.

 

- U-Net의 특징

  • Fully Convolutional networks
  • skip connection을 통해서 low-level feature와 high-level feature를 더 잘 결합하는 방식을 제시함
    • 그래서 FCN보다 더 정교한 segmentation 결과가 나온다

 

- Overall architecture

U자 모양처럼 그려둬서 U-Net이 되었음.

  • Contracting Path : pooling을 통해 receptive field를 크게 확보하기 위해 해상도를 낮추고 채널수를 늘린다
    • Repeatedly applying 3x3 convolutions
    • Doubling the number of feature channels
    • Being used to capture holistic context
  • Expanding Path : 단계별로 activation map의 해상도와 채널수를 contracting path와 대칭으로 대응되게 맞춘다  
    • Repeatedly applying 2x2 convolutions
    • Halving the number of feature channels
    • Concatenating the corresponding feature maps from the contracting path

→ Contracting Path에서 해상도를 절반씩 줄이고, Expanding Path에서 해상도를 두배씩 늘려준다.

 Contracting Path에서 채널은 두배씩 늘리고, Expanding Path에서 채널은 절반씩 줄여준다.

→ 대칭되는 layer는 activation map들이 concatenation 될 수 있도록 해상도와 채널을 맞춰주도록 설계되었다.

 

**낮은 레이어에서 전달된 특징이 localized information을 준다!

공간적으로 높은 해상도와 입력이 약간 바뀌는것 만으로도 민감한 정보를 제공하기 때문에 경계선이나 공간적으로 중요한 정보들을 뒤쪽 레이어에 바로 전달하는 중요한 역할을 한다.

 

Q. 만약 feature map의 spatial size가 홀수라면??

Contracting Path에서 전달되는 해상도와 Expanding Path의 해상도가 concatenation 될 수 있도록 해상도가 같아야한다.

예시) (일반적인경우)  7x7 Feature Map을 Downsampling 될 때는 3x3 이 되고, 3x3 을 다시 Upsampling을 하면 6x6 이 된다. 즉, 7x7 != 6x6 이므로 해상도 차이가 나게된다. 그래서 입력 영상을 넣어줄 때, 어떤 레이어에서도 홀수 해상도의 activation map이 나오지 않도록 유의해야한다. 

 

 

🔷 DeepLab

핵심은 CRFs와 Dilated convolution(Atrous Convolution)의 사용이다.

 

- Conditional Random Fields (CRFs)

후처리로 사용되는 툴로 픽셀과 픽셀 사이의 관계를 다 이어주고 픽셀맵을 그래프로 보는 그래프 모델링을 한다.

 

- Dilated convolution = Atrous Convolution

Convolution 커널 사이에 Dilated factor만큼 일정 공간을 넣어주는 것이다.

픽셀 사이를 한 칸씩 띄어서 실제 Convolution 커널보다 더 넓은 영역을 고려할 수 있게 한다.

다만, 파라미터 수는 더 늘어나진 않는다. 단순하지만 Dilated convolution을 몇번 반복하는 것만으로도 receptive field가 exponential 하게 증가하는 효과를 얻을 수 있다.

- Atrous Separable Convolution

Segmentation의 입력 해상도가 엄청 크기 때문에 Dilated convolution와 Depthwise separable convolution과 결합한 Atrous Separable Convolution을 제안하고 사용한다.

 

* Depthwise separable convolution 이란?
기존 convolution : 채널 축 전체에 nxn convolution을 해서 activation 값 1개를 얻는다.

Depthwise convolution : 각 채널 별로 convolution을 해서 채널의 갯수만큼 activation 값을 얻는다.

Pointwise convolution : Depthwise convolution의 값을 채널 축 전체에 1x1 convolution을 통해서 activation 값 1개를 얻는다.

 

즉, Depthwise separable convolution = Depthwise convolution + Pointwise convolution

이처럼 2개의 프로세스로 나누면, convolution의 표현력이 유지되면서 계산량을 획기적으로 줄어드게 된다.

cf) Deeplab v3+ 의 구조

 

Comments