본문 바로가기

딥러닝 & 머신러닝/논문 리뷰

[논문 리뷰] Super Resolution - SRCNN (ECCV 2014)

다음 학기부터 석사 생활을 시작하게 되었는데, 현재는 연구실에 매일 출근하면서 관심 분야의 논문을 읽어보고 있습니다. 요즘은 Super Resolution(SR), 초해상화에 대해 공부하고 있습니다. 이번 게시물에선 SR 중에서도 시초격인 SRCNN에 대해 알아보겠습니다.

 

SRCNN은 다음과 같이 한 문장으로 말할 수 있겠습니다. "SRCNN은 간단한 CNN 구조를 SR 분야에 적용하면서, 기존에 존재하던 전통적인 SR 기법들을 모두 뭘등히 뛰어넘는 성능을 보여주었다. 그리고 SRCNN은 이후 등장하는 SR 기법들의 시초가 됐다."

 


 

~ Image Super-Resolution Using Deep Convolutional Networks ~

 

SRCNN이 기존에 있던 SR 방식인 Bicubic Interpolation과 SC(Sparse Coding) 방식보다 눈으로 보기에도, PSNR 비교에서도 더 나은 성능을 보여준다.

 

# 1. Introduction

 

컴퓨터 비전 분야에서, 하나의(single) 저해상도(low-resoultion) 이미지에서 고해상도(high-resoultion) 이미지로 복원하는 것은 전통적인 문제였습니다. 특히, 저해상도에서 고해상도로 바꾸는 것은 정답이 없는(ill-posed) 문제였습니다. 즉, 고해상도 이미지의 후보로 다양한 답이 나올 수 있는, '역'이 없는 문제였습니다. 이렇게 정답이 없는 문제인 SR에 대해서, 지금까지의 전통적인 SOTA 기술들은 사전 지식을 통해 어느 정도 정답의 후보를 간추리려고 했습니다.

 

첫번째로, example based 방식이 있습니다. 이 기술은 저해상도/고해상도 이미지 patch의 쌍을 매핑하는 함수를 학습시켜, 미리 딕셔너리 형태로 구축하는 방식을 사용합니다. 두번째로, sparse-coding-based 방식이 있습니다. 이 기술은 입력된 저해상도 이미지를 전처리한 후, sparse coefficient로 encoding 했다가 고해상도 딕셔너리를 거쳐 복원하는 방식입니다. 먼저 입력될 저해상도 이미지에서 patch를 크롭해서 전처리하고 쌓습니다. 이 패치들은 저해상도 딕셔너리에 의해 인코딩됩니다. sparse coefficient들은 고해상도 patch를 reconstruct 하기위해 고해상도 딕셔너리를 통과합니다. reconstruct된 패치들은 다시 모여서 최종 아웃풋을 만들어냅니다. 그러나 위와 같은 전통적인 방식들은 이런 전통적인 방식들은 SR의 pipeline의 모든 단계들에 대해서 최적화시키지는 않습니다.

 

이 논문에선 저해상도 이미지와 고해상도 이미지를 처음부터 끝까지(end-to-end mapping) 통과시켜 학습하는 CNN을 생각했습니다. CNN을 이용한 SR은 기존의 방법들을 모두 아우를 수 있다고 합니다. 딕셔너리나 매니폴드를 사용하지 않고, 패치 추출이나 모음도 Conv 레이어를 통해 이루어질 수 있습니다. 이들은 이 CNN 모델을 Super-Resolution Convolutional Neural Network, 즉 SRCNN이라고 이름 붙입니다.

 

이 SRCNN은 크게 네 가지 장점이 있습니다.

1) 기존 방법들보다 구조가 간단하지만 정확도가 훨씬 높다.
2) CPU에서 써도 될만큼 속도가 빠르다.
3) 모델이 크고 깊을수록, 데이터셋이 더 다양할수록 성능이 증가한다. 기존 방법들에선 그러한 방법들의 적용이 힘들다.
4) 이미지의 RGB 3채널을 처리함과 동시에 고해상도 이미지를 얻을 수 있다.

 

그리고 이번 연구의 기여점은 크게 세 가지가 있습니다.

 

1) 이미지의 초해상화를 위해 CNN을 제안했다.

2) 우리의 딥러닝 기반 SR 기술과 기존의 전통적인 SR 기술 간의 관계를 성립했다.

3) 전통적인 컴퓨터 비전 기법으로만 SR을 했는데, 이젠 SR을 할 때 딥러닝이 더 유용하다는걸 밝혔다.

 

