Posts List

[컴퓨터비전] 14. Image Restoration

Image Restoration

이번시간에는 영상 복원(restoration)에 대해서 알아보자.

영상에 Noise가 많거나, Low resolution이거나, 카메라가 흔들려서 Blurred 된 경우 등 영상을 복원시켜야 할 경우는 상당히 많다.

  • 노출시간을 길게 했을 때 object가 움직여서 나타나는 motion blur
  • 광원이 센서로 입력될 때, photodiode의 uncertainty에 의한 shot noise
  • 셔터를 누를 때 카메라가 움직이면서 발생하는 motion blur
  • ISO, 셔터 속도에 따른 over exposure / under exposure 
  • ADC과정 중 발생하는 low resolution, quantization noise
  • 영상 압축(jpeg)시 발생하는 정보 손실 (low resolution)

그리고 최근에는 image restoration을 위해 딥러닝을 활용하는 사례도 많이 연구되고 있다.


Classical image restoration

먼저, 딥러닝 이전의 restoration에 대해서 알아보도록 하자.

De-Noising

가장 기본적인 nose 제거 방법은 low pass filter를 적용하는 것이고, 다양한 Edge-aware filter에 대해 앞 포스팅에서 다뤘었다.

또 다른 필터로 Non-local means filter가 있다. Non-local means filter는 bilateral filter와 유사한데, denoising 시킬 픽셀 주변의 patch와 또 다른 영역의 patch를 비교해서 유사성이 높은 patch가 높은 가중치를 갖는 weighted average 방법이다. (bilateral filter의 확장형)


Denoising을 frequency domain에서 처리하는 방법역시 널리 이용되고 있다.

가장 간단한 방법은 frequency domain에서 고주파성분으로 보이는 픽셀을 smoothing시키거나 제거하는 방법이며, low pass filter의 역할과 정확히 같다.

다음으로 소개할 알고리즘은 2007년에 발표된 BM3D이다. 

BM3D는 noise pixel과 유사한 patch들을 찾은 다음 영상을 복원하고, 복원된 영상으로 한번 더 patch들을 비교해서 final estimate를 도출한다. 

이런 denoising as an inverse problem의 일반적인 풀이법에 대해 알아보자.

이 문제에서는 위와 같이 이미지는 noise가 없는 이미지 x와 Gaussian noise n이 합쳐진 이미지라고 가정한다. (Poisson noise로 가정했을 때 성능이 더 높아지기도 한다.)

여기서 prior는 noise가 없는 이미지의 분포를 의미하는데, 과거에는 품질이 좋은 수많은 이미지의 prior를 학습해서 denoising에 적용하는 방법이 일반적이었다.

그리고 prior를 잘 학습할 수록 denosing 효과가 큼이 실험적으로 입증되었다.


Super-resolution(SR)

low resolution의 이미지를 high resolution으로 복원하는 기술를 Super-resolution이라고 한다.

물론 가장 심플한 방법은 interpolation이지만, 단순한 interpolation 연산을 super resolution이라는 거창한 방법으로 보기는 어렵다.

SR도 inverse problem으로 풀 수 있는데,

위와 같이 현재 이미지(y)를 원본이미지(x)가 D 만큼 down-sampling 되고 random noise n이 더해졌다고 가정한다.

그리고 denoising때와 마찬가지로 prior(혹은 regularization)을 잘 찾으면 super resolution성능을 향상시킬 수 있다.

 

또 다른 approach로는 영상 합성 기술을 이용한 SR based on synthesis가 있다.

이 아이디어는 고해상도 이미지를 잔뜩 모은 다음 낮은 해상도 이미지로 압축시킨 뒤 두 이미지의 patch를 pair로 묶어 데이터베이스처럼 보관한다.

그리고 새로운 낮은 해상도 이미지가 입력되면, 그 데이터베이스에서 가장 유사한 patch를 찾아서 두 이미지를 합성해 해상도를 향상시키는 방법이다.

※ 이 방법은 high/low 이미지를 neural network로 학습해 super resolution하는 개념과 매우 비슷하다고 평가되고 있다.


Deblurring

Deblurring은 흔들린 사진이 주어졌을 때 선명한 사진으로 복원 시키는 작업이다.

Deblur 처리를 위한 일반적인 방법의 과정은 위 그림과 같이 Blurred image는 원본 이미지에 Blur kernel(=PSF : Point Spread Function)연산이 적용됐다는 가정을 하고, 이 PSF를 잘 찾아서 inverse blur를 취해주는 방법이다. (이것이 진정한 의미의 Inverse Convolution이다.)

하지만 일반적으로 사진만 보고 PSF를 찾는 것은 매우 어렵다. (Blind deconvolution)

그래서 예전에는 원인을 알고 있다면 (ex. 렌즈문제, 손떨림 문제) 그 원인 별 Blured 이미지의 분포를 보고 PSF를 원인별로 정의해두고 사용했었다. 가장 대표적인 방법으로는 MAP(Maximum posterior), Variational Bayesian, Edge prediction 등이 있다.


Image Restoration with DNNs

지금까지는 DNN을 활용하기 전 Classical한 방법으로 Image restoration하는 방법에 대해서 알아보았다. 그럼 여기에 DNN을 어떻게 적용할 수 있을지 살펴보도록하자.

Denoising with DNNs


DnCNN은 DNN을 denoising에 활용한 대표적인 사례이다.

※ Zhang et al., Beyond a Gaussian Denoiser: Residual Learning of Deep CNN for Image Denoising, IEEE Transactions on Image Processing, 2017

