본문 바로가기

딥러닝

[논문리뷰] Image Super-Resolution Using Deep Convolutional Networks

Image Super-Resolutoin Using Deep Convolutional Networks

Chao Dong et al., 2015

 

이번 여름방학동안 컴퓨터비전 분야 연구실 인턴을 하게 되었는데, 앞으로 내가 공부한 논문을 정리한 내용을 다른 사람들과 공유하고자 한다. 논문뿐만 아니라 다른 공부한 내용들도 틈틈이 포스팅할 계획이니 다같이 성장하는 기회가 되었으면 좋겠다! 지금부터 시작~!!

 

논문: https://arxiv.org/abs/1501.00092

Github: https://github.com/yjn870/SRCNN-pytorch

 

※혹시나 포스팅에 문제가 있을 시 댓글 남겨주세요!

 

[Super-Resolution]

본격적인 리뷰에 들어가기 앞서서 Super-Resolution(SR) 분야에 대해서 간단하게 알아보자. Super-Resolution(초해상화)란 저해상도 이미지를 고해상도 이미지로 변환시켜주는 기술로, 컴퓨터 비전의 대표적인 분야 중 하나다. SR 알고리즘은 크게 4가지로 분류할 수 있다.

1) prediction models

2) edge based methods

3) image statistical methods

4) patch based(example-based) methods - SOTA

 

example-based methods는 앞서 살펴본 것과 같이 internal / external 방식 두 가지로 나누어볼 수 있다. external example-based methods는 low/high resolution patch간의 mapping을 학습하는 데 그 학습 알고리즘으로 nearest neighbor(NN), kernel regression, random forest, sparse coding(SOTA) 등이 연구되었다고 한다.

 

SR분야에 딥러닝을 활용한 CNN 모델 구현 - low resolution image(input)에서 high resolution image(output)로의 end-to-end mapping을 학습한다. 사실 github에서 모델 구조를 보면 그렇게 복잡하지는 않은데, 논문 발표 당시에 SR분야에 딥러닝을 접목시켜서 성능을 향상시켰다는 점에서 의의를 가지는 듯!


Introduction

[Super-Resolution]

-SR 문제는 한 개의 low-resolution pixel에 대해 여러 개의 답이 존재한다. 따라서 ill-posed problem이라고 부를 수 있으며, 사전 정보를 얻어서 해공간에 제약을 걸어주어야 한다. 논문 발표 당시의 state-of-the-art(SOTA, 최고 수준) 방법들은 주로 example-based strategy를 사용하였는데, 이는 크게 두 가지로 나눠볼 수 있다.

1) 동일한 이미지의 내부적 유사도를 이용하는 방법(internal method)

2) low에서 high resolution 이미지로 매핑하는 모범 사례들을 보고 mapping function을 학습하는 방법(external method)

 

[Sparse-Coding-Based method]

-external example-based SR method 중 대표적인 방법으로 다음의 4단계로 구성된다.

출처:https://www.researchgate.net/publication/301317540_An_Efficient_Image_Enlargement_Method_for_Image_Sensors_of_Mobile_in_Embedded_Systems

1) input image로부터 촘촘히 잘라서 ovelapping patch들을 만들고 전처리

2) patch들을 low-resolutoin dictionary로 encoding

3) sparse coefficients를 high-resolution dictionary로 전달하여 high-resolution patch들을 생성

4) high-resolution patch들을 합쳐서 최종 ouptut 이미지 생성

 

위 파이프라인은 주로 dictionary를 학습하고 optimize하거나, 효과적인 mapping function을 만드는 데 집중한다. 하지만 파이프라인의 나머지 단계는 거의 optimize하지 않음. 따라서 모든 파이프라인 과정을 convolution layer로 구성하여 optimize하는 것이 목적이다. SRCNN의 장점으로는 1) 단순하지만 더 나은 정확도 2) 빠른 속도(feed-forward) 3) 크고 다양한 데이터셋 / 크고 깊은 모델에 적용 가능(기존의 example-based method로는 어려웠다고 함) 4) 컬러 이미지의 3채널에도 적용 가능하다고 한다.


Convolutional Neural Networks for Super-Resolution

[전처리]

low-resolution image를 입력으로 받아서 bicubic interpolation을 통해 원하는 사이즈로 키워준다. 이것이 SRCNN에서 수행하는 유일한 전처리 과정이다. 여기서 interpolation이란 이미 알고 있는 몇몇의 discrete data를 바탕으로 새로운 data를 만들어내는 방법이다. 사이즈를 키우게 되면 자연스레 빈 픽셀이 생기기 마련인데 그 픽셀을 어떻게 채우는지에 대한 알고리즘인 듯하다. 그 중에서도 bicubic interpolation은 인접한 16개의 픽셀의 값을 이용하는 방법인데 이 정도까지만 알고 넘어가도록 하자. 여기서 전처리된 low resolution image를 Y, ground truth high resolution image를 X라고 정의하자. 그러면 모델의 목표는 Y -> X로 매핑하는 함수 F를 학습하는 것이다.

 