또한 자신들의 이전 연구가 현재 연구와 비슷했는데, 이전 연구에 다음과 같은 두 가지 개선점을 추가함으로써, 상당히 새로운 분석과 직관적인 설명을 처음 결과에 더할 수 있었다고 합니다.

 

1) 비선형적 매핑 레이어, 즉 그냥 컨볼루션 레이어에 들어가는 필터 사이즈를 더 크게 만들었고, 그러한 레이어들을 더함으로써 더 깊은 네트워크 구조를 탐색했다.

2) YCbCr이든 RGB든, 3채널 이미지라면 SRCNN이 처리할 수 있도록 해주었다. (여러 채널을 동시에 처리한다는 것)

 

# 2. Related Work

 

단일 이미지에 대한 SR 기법(Single Image Super Resolution, SISR)에는 기존에 네 가지의 방법 정도가 쓰였습니다. prediction model, edge based, image statistical method, patch based (or example based)이 있는데, 그 중에서 지금까지는 example based가 SOTA를 달성했습니다.

 

또한 transform 없이, 동시에 전 채널(YCbCr 또는 RGB 3채널 동시)을 고해상화 시키려는 노력들이 존재합니다. 그러나 그러한 연구들 중, 그 채널들에 SR 성능이 얼마나 잘 적용되었는지, 그리고 전 채널에 대한 SR의 필요성에 대해 설명한 것이 없습니다.

 

딥러닝을 활용한 이미지 복원 문제가 몇 가지 있는데, MLP와 CNN을 이용한 denoising이 대표적입니다.

 

# 3. Convolutional Neural Networks for Super Resolution

 

- SRCNN의 구조 -

 

하나의 저해상도 이미지에 대하여, bicubic interpolation을 이용해 그것을 우리가 원하는 사이즈로 upscale한게 유일한 전처리 과정입니다. 이때 뒤에서 설명하겠지만, 대상 저해상도 이미지는 원본 이미지에서 특정 사이즈로 크롭한 sub-image를 특정 scale factor로 줄였다가 다시 늘림으로써 흐릿해진 이미지입니다. 마치 그림판에서 원본 이미지를 줄였다가 다시 늘리면 원본 화질이 유지되지 않고 흐릿해지는 것과 비슷합니다.

 

연구의 목표는 이렇게 만들어진 "저해상도" 이미지 Y를 F(Y)로 바꾸는건데, 이 F(Y)는 원본, 즉 "고해상도" 이미지 X, 다시 말하면 정답값(ground truth)과 가깝도록 만드는 매핑 함수 F를 찾는 것입니다. 이 F는 세 가지 동작을 포함합니다. 그리고 이 세 가지 동작들은 결국 CNN에서 이루어진다는 것까지 증명할 것입니다.

 

왜나하면, 이미지 복원에 있어서 유명한 방법은 저해상도 이미지에서 고밀도하게 패치를 뽑고, 그것들을 pre-trained된 기반(PCA 등) 기법등을 이용해 나타내는 것인데, CNN에서는 필터들이 이미지를 지나다니며 특징을 추출해내는 convolving 과정이 그와 같기 때문입니다. CNN에서 이루어지는 세 가지 동작은 아래와 같습니다.

 

1) Patch extraction and representation: CNN의 첫번째 레이어에서 저해상도 이미지 Y에서 패치를 추출하고, 각 패치들을 고차원의 벡터로 나타냅니다. 이 벡터들은 feature map 집합을 구성하며, 그 집합들의 수는 벡터의 차원과 같습니다. 첫번째 레이어의 수식은 다음과 같습니다.

 

 

인풋 이미지 Y에 Conv 필터를 통과시켜서 feature map인 W*Y를 만들고, bias B를 더한 뒤에, ReLU 함수(= 0과 0이 아닌 값 중 max를 고르는 함수)를 통과시켜 최종 매핑된 feature map F(Y)를 만듭니다. 결론적으로 우리가 알고 있는 컨볼루션 과정과 같다는 걸 알 수 있습니다.

 

2) Non-linear mapping: 매핑 함수는 1) 과정을 통해 만들어진 고차원의 벡터를 다른 고차원의 벡터로 비선형적으로 매핑시킵니다. 매핑된 각 벡터들은 또다른 feature map 집합을 구성하며, 그것은 곧 고해상도 이미지로 reconstruction을 하기 위해 만들어진 고차원 패치의 표현이라고 이해할 수 있습니다. 이 논문에서 non-linear mapping은 1x1 Conv 필터를 적용시키는 것이지만, 3x3, 5x5 Conv 필터에 대해서도 일반화시킬 수 있습니다. 두번째 레이어의 수식은 다음과 같습니다.

 

 

