Introduction
今回は、SRGANを用いた超解像について述べます。一般的に、超解像を行う際は補間を行っていくのですが、例えばopencvのresize関数の引数であるInterpolationを変えた時に、96✕96から4倍の384✕384へと解像度を高くした画像を以下に示します。以下に示すように、ギザギザが目立ったり、ぼやけています。そこで自然に見えるようにSRGANを用いて超解像を行いました。
Network Architecture
ネットワーク構造を上記に示します。GeneratorはResidual BlockとPixel Shufflerを主体としています。今回はResidual Blockは3つとしました。また、今回は4倍超解像を行う予定なので、Pixel Shuffler×2を2層挟みました。
Dataset
safebooruで画像をスクレイピングして、適当に512×512へと圧縮したものを18000枚集めました。そこから、384×384のサイズにランダムにcropして96×96にダウンサンプリングしました。従って、Generatorの入力を96×96の低解像度の画像、出力を384×384の高解像度の画像としています。
Experiment
損失関数はContent lossとAdversarial lossをそれぞれ重みつけして足したものです。Content lossはGeneratorの出力とターゲットにしている高解像度画像をVGG16に通した時の、各層の出力どうしの二乗平均誤差の和です。詳しくは下の式を参考にしてください。今回は、メモリを抑えるためVGG16のConv2_1、Conv3_1、Conv4_1の出力のみを考慮しました。
他ハイパーパラメータ等実験の詳細は以下に記します。
- バッチサイズは2
- 最適化手法はAdam(α=0.0002、β1=0.5)
- Adversarial lossの重みは1.0、Content lossの重みは0.001
Results
結果を以下に記します。右が超解像を行った結果です。Introductionで見られたギザギザやぼやけは見えていない状態です。
Bilinear補間やBicubic補間と比較した結果も以下に示します。明らかに綺麗に見えています。
SRGANは知覚品質(Perceptual quality)は高いですが、歪み(Distortion)は大きいです。上図のSRGAN出力もよく見ると目の造形が崩れている等があります。下の図はこちらの論文からの図ですが、Perceptual qualityとDistortionはトレードオフであると述べています。
実際に、Experimentsで述べた損失関数をターゲット画像とGeneratorの出力の二乗平均誤差のみにした場合(即ちDiscriminatorは考慮しない)のGeneratorの出力結果を以下に示します。Discriminatorを考慮した場合は線がはっきりしていますが、Distortionが目立ちます。それに対して考慮しない場合は、少々ぼやけているもののDistortionは少ないです。Discriminatorを考慮するとDistortionが増える理由は不明ですが、やはりPerceptual qualityとトレードオフになっているようです。
Summary
今回はSRGANを用いた超解像を行いました。従来用いられてきたBilinear補間やBicubic補間よりも自然な形にはなりましたが、Perceptual qualityとDistortionがトレードオフでどちらかを取る必要があると分かりました。
現状、どちらも取れる手法はないです。ですが、超解像の手法はSRGAN以降も出てきておりクオリティも上昇しています。例えば以下のようなResidual in Residual Dense Block(RRDB)を用いたESRGANや、Residual Channel Attention Blockを用いた手法もあります。次はこちらを検討していきたいと思います。
Environment
OS : Ubuntu 16.04 LTS (64-bit)
CPU : Intel(R) Core(TM) i5–4590 CPU @ 3.30 GHZ
GPU : NVIDIA GTX970
メモリ : 8GB