Computer Vision

[Super..Resolve?] Learning to Super-Resolve Blurry Face and Text Images

DoDo&ToTo 2018. 4. 2. 14:07

Learning to Super-Resolve Blurry Face and Text Images


한줄요약
Deblurring과 super resolution을 한번에 해보이겠다.(GAN 만세)


Deblur와 Super resolution을 한번에 해결하는 방법을 제안한 논문.
기존 super resolution에서는 영상에 blur는 없다고 가정을 하는데, edge와 같은 pixel간의 경계(saliency)가 영상에 잘 나타나야함, 여기서는 보안영역의 예를 들면서 실제로 저해상도 이미지에 사람이 움직이거나 카메라가 움직여서 motion blur도 자주 나타나므로 deblur도 같이 풀어야 한다고 intro에서 주장.


잘 모르겠지만, deblur를 푸는 문제에선 resolution이 동일하다는 가정을 두고 푸는 듯. 즉, blur kernel의 inverse 형태를 어떻게든 구하는 방향으로 주로 접근하는 듯.

여기서도 GAN이 나온다. 확실히 최근엔 이런 inverse mapping과 같은 어떤 generative function을 구해야되는 문제면 어김없이 다 GAN이 나오는 것 같다.

여기서 구성한 network의 구조는 아래와 같음


여기서는 upsampling을 deconv layer로 한다. 그리고 당연하게도 artifact를 없애기 위해 바로 뒤에 conv를 붙여준다. 마지막 activation function은 hyperbolic tangent를 썼다고 한다. 영상을 -1, 1로 normalize한듯.
discriminator는 stride로 해상도를 2배씩 줄이고 마지막엔 fc layer를 썼다. 당연하게도 마지막은 sigmoid다.
한가지 특이한 것은, 짝수 크기의 kernel을 썼다는건데 논문에선 딱히 언급이 없다. 어차피 학습이 될테니 짝수여도 상관은 없겠지만 익숙하지 않은건 사실이다.

여기서도 original gan loss 이외에도 여러가지를 덧붙였는데, 특별할건 없고 pixel-level에서 차이를 minimize해서 영상에 나타나는 structure를 최대한 유지시키고, feature-level에서도 차이를 minimize시키도록해서 texture나 edge등 high level representation 정보를 최대한 유지시키려고 한다. (eq 3, 5)
feature level의 정보는 discriminator network의 특정 layer에서 뽑아오는데(다른 연구들과 조금 다른점이다), 이렇게 해서 loss를 구성해보면 eq6처럼 되는데 feature loss를 계산하는 두 번째 term을 maximize시키면, 학습 여부와 상관없이 weight값이 클수록 weight값이 작을때보다 해당 term은 무조건 큰값을 가지게 된다. 그래서 빠르게 발산해버리는 문제가 있다.

이걸 해결하기 위해 metric을 학습시키는 방법(triplet loss)을 도입했다.
generator는 문제 없으니 그냥 이전과 같이 update하면 되고 (eq7), discriminator는 발산의 문제가 있으니 이를 수정해서 eq8처럼 고쳤다.
eq8의 첫번째 term은 일반적인 gan loss이고, second term이 triplet 형태로 바꾼 loss term이다.
음수로 발산하지 않기 위해 relu를 썼고, (real, real)의 차이(거리)가 (real, fake)의 차이보다 더 적어지도록 discriminator를 학습시킨다. 즉, real vs. fake sample간의 거리가 margin(alpha)보다 커지도록 discriminator를 학습시킨다.

그리고 generator를 학습 시킬때 feature loss를 구하기 위한 discriminator의 layer와 discriminator를 학습 시킬때 feature loss를 구하기 위한 discriminator의 layer는 서로 다르다. (읭?)
generator를 학습 시킬때는 2번째 conv, discriminator를 학습 시킬때는 3번째 conv layer를 사용했다고 한다. 이유는 generator는 더 세밀하게 봐야하고 discriminator는 더 크게(의미적으로) 봐야 하니깐 그렇게 했다고 한다. (실험적으로 정함. 뒤에 관련 실험 내용있음.)


discriminator에서 깊은 layer로 들어갈수록 전체적인 structure만 남는다고.


그리고 실제로 몇번째 layer를 썼는지에 따라 PSNR 점수를 구해봤다. G와 D의 숫자가 layer의 위치.

그리고 하나의 framework에서 여러 개의 class(or application)을 다루기 위해, 원래 gan은 하나의 class 혹은 transfer만 할 수 있다, multi class gan이란걸 제안했는데. 하나의 generator와 K개의 discriminaotr로 만들었다고 한다. 별로 자세히 안읽음..

실험을 위해서 영상에 deblur kernel 적용시키고 downsample했다. 자세한 데이터셋 구성은 section 4 참고.

실험 결과는 아래와 같음




여기서 fine-tune은 super resolution과 deblur에서 관련 연구 하나씩을 골라와서 2개를 fine-tune했다고.
Sigle class GAN이 multi class GAN보다 더 뚜렷해보이는 것 같다.
PSNR 점수는 그냥 참고로만..

Data와 Model을 공개한 것 같긴한데, 해당 웹페이지에 접속이 안된다.
http://pan.baidu.com/s/1nuPkSL7 

#SuperResolution #Deblur #ICCV2017