두번째 매핑(즉, 두번째 레이어)에서는 인풋 이미지의 패치에 매핑을 적용시키는게 아니라, 첫번째 매핑(즉, 첫번째 레이어)을 통과하고 나온 feature map F_1(Y)에 매핑을 적용시키는 것입니다. 그냥 자연스럽게 컨볼루션 레이어를 통과하는 것이라고 생각하면 됩니다. 그리고 비선형성을 증가시키기 위해 더 많은 컨볼루션 레이어를 붙일 수도 있습니다.

 

3) Reconstruction: 위 과정들을 통해 만들어진, 고해상도를 나타내는 표현들이 최종 고해상도 이미지를 만들기 위해 모여져야 합니다. 그 최종 고해상도 이미지를 나타내는 이미지는 실제 정답값  X와 비슷해야 합니다. 세번째 레이어의 수식은 다음과 같습니다.

 

 

전통적인 방법에서는 이전 과정들을 통해 만들어진 고해상도 패치들을 평균화시켜 최종 고해상도 이미지를 만드는데, 이 연구에선 linear filter를 나타내는 W_3가 평균화시키는 필터처럼 작동합니다.

 

 

SRCNN 구조

 

결국 위에서 설명한 세 가지 동작은 각기 다른 직관에서 유래되었지만, 그것들은 모두 컨볼루션 레이어라는 똑같은 형태로 귀결됩니다. 따라서 세 가지 동작이 이루어지는 모델 구조를 살펴보면, 위와 같이 " Input → Conv+ReLU → Conv+ReLU → Conv → Output " 의 형태인, 평범한 얕은 층의 CNN 모델이 되는 것을 확인할 수 있습니다.

 

-  Sparse-Coding-Based Methods와의 관계 -

 

CNN 관점에서 본 sparse coding method

 

논문을 읽다보면, sparse coding method는 CNN과 매우 비슷하다는걸 알 수 있습니다. 위 그림이 그것을 나타냅니다. 따라서 sparse coding method에 기반한 SR은 CNN의 과정으로 볼 수 있지만, sparse coding method의 전 과정이 최적화 대상이라고 고려되지는 않습니다. 그러나 CNN은 전과정을 최적화한다는 점에서 sparse coding method와 다릅니다.

 

- 훈련 -

 

모델 훈련 시에 사용되는 손실 함수는 MSE(평균 제곱 오차)입니다. 즉, 그리고 SRCNN의 결과로 나온 이미지 F(Y)와 원본 이미지 X의 차이를 계산합니다. 이는 위에서 언급한 내용입니다. 이 loss function은 일반적으로 사용되는 SGD로 최소화됩나다.

 

그리고 얼마나 잘 고해상화 되었는지는 PSNR이라는 수치를 이용합니다. PSNR은 최대 신호 대 잡음비(Peak Signal-to-noise ratio, PSNR)라고 하며, 신호가 가질 수 있는 최대 전력에 대한 잡음의 전력을 나타낸 것입니다. 주로 영상 손실 압축에서 화질 손실 정보를 평가할때 사용됩니다. PSNR은 신호의 전력에 대한 고려 없이 MSE를 이용해서 계산 할 수 있습니다. 즉 MSE가 낮을수록, 즉 손실 함수의 값이 작을수록 높아지는 값이므로, PSNR이 높으면 더 잘 초해상화된 이미지라고 할 수 있습니다. PSNR은 다른 SR 기법에 관한 논문에서도 필수적으로 등장하는 개념입니다. MSE와 PSNR의 수식은 아래와 같습니다.

 

MSE                                                                         PSNR

 

훈련 과정에서, ground truth인 X는 훈련을 위한 이미지들로부터 fxfxc 크기로 크롭된 sub-image들입니다. 이때 "sub-image"라고 표현하는건 이것을 "patch"가 아닌 "image"로 보는 것인데, 그 이유는 패치는 평균화 과정과 후처리가 필요한 반면 sub-image는 그렇지 않기 때문입니다.

 

원본 이미지 X를 특정 사이즈로 크롭해 sub-image를 만듭니다. 그리고 다시 원본 이미지에서 똑같이 sub-image를 만드는데, 이번엔 저해상도 Y로 만들어서 훈련에 사용합니다. 가우시안 필터를 이용해 원본에서 추출된 sub-image를 흐리게 만들고, 정해진 upscaling factor로 bicubic interpolation을 하여 upscale, 즉 원본 크기로 다시 되돌립니다. (그런데 코드들을 보면 대부분 가우시안 필터를 적용하지 않는데, 이유는 모르겠습니다.)

 