SRCNN은 다음의 3단계로 이루어져있다. 여기서 중요한 점은 모든 단계를 convolution layer를 활용하여 모든 필터의 weight, bias를 optimize한다.

[1단계] : Patch extraction and representation

-먼저 low-resolution image Y에 $$c * f_1 * f_1$$ 사이즈의 필터를 convolution 연산을 수행시켜서 low-resolution patch를 만들어낸다. 여기서 c는 입력 이미지의 채널 수를, f1은 필터의 크기(patch의 크기)를 의미한다. 이 필터를 n1개 쌓아서 convolution 연산을 수행하면 그 output으로 n1개의 feature map이 생성된다. 앞서 언급한 sparse coding method의 low-resolution dictionary에 대응하는 개념인 셈이다. 마지막으로 relu 연산을 수행한다.

 

[2단계] : Non-linear mapping

-다음으로 n1 feature map(lr image patch에 대한 정보)을 n2 feature map(hr image patch에 대한 정보)로 매핑시켜준다. 역시 relu 연산을 마지막에 해준다.

 

[3단계] : Reconstruction

-n2 feature map으로부터 high resolution image를 복원하기 위해 convolution 연산을 수행한다. 이때는 원하는 채널의 개수만큼 컨볼루션 필터를 활용하면 된다.

 

[Relationship to Sparse-Coding-Based Methods]

본 논문에서는 Sparse-Coding method를 CNN으로도 바라볼 수 있다고 주장함과 동시에, SRCNN이 optimize 측면에서 더 좋은 성능을 내고 있다고 한다.

위 그림에서 1단계(patch extraction and representation)와 2단계(non-linear mapping)가 본래 sparse coding solver의 동작과 같다고 한다. 입력 이미지로부터 f1 * f1 lr patch를 얻어내면 sparse coding solver는 patch를 low-resolution dictionary로 project시킨다. dictionary size가 n1이면 n1개의 f1 * f1 크기를 갖는 linear filter를 입력 이미지에 통과시키는 것과 같으며 앞서 살펴본 SRCNN의 1단계 동작과 일치한다.

 

다음으로 sparse coding solver는 반복 연산을 통해 n1 coefficients를 n2 coefficients로 매핑시킨다. 여기서 CNN과의 차이점은 sparse coding solver는 iteration 알고리즘인데 반해, CNN의 convolution layer는 feed-forward라서 효과적인 연산이 가능하다는 점이다. 이 점을 제외하고는 SRCNN의 첫번째와 두번째 convolution layer가 sparse coding solver와 같은 동작을 하고 있음을 알 수 있다.

 

마지막으로 sparse coding solver에서는 n2 coefficients를 high-resolution dictionary에 project시켜 high resolution patch를 생성하고 이들을 모아 최종 output image를 만들어낸다. 이또한 SRCNN의 세번째 convolution layer가 하는 일과 동일하다. 결론적으로 Sparse-coding based SR method는 CNN의 일종으로 볼 수 있지만 모든 단계가 optimize되는 것은 아니다. 하지만 SRCNN은 low-resolution dictionary(n1 feature map), high-resolution dictionary(n2 feature map), non-linear mapping, mean substraction and averaging의 전 과정이 optimize되는 것을 알 수 있다. -> 결론: SRCNN이 더 좋다!

 

[Training]

ground truth images {Xi}는 training image를 랜덤하게 자른 $$f_{sub} * f_{sub} * c_{sub}$$ image로 구성되고, low-resolution samples {Yi}는 sub-image를 Gaussian kernel을 거쳐 blur처리한 후, bicubic interpolation을 통해 upscale한다. 이때 {Yi}와 {Xi} 간의 Mean Squared Error(MSE)는 다음과 같이 정의된다.
$$L(\Theta) = \frac{1}{n} \sum_{i=1}^{n} \lVert F(Y_i ; \Theta) - X_i \rVert ^2 $$loss를 줄이기 위한 optimizer로는 Stochastic Gradient Descent(SGD)(깃허브 코드에서는 Adam)를 사용한다.

초기 필터의 weight는 평균이 0이고 표준편차가 0.001인 가우시안 분포에서 랜덤하게 정해지며, 각 레이어의 learning rate는 10^-4, 10^-4, 10^-5이다. 마지막 layer의 learning rate가 더 작은 이유는 network가 특정 값에 더 잘 수렴하게 하기 위함이다.

 

또한, border effect를 피하기 위해 convolution layer들은 padding을 하지 않으며(깃허브 코드에서는 패딩을 해줌), loss function MSE는 GT {Xi}와 모델의 output의 중간의 픽셀들에만 적용한다.


Experiments

다른 모델들에 비해서 여러 종류의 dataset에서 더 나은 SR 성능을 보이고 있다.

 
 
[doumui songili oneun jungipnida.]
Help is on the way.