fully convolutional network에서 Upsampling이란 무엇인가 + interpolation 기본

1. motivation

 

fully connected layer를 1*1 convolution layer로 대체하여 여러번 쌓으면 필연적으로 input size가 줄어들면서 정보들이 압축된다

 

단 1pixel의 classification의 결론을 내리기 위해 더욱 넓은 영역을 참조할 수 있다(receptive field가 크다)는 좋은 점은 있다.

 

 

receptive field는 커지지만 output이 너무 작아진다

 

그래서 이 너무 작아진 output을 크게 만들기 위해 upsampling 기법을 사용한다

 

그런데 여기서 의문을 가질 수 있는 것은

 

그러면 중간에 stride나 pooling등을 제거하거나 convolutional layer 등을 일부 제거하면 조금 더 고해상도 output을 얻겠지만

 

receptive field가 매우 작아져서 이미지의 전반적인 정보를 판단하지 못한다는 것이 문제다.

 

그래서 receptive field를 최대한 확보하기 위해 일단 downsample과정에서 최대한 작게 만들고

 

upsampling을 통해 강제로 resolution을 키워서 활용하는 것이 정석이다

 

 

upsampling을 통해 나온 output feature map을 input size와 맞춰주는 것이 사람이 보기에 편하다

 

upsampling 기법은 대표적으로 unpooling, transposed convolution, upsample and convolution 등이 있다.

 

 

2. transposed convolution

 

transposed convolution이란 convolution을 역으로 하여 size를 키우는 방법이다.

 

 

convolution을 거꾸로 한다고 하여 deconvolution이라고도 부른다

 

하는 방법은 수학적으로 되게 복잡하다.. 참고에 링크를 남겨뒀으니 생각나면 보도록 하자

 

https://blog.naver.com/PostView.nhn?blogId=mincheol9166&logNo=221740156045&parentCategoryNo=&categoryNo=49&viewDate=&isShowPopularPosts=false&from=postView 

 

[Deep learning] Upsampling (Transposed Convolution) 설명

본 포스팅은 개인 공부를 용도로 작성되었습니다. 이번 포스팅에서는 Segmentation이나 GAN의 Generat...

blog.naver.com

 

 

https://zzsza.github.io/data/2018/06/25/upsampling-with-transposed-convolution/

 

Up-sampling with Transposed Convolution 번역

Naoki Shubuya님의 Up-sampling with Transposed Convolution을 허락받고 번역한 글입니다. 번역이 어색한 경우엔 영어 표현을 그대로 사용했으며, 의역이 존재할 수 있습니다. 피드백 언제나 환영합니다!

zzsza.github.io

 

 

요약하자면 convolution filter를 zero padding을 이용하여

 

convolution matrix로 적절하게 배치하여 정의하고

 

input도 zero padding으로 일렬로 flatten한다

 

이렇게 만들어 convolution 연산하여 reshape하면 기본 convolution이랑 동일한데

 

이 과정에서 사용한 convolution matrix의 역행렬을 transposed convolution matrix로 정의하고 output을 구한 뒤 이것을 reshape하면 원하는 형태로 얻는다

 

 

이거는 transposed convolution이 그냥 input에서 output으로  size가 커진다는 느낌이라는 것을 설명하기 위한 것

 

 

3. checkerboard pattern

 

위 그림에서 중첩부분이 존재해서 더한다고 하는데 그거 진짜 그냥 더해도 문제가 없을까?

 

다음과 같이 transposed convolution은 uneven overlap이라고 불균등한 overlap이 생기는 문제가 있다

 

 

중첩부분이 불균등하게 생기면 위 그림처럼 어색한 부분이 있다

 

보통은 transposed convolutional kernel size와 stride size를 잘 조절하여 중첩부분이 생기지 않도록 만들어야한다

 

그런데 진짜 아무리 잘 조절해도 거의 checkerboard pattern이 생긴다고 알려져있다

 

피하는 방법으로는 kernel size를 stride size로 나눠 떨어지게 설정하는 방법이 있지만 여전히 생길수도 있다

 

 

4. upsampling and convolution

 

upsampling과 convolution을 분리해서 사용하면 효과적이라고 알려져있다

 

알려진 방법으로는 nearest neighbor interpolation, bilinear interpolation 방법을 먼저 하고 convolution 연산을 수행한다

 

 

transposed convolution이 불균등하게 overlap이 생긴것과는 달리

 

interpolation을 먼저해서 빈부분을 채워넣고 하면 균등한 overlap이 생긴다

 

transposed convolution은 ‘학습가능한 upsampling을 하나의 layer로 한방에 처리’했다는데

 

이게 무슨말인지 생각해보면 위에서 설명한 것처럼 transposed convolution matrix로 output을 키웠잖아 이 matrix가 하나의 layer의 학습가능한 가중치를 의미하는듯?

 

upsampling and convolution에서 interpolation 방법은 학습가능한 parameter없이 그냥 layer의 빈 부분을 채워 넣는 해상도를 키워주는 방법이고

 

그 뒤에 학습가능한 parameter를 가지는 upsampling convolution을 추가했다

 

 

5. interpolation 기본

 

image 크기를 키우면 분명 빈 공간이 생기는데 이러한 빈 공간에 pixel을 채워넣는 방법

 

1) nearest neighbor interpolation

 

현재 빈 공간 위치에서 가장 가까운 곳의 pixel을 사용하는 방법

 

계산이 빠르지만 경계선이 망가지기 쉽다고 한다

 

 

 

2) bilinear interpolation

 

빈 공간에서 인접한 4개 pixel의 value와 거리비를 사용하여 적절히 결정하는 방법

 

보통 nearest neighbor보다 더 smooth한 결과를 가져온다고 알려져있다

 

 

?에 들어가는 값을 구해보도록 하자

 

그러기 위해서 A,B를 먼저 채워넣어야 한다.

 

 

더 가까운곳에 더 큰 가중치를 두어 가중합으로 구한다.

 

비슷한 방법으로 B도 37정도로 구할 수 있다.

 

 

최종적으로 ?는 약 30정도로 구할 수 있다

 

TAGS.

Comments