이상을 파이토치 코드로 대충 표현해보면 아래와 같습니다.

 

원본 X의 sub-image

: CenterCrop(crop_size) 적용

 

원본 X의 sub-image가 저해상도로 바뀐 Y

: CenterCrop(crop_size)

→ Resize(crop_size//upscale_factor, PIL.Image.BICUBIC)

→ Resize(crop_size, PIL.Image.BICUBIC) 적용

 

# 4. Experiments

 

- 이미지 전처리 -

 

이전 연구들과 똑같이, 기본적으로 SR은 휘도, 즉 YCbCr 채널에서 Y 채널에만 적용됩니다. 따라서 인풋이 들어가는 첫번째 레이어의 인풋 채널이 1이고, 아웃풋이 나오는 마지막 레이어의 아웃풋 채널도 1이어야 합니다. 또한 PSNR과 SSIM을 이용한 성능 측정도 Y 채널에 대해서만 적용됩니다.

 

(그러나 코드들을 보면 대부분 RGB 채널 이미지를 그대로 인풋으로 사용해서 첫번째 레이어의 인풋 채널이 3이고, 그에 따라 마지막 레이어의 아웃풋 채널도 3입니다. 훈련된 모델을 실제로 새로운 이미지에 적용할 때만 YCbCr로 바꿔서 사용합니다. 이유를 추정해보자면, 나중에 실험에서 어떤 채널로 훈련했는지에 따라 각 채널별 PSNR을 측정한게 있는데, 거기서 RGB로 훈련 후 RGB 이미지로 PSNR을 측정한게 있어서 그럴거라고 생각합니다.)

 

따라서 훈련에 사용할 저해상도 이미지는 다음과 같은 방식으로 만들어집니다. 정확한 그림은 아니지만, 아래 그림을 보면 이해가 쉽습니다. 이때 sub-image의 크기는 33, 원본에서 sub-image를 추출할때 그 크롭하는 이미지 간격(stride)은 14, upscalig factor는 3입니다.

원본 RGB 이미지를 YCbCr로 바꾸고 Y 채널만 사용하기

 

1) 원본 RGB 이미지를 YCbCr로 변환한다.

2) YCbCr로 변환된 이미지에서 sub-image를 크롭해서 정답값 X로 만든다. 그리고 그 X에서 Y 채널만 사용한다.

3) 똑같이 YCbCr로 변환된 이미지에서 sub-image를 크롭하되, 이번엔 그것을 특정 upscalig factor 값으로 크기를 줄인다. (이 과정이 원래는 가우시안 필터를 통과함으로써 진행되야 하는데, 대부분 코드 상에선 bicubic interpolation이다) 그리고 다시 그 upscalig factor 값으로 bicubic interpolation을 이용해 크기를 늘려 저해상도 이미지 Y로 만든다. 그리고 그 Y에서 Y 채널만 사용한다.

 

- 모델의 구조에 따른 실험 결과 -

 

훈련 데이터셋에 따른 성능

 

훈련 데이터는 91 images, ImageNet 두가지였는데, ImageNet에서 훈련한게 성능이 더 좋습니다. 즉, 위에서 언급한 SRCNN의 네가지 장점 중 하나인 "데이터셋이 더 다양할수록 성능이 증가한다"는 것이 증명됩니다. 위 그래프에서 이를 확인할 수 있습니다. 그리고 이 실험을 포함한 다른 실험에선 Set5를 검증 데이터셋으로 사용했고, Set14를 검증 데이터셋으로 사용해도 비슷한 경향을 보였다고 합니다.

 

모델의 구조는 기본적으로 f1 = 9, f2 = 1, f3 = 5, n1 = 64, n2 = 32인데, 첫번째 레이어의 필터 크기가 9x9, 필터 갯수는 64개, 두번째 레이어의 필터 크기가 1x1, 필터 갯수는 32개, 세번째 레이어의 필터 크기가 3x3이라는 뜻입니다. 기본적으론 그렇고, 필터 갯수와 필터 크기, 모델의 깊이에 따라 실험한 결과도 있습니다.

 

필터 갯수에 따른 성능

 

첫번째 레이어와 두번째 레이어의 필터 갯수에 따른 훈련 시간과 PSNR 결과 표입니다. 필터의 갯수가 늘어날수록 성능은 좋아지지만 속도는 느려지는 것을 확인할 수 있습니다.

 