DnCNN은 학습을 통해 noisy를 표현하는 residual image를 생성하고, 원본에서 이 residual image를 빼면 원본의 noise를 제거할 수 있다. 그래서 residual learning이라고도 한다.

그리고 그 결과를 살펴보면, 기존에 prior 기반의 복잡한 방법보다 DnCNN과 같은 기법들이 denosing 에 더욱 효과적임이 실험적으로 입증되었다.


DnCNN과 달리 원본 이미지 내 유사한 패턴을 찾아서(self similarity) denoising에 활용하는 NLRN도 있다.

※ Liu et al., Non-Local Recurrent Network for Image Restoration, NeurlPS2018

위 두 방법은 원리는 다르지만 공통적인 준비사항이 있다. 바로 지도학습을 위한 pure image - noisy image가 set으로 필요하다는 것이다. 그래서 예전에서는 깔끔한 이미지에 인위적인  noise (ex. Gaussian noise)를 가해서 네트워크를 학습시키곤 했지만, 당연히 real noise의 분포와는 차이가 있어 성능이 그렇게 좋진 않았다.

SIDD (Smartphone Image Denoising Database, CVPR2018) : denoising 모델 학습을 위한 360장의 이미지 데이터베이스. ISO를 조절해가며 인위적으로 noise를 생성시켰다.


Super-resolution with DNNs

Super-resolution도 아주 핫한 red ocean 영역이다.

DNN을 가장 처음 super-resolution에 적용한 논문이 바로 SRCNN이다.

※ Dong et al. Image Super-Resolution Using Deep Convolutional Networks, ECCV 2014

그리고 고작 3-layer로 구성된 SRCNN이 기존의 방법들보다 월등히 성능이 좋은 것이 입증되면서 (속도, 해상도 측면에서 모두) 세간의 화제를 불러일으켰다.

그 이후로 super-resolution에 DNN을 적용시키는 연구가 활발히 일어났고, 2016년에 VDSR이 발표되었다.

VDSR은 layer의 층수를 늘렸을 뿐만 아니라, DnCNN처럼 residual learning 방식을 적용했다. (DnCNN은 original - residual 연산을 하지만 VDSR은 original + residual 연산을 한다.)

※ Kim et al., Accurate Image Super-Resolution Using Very Deep Convolutional Networks, CVPR 2016

SRGANGAN을 super-resolution에 활용한 사례이다. GAN은 적대적(adversarial) 네트워크 2개를 학습시키면서 경쟁시키는 구조인데, [머신러닝/딥러닝 : GAN]을 참고하거나, 추후에 다를 포스팅에서 더 자세히 다루도록 한다.

※ 재미있는 점은 사람이 봤을 때는 SRGAN이 원본이미지와 유사하게 복원이 잘 된 것처럼 보이지만, 수치상으로는 SRResNet, bicubic이 원본가 훨씬 유사하다고 나온다.

※ Ledig et al., Photo-Realistic Single Image Super-Resolution Using a Generative Adversarial Network, CVPR 2017

마찬가지로 super-resolution with DNN에서도 학습을 위한 데이터베이스가 필요한데, 이 때는 noise 문제보다 훨씬 수월하게 만들 수 있다. 왜냐하면 좋은 화질의 이미지를 down-sampling 시키거나 사진을 찍을 때 고/저해상도 각각 촬영하면 되기 때문이다.

※ RealSR : 카메라로 동일한 object를 다른 해상도로 촬영해서 만든 데이터베이스
    Cai et al., Toward Real-World Sing Image Super-Resolution : A New Benchmark and A New Model, ICCV 2019


Deblurring with DNNs

Deblur도 학습데이터만 주어진다면 네트워크를 학습해서 Deblurred image를 생성할 수 있다.

※ Nah et al., Deep Multi-scale Convolutional Neural Network for Dynamic Scene Deblurring, CVPR 2017

마찬가지로 데이터셋을 마련하는 것이 매우 중요한데,

위 논문에서는 GoPro를 이용해서 high speed로 촬영한 뒤, 여러 인접 이미지를 average취하면서 인위적으로 blurred 이미지를 생성하였다.

또 다른 논문에서는 LSTM의 구조를 인용한 Scale-recurrent network도 있다. 다만 추후에 저자들도 LSTM 구조는 사실 별로 필요없다는 발표를 하기도 했다.

※ Tao et al., Scale-recurrent Network for Deep Image Deblurring, CVPR 2018

그리고 GAN을 기반으로 한 deblurring 기법도 시도되었다.

※ Kupyn et al., DeblurGAN : Blind Motion Deblurring Using Conditional Adversarial Networks, CVPR 2018

Deblur에서도 역시 학습 데이터베이스가 중요한데, 임의의 blur kernel을 사용하거나 high-speed 카메라를 활용해 blurred image를 임의로 만들어내는 것이 일반적이다.

model base : kernel 연산으로만 가능한 한정된 blur를 만들 수 있다.
high-speed camera : 카메라 흔들림, object흔들림 등 더 넓은 범위의 blur를 다룰 수 있다.

하지만 아쉽게도 현실 blur 의 양상은 매우 복잡해서 위의 두 데이터베이스로도 모두 커버하기가 쉽지가 않다. 그래서 현실 세계를 반영하는 데이터셋을 마련하는 연구도 중요한 연구분야로 자리잡고 있다. (ex. 2개 카메라를 설치한 뒤 셔터속도를 다르게 셋팅한 뒤 촬영하는 방법)

※ Rim et al., Real-World Blur Dataset for Learning and Benchmarking Deblurring Algorithms, ECCV 2020





댓글 쓰기

1 댓글