논문 리뷰(13) - Accurate Image Super-Resolution Using Very Deep Convolutional Networks

이준학·2024년 9월 8일

논문 리뷰

목록 보기
14/16

    이번에 살펴볼 논문은 VDSR이라는 모델 archiecture를 제안한 "Accurate Image Super-Resolution Using Very Deep Convolutional Networks", Kim et al., 2016 이다. 우리나라에서 나온 논문이며, SR 분야에 Deep Convolutional Network를 적용했다는 점에서 의미가 있는 논문이다.

1. 저자가 이루려고 한 것

    이전의 SOTA였던 SRCNN은 여러 문제들이 있었다. 저자는 이를 해결하고, SR을 위한 deep convolutional network의 구조를 고안했다. SRCNN은 기본적으로 HR image= low frequency information(LR image) + high frequency information (image detail, residual image)의 구조를 가지며, input과 output은 같은 low frequency 정보를 공유한다. 이를 통해 SRCNN의 목적은 2개로 요약할 수 있다. input layer를 end layer까지 끌고 가는 것, residual을 복원하는 것이다. 이러한 관점에서 SRCNN이 가졌던 문제들부터 살펴보자. SRCNN에 대한 자세한 내용은 아래 링크에 정리해두었다.

https://velog.io/@danlee0113/%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B012-Image-Super-Resolution-Using-Deep-Convolutional-Networks

  1. 작은 image region에 의존해 복원을 진행한다. (작은 patch)
  2. training시의 속도가 너무 느리다.
  3. 하나의 image scale에 대해서만 적용이 가능하다.
    -> 다른 scale을 적용하려면 새로운 네트워크를 훈련시켜야 함.

위의 문제들을 해결하기 위해 저자들은 아래와 같은 방법을 제안했다.

1. 작은 patch에 들어있는 정보는 large scale image를 복원하기에 충분치 않다.
-> large receptive field를 사용해 더 많은 정보를 복원에 이용할 수 있게 함.
2. training 속도를 높이기 위해 residual learning, 높은 learning rate, gradient clipping을 사용한다. (vanishing/ exploding gradient 문제 방지)
3. 하나의 네트워크로 여러 scale의 image를 받을 수 있게 했다.

조금 더 보충 설명을 하자면, 2번에서 저자는 SRCNN training time의 대부분이 image detail을 배우는 시간보다 auto-encoder의 기능을 배우는데 더 많은 시간을 사용했을 것이라고 분석하고, 이는 residual learning을 통해 해결될 수 있다고 주장한다.

    정리하자면, 저자는 deep convolutional network 구조를 SR 분야에 적용해 더 효율적이고 사실적인 output을 내는데 집중한 것이다.

2. 주요 내용

1) VDSR Architecture

    저자가 제안한 네트워크는 많이 알려져 있는 CNN architecture인 VGGNet을 사용한다. 구체적인 구조는 아래의 사진에 나와 있다.

기본적으로 첫 번째와 마지막 layer를 제외한 layer들은 같은 개수의 filter를 사용한다.

  1. 첫 번째 layer: input을 받음.
  2. 마지막 layer: 3x3x64 filter 1개만 사용. (output channel 맞춰야 함.)
  3. 그 외의 layer: 3x3x64 filter 64개 사용.

이때, 네트워크는 interpolated LR 이미지를 input으로 받으며, image detail을 예측한다.

    deep network를 사용하는 것의 문제 중 하나는 layer를 통과 할때마다 feature map 크기가 계속 줄어든다는 것이다. 또한, image의 테두리 쪽의 픽셀에 대한 예측도 정확하지 않다. 가장자리쪽은 conv layer가 지날 수 없기 때문이다. 저자는 이를 zero padding을 해주어 해결한다.

2) Training Details

i) 사용되는 표현

    training의 세부적인 것들을 알아보기 전에, 논문에서 사용하는 표현들을 정리할 필요가 있다.

  1. xx: Interpolated LR image (ILR image라고 부름)
  2. yy: Ground Truth HR image
  3. y^\hat y: f(x)f(x)로 예측한 HR image

즉, VDSR의 목적은 Ground Truth image인 yyy^\hat y의 차이를 최소화 하는 ff를 학습하는 것이다.

ii) Loss Function

    VDSR은 MSE를 loss function으로 사용한다. 기본적으로 사용하는 MSE의 식은 12yf(x)2{1 \over 2} ||y-f(x)||^2을 사용하지만, 여기에 residual learning을 추가한다. 위에서 언급했듯이, vanishing/ exploding gradient 문제를 방지하기 위해서 도입하는 것이다. residual 식은 r=yxr=y-x로 정의된다. 이에 따라 네트워크는 residual image rr을 예측하게 된다. 따라서 변형된 MSE의 식 12rf(x)2{1 \over 2} ||r-f(x)||^2 가 정의된다. 바뀐 loss function에 따라, loss를 계산하는 layer에서는 다음과 같은 연산이 실행된다.

  1. residual estimate image, network input(ILR) image, ground truth HR image가 loss layer의 input으로 들어온다.
  2. reconstructed image(= residual image+ ILR image)와 ground truth image간의 loss를 계산한다.
  3. loss가 최소화되는 쪽으로 업데이트 된다.