필터 크기에 따른 성능

 

첫번째 레이어와 세번째 레이어의 필터 크기는 각각 9, 5로 두고, 두번째 레이어의 필터 크기만 1, 3, 5로 변경했을 때의 실험 결과입니다. 필터의 크기가 늘어날수록 성능이 좋아지는 것을 확인할 수 있습니다. 그러나 이 표에는 없지만, 필터 크기가 늘어날수록 모델의 파라미터 수는 증가합니다. 즉, 필터 사이즈를 늘리면 늘릴수록 성능이 좋아지지만 복잡도가 증가합니다. 따라서 이 둘의 trade-off 관계를 잘 생각해서 네트워크 크기를 정해야 합니다.

 

모델의 깊이에 따른 성능

 

모델의 깊이에 따른 성능 비교입니다. 모두 모델이 4층일 때보다 3층일 때 성능이 더 좋으며, 그 이유는 모델의 깊이가 깊어질수록 적절한 초기 파라미터와 학습률을 찾기 쉽지 않은 등의, 훈련에 어려움을 주는 요소가 많기 때문이라고 합니다. 모델이 깊어질수록 왜 성능이 안나오는가는 이 연구자들도 열린 질문으로 남겨놓았으며, 후속 논문인 [Accurate Image Super-Resolution Using Very Deep Convolutional Networks]에서 모델의 깊이를 깊게 하면서 성능은 올리는 방법을 찾아냅니다.

 

그리고 여러 실험 결과, f1 = 9, f2 = 5, f3 = 5, n1 = 64, n2 = 32일때 최적의 성능과 속도를 나타낸다고 합니다.

 

- 기존 SOTA 모델들과의 비교 -

 

다른 SR 기법들과 SRCNN의 성능 비교

 

위 그래프에서, SRCNN은 모든 평가 수치상에서 sparse coding method를 포함한 다른 모든 기존 SOTA 방법들보다도 좋은 성능을 보여주었고, 눈으로 보기에도 다른 방법들보다 더 샤프하고 artifact 없는 이미지를 만들어냈습니다. 더 좋은 결과를 얻기 위해선 더 긴 훈련 시간이 필요할 것으로 보인다고 합니다. 즉, 위에서 언급한 SRCNN의 네가지 장점 중 하나인 "기존 방법들보다 구조가 간단하지만 정확도가 훨씬 높다"는 것이 증명됩니다.

 

다른 SR 기법들과 SRCNN의 속도 비교

 

또한 SRCNN은 다른 SOTA 모델들과 비교했을때, 초해상화된 이미지를 만들어내는 시간도 월등히 빠른 것도 위 그래프를 통해 알 수 있습니다. 즉, 위에서 언급한 SRCNN의 네가지 장점 중 하나인 "CPU에서 써도 될만큼 속도가 빠르다."는 것이 증명됩니다. 참고로 이 그래프는 다른 그래프들과 다르게 Set14에 대해서 평가된 성능 그래프입니다.

 

훈련 방법에 따른 각 채널별 평균 PSNR

 

그리고 SRCNN은 학습 메카니즘 또는 네트워크 디자인의 변경이 필요없이 더 많은 채널을 받아들이는게 가능하며, 구체적으론 3채널 처리를 인풋 채널을 c=3으로 설정함으로써 손쉽게 할 수 있습니다. 즉 이는 위에서 언급한 SRCNN의 네가지 장점 중 하나인 "이미지의 RGB 3채널을 처리함과 동시에 고해상도 이미지를 얻을 수 있다"는 것을 증명하는 것인데, 논문에선 어떤 채널로 훈련한게 어떤 채널에서 가장 성능이 좋을지를 측정해보았습니다.

 

예를 들어 위 표를 보면, 전통적인 방법처럼 이미지의 Y 채널만 뽑아서 모델을 훈련한 후, 평가용 이미지(Set5)들의 PSNR을 Y, Cb, Cr, RGB에서 측정 후 평균내봤을 때, 각각 32.39, 45.44, 45.42, 36.37이라는 수치가 나온 것을 확인할 수 있습니다. 참고로 굵은 글씨는 가장 좋은 성능이 아니라, 그냥 논문에서 좀 더 논의하고 있는 부분들입니다.

 

구현 코드

: https://github.com/jhcha08/Implementation_DeepLearningPaper/tree/master/srcnn

원 논문

: https://arxiv.org/pdf/1501.00092.pdf

참고 사이트

: https://bellzero.tistory.com/4