U-Net의 핵심 아이디어 파악하기

1. introduction

 

input 이미지와 비슷한 사이즈의 출력을 가지는 모델?

 

지금 대부분 일부분 classification하는 모델의 기원

 

fully convolutional network의 기본적인 특징을 가지면서

 

낮은 layer의 feature와 높은 layer의 feature를 더욱 잘 융합하는 방법으로 skip connection 방법을 활용

 

2. 구조

 

contracting path와 expanding path의 결합으로 U자형처럼 생겼다

 

2-1) contracting path

 

3*3 convolution과 ReLU를 반복적으로 통과하고

 

maxpooling을 통과하여 해상도크기를 절반 낮추고 채널 수를 2배로 높이면서 receptive field를 높여간다

 

최종적으로 이미지의 전체적인 정보를 잘 압축한 아주 작은 activation map을 하나 출력

 

contracting path의 기본 구조

 

크기를 줄여나가는 downsampling과정이다.

 

일반적인 CNN과 비슷하다

 

2-2) expanding path

 

convolution을 반복적으로 적용해가는데 단계별로 채널 크기를 절반씩 줄여나가고 해상도 크기를 2배씩 늘려나감

 

expanding path의 구조

 

2*2 up-convolution으로 해상도 크기를 2배씩 늘려나가는 upsampling과정이다.

 

 

2-3) skip connection

 

expanding path에서 단순히 크기만 늘려나가는 것이 아니고

 

대칭 대응되는 contracting path에서 추출되는 activation map을 그대로 가져와 concatenation 시킴

 

당연하지만 concat 시킬수 있도록 크기 호환성을 잘 맞춰 설계되어있다

 

물론 ResNet의 skip connection처럼 더하는 방법도 있겠지만 이 논문에서는 concat을 했다고 한다

 

 

U-Net의 전체적인 구조

 

contracting path의 activation map을 대응되는 expanding path의 activation map에 concat시키면서 크기를 늘려나간다

 

concatenation 시킨다는 것은 하위 layer에서 경계선이나 공간적으로 중요한 정보(localized information)들을 최상위 layer로 바로 전달하는 중요한 역할을 한다

 

각 단계별로 해상도가 약간씩 바뀌는데 그럴때마다 민감한 정보차이가 있다

 

그래서 단계별로 상위 layer에 바로 전달하는 것이 의미가 있다???

 

이제 봤는데 잘 보면 단계별 contracting path와 expanding path사이 이미지 size가 안맞다..

 

그래서 전달하기 전에 이미지를 잘라내서, 중앙부분만 전달한다고 한다 

 

논문에서 이유를 다음과 같이 설명하고 있다.

 

‘The cropping is necessary due to the loss of border pixels in every convolution’

 

convolution 연산하면서 압축되어가지고, 날아가는 가장자리 정보들이

 

중앙으로 집중된다고 생각했기 때문에 가장자리를 잘라서 중앙부분만 expanding에 합쳐주는것이 좋다고 추측

 

 

3. spatial size가 홀수라면?

 

contracting path와 expanding path에서 concat을 해야해서 대응되는 layer끼리 해상도가 맞아야함

 

contracting path에서 해상도 크기를 절반씩 줄이는데 spatial size가 홀수이면 서로 다른 크기의 downsample들이 나옴

 

당연히 해상도를 2배로 늘리는 upsampling하면 서로 다른 크기의 feature가 나오니 해상도가 안맞는경우가 생길 수 있음

 

그래서 일반적으로 feature map이 size가 짝수가 나오게 설계해야한다.

 

 

7*7에서 절반으로 줄이면 3.5*3.5인데 여기서 버려서 3*3이냐 올려서 4*4냐는 구현방식에 따라 차이가 있음

 

만약 3*3이 된다고 하더라도 upsample하면 6*6으로 원본인 7*7과는 차이가 생긴다

 

4. U-Net code 간단 분석

 

contracting path에서는 double_conv와 maxpooling의 반복으로 구현

 

 

double conv의 인자를 보면 채널 수가 2배씩 증가하고 있다

 

double_conv는 자세히보면 3*3 conv와 ReLU의 반복

 

 

 

upsampling과정인 expanding path에서 transposedconv를 사용했는데 kernel size=2와 stride=2를 사용하여 중첩되는 부분이 안생기도록 했다

 

채널 수가 2배씩 감소하고 있다

 

 

중첩 부분이 왜 안생기는지는 2*2 kernel을 2칸씩 직접 옮겨보면 알 것이다

 

 

 

contracting path에서 expanding path로 넘기기전에 size가 안맞아서 crop을 한다고 한다…

 

보통 가장자리를 잘라서 중앙부분을 가져간다고 함

 

 

TAGS.

Comments