이렇게 residual learning이 진행된다. 말은 어려워 보이지만, 막상 과정을 보면 말 그대로 잔차를 이용하는 것이라 그닥 어렵지 않다.

iii) Training Settings

    이번에는 training setting에 대해 알아보자.

1. mini-batch GD+ momentum(0.9), weight decay L2(0.0001)
2. weight init-> He init, 약 80 epoch.
3. lr은 0.1로 시작해서 매 20 epoch마다 0.1배로 감소.
4. 높은 lr 대신 gradient clipping 적용
5. batch size= 64

기본적인 세팅은 위와 같다. 조금 더 자세히 살펴보자. SRCNN 논문에서는 3-layer 이상의 네트워크에서는 성능이 떨어지고, 훈련 시간도 오래 걸렸다는 주장을 했다. VDSR의 저자들은 이러한 문제의 원인이 아마 training을 수렴 전에 끊은 것,그리고 lr을 너무 작게 설정한 것에서 찾았다. 이를 해결하고 수렴 속도를 증가시키기 위해 높은 learining rate를 사용해야 한다는 결론을 냈다. 그런데 무작정 높은 lr을 설정한다고 좋은 것만은 아니다. 앞서 언급했듯이, vanishing/ exploding gradient 문제 발생할 수 있기 때문이다. 이러한 문제를 방지하기 위해 저자는 gradient clipping을 높은 lr과 함께 사용한다.
  기본적으로 gradient clipping은 우리가 원하는 gradient의 범위를 설정하여 사용한다. 이를 식으로는 [θ,θ][-\theta, \theta]로 표현한다. 그러나 이렇게 설정하면 lr이 높을 경우, exploding gradient를 막기 위해 θ\theta 값이 작은 값으로 학습되는 문제가 생긴다. parameter update 식이 일반적으로 wt+1=wtα×dLdww_{t+1}= w_t-\alpha \times {dL\over dw} 와 같이 되기 때문이다. 그리고 학습이 진행되며 lr이 작아질 수록 update 값이 0으로 갈 것이다. 이렇게 되면 parameter update가 너무 느리게 되어 훈련 속도가 감소할 것이다. 그래서 최종적으로 사용하는 gradient clipping 식은 [θα,θα][{-\theta\over \alpha}, {\theta\over \alpha}]로 정의된다.

iv) Multi-Scale

    SRCNN의 경우, 하나의 네트워크로 하나의 scale만 입력 받을 수 있었다. 다른 scale의 image를 받으려면 아예 새로운 네트워크를 scale에 맞게 훈련시켜야 했다는 뜻이다. 저자는 이러한 문제를 비효율적이라고 생각하고, 하나의 네트워크로 여러 scale을 받을 수 있는 네트워크를 만들었다. 이것도 복잡해 보이지만, 그닥 어렵지 않다. 일단 dataset에 여러 scale의 사진을 넣어놓는다. 이때, 사용하는 scale은 사전에 정의되어 있어야 하며, 모델의 parameter는 여러 scale에 대해 공유된다. 이렇게 dataset을 설정하고, 각 image에서 sub-image를 overlap 없이 뽑는다. 하나의 mini-batch는 64개의 sub-image를 갖는다.

3) Property의 해석

    training 과정에 대해 알아봤으니, 네트워크의 여러 특성들이 어떤 의미를 가지는지 해석해보자. 크게 세 가지 정도로 요약할 수 있을 것 같다.

  1. SR task를 위해 large depth가 필요하다.
  2. Residual Network가 일반 CNN보다 훨씬 빠르게 수렴한다.
  3. 위에서 언급한 multi-scale 네트워크는 scale 마다 하나의 네트워크를 훈련시키는 방법보다 더 좋은 성능을 낸다.

i) The Deeper, the Better

    CNN의 특성 상 학습된 filter가 특정 local input pattern에 잘 반응하게 된다. 이러한 layer를 많이 쌓다 보면, 더 넓은 region에 대해 반응을 할 수 있게 된다. 즉, receptive field가 커지는 것이다. receptive field는 layer를 통과할수록 커지게 되고, 이에 따라 네트워크가 image detail을 복원하는데 더 많은 정보를 사용할 수 있게 된다. 그렇기 때문에 layer가 깊어질수록 더 좋은 성능이 나타나게 된다. 실험을 통해서도 이러한 결론을 얻는다.

위의 그래프에서 중요하게 봐야 하는 것은 여러 scale에서 훈련을 시켰더라도, depth가 깊어질수록 performance가 높아진다는 것이다.

ii) Residual Learning

    위에서 저자는 training time을 줄이기 위해 residual learning을 사용했다. residual learning의 효과를 알기 위해서는 residual network와 non-residual network를 가지고 실험을 해 볼 필요가 있다. 실험 시에 depth=10, scale factor=2로 고정해놓고 진행했다.


실험 결과, 우리는 몇 가지 결론을 낼 수 있다.

  1. residual net이 수렴 속도 훨씬 빠르다.
  2. 수렴 후 residual net이 더 우월한 성능을 보인다.

또 하나 중요한 사실은 residual, non-residual network는 10 epoch 이후 큰 성능 차이가 존재하게 된다는 것이다.

iii) Single Model for Multiple Scales

    저자가 제안한 multi-scale machine을 이용해 더 작은 capacity로 효율적인 training을 진행할 수 있게 되었다. 실험을 통해 이러한 training 방식이 어떤 효과를 가져다 주는지 확인해보자. 먼저, 저자는 model을 strains_{train}의 scale로 학습시키고, testing 때는 stests_{test}의 scale을 사용한다. scaling factor는 2,3,4를, dataset은 Set5를 사용한다. 이렇게 훈련을 진행해 아래 표와 같은 결과가 나오게 되었다.

세로 줄은 test, 가로 줄은 training을 의미한다. X2는 scaling factor 2를 사용했다는 말이다. 결과를 해석해보자.

  1. 만약 strainstests_{train} \neq s_{test} 라면, performance가 떨어진다. (e.g strain=2,stest=3s_{train}=2, s_{test}=3이라면 stest=2s_{test}=2인 것보다 성능이 떨어진다.)
  2. strain={2,3,4}s_{train}=\{2,3,4\}과 같이 여러 scale들을 training에 이용하면 single-scale(e.g. strain=stest=2s_{train}=s_{test}=2)로 훈련하는 것과 비슷하거나 좋은 성능을 낸다.

정리하자면, single-scale data만을 이용해 훈련시킨 네트워크는 다른 scale에 대해 좋은 성능을 내지 못하고, 여러 scale을 합쳐서 training 시켰을 때는 testing 시에도 좋은 성능을 낸다. 이러한 결론은 아래 사진으로도 확인할 수 있다.

위의 사진에서 위의 선명한 sample들이 VDSR의 single network이고, 아래의 조금 흐릿한 sample들이 SRCNN으로 출력한 결과 값이다. X3, X4와 같은 large scale에 대해서는 VDSR이 single-scale network를 뛰어넘는 성능을 발휘한다는 것 또한 짚고 넘어가야 한다.

4) Experimental Results

    Training Dataset은 SRCNN 논문에서 사용한 91 images에 Berkeley Segmentation Dataset 200장을 더한 291 images dataset을 사용한다. training 시에 data augmentation도 진행되었다. Testing Dataset은 Set5, Set14, Urban100, B100을 사용한다. 최종 network을 훈련시킬 때의 세팅은 위의 training setting 부분에서와 동일하다. 이전 SOTA와 비교하는 실험에서는 A+, RFL, SelfEx, SRCNN을 비교 대상으로 사용한다. 아래 표를 통해 결과를 확인할 수 있다.

위의 표에서 빨간색 글씨는 가장 좋은 성능을 가진 네트워크를 나타내고, 파란색 글씨가 두 번째로 좋은 성능을 가진 네트워크를 나타낸다. VDSR가 모든 부분에서 가장 좋은 성능을 낸다. 아래의 그래프도 이전 SOTA들과의 차이를 한 눈에 보여준다.

우리 눈으로 봐도, VDSR만이 아래 사진의 선을 제대로 복원하고 뿔의 뾰족함을 표현했다.

3. 논문 내용의 실용성

    SR 분야에서의 발전이 CNN Architecture가 발전해 나아간 과정과 굉장히 비슷하게 나아간다는 점을 느꼈다. VGGNet이 2014년에 등장하자 그 구조를 응용한 VDSR이 등장한 것이다. 그리고 이후에 발표된 SRGAN도 이름에서 알 수 있듯이 GAN에서 영감을 받아 탄생한 모델이다. 어쨌든, 저자는 SR을 위한 deep convolutional neural network를 고안했고, 그 과정에서 deep network가 고질적으로 가지는 문제인 vanishing/exploding gradient 문제와 훈련 속도 저하를 해결했다. 이를 통해 이전 SOTA보다 훨씬 더 좋은 성능을 짧은 훈련 시간에 얻을 수 있게 되었다. 이것만으로도 SR 분야의 architecture에 많은 기여를 한 것 같다.

4. 더 찾아볼 내용

  1. SRGAN, EDSR, MDSR- SR 모델이 발전해온 과정을 훑고 있기 때문에 발표된 논문 중 대표적인 논문들을 훑고, 요즘 SOTA들이 이용하는 transformer 기반의 모델들로 넘어가 보려고 한다.
  2. sparse coding based methods- 시간이 된다면 딥러닝이 SR에 적용되기 이전에 어떤 방법이 사용되었는지 알고 싶다.
profile
AI/ Computer Vision

0개의 댓글