広島大学で社会基盤(土木)を専攻している3年生です。
現在は1年間休学して建設系のIT企業でインターンをしています。
今回は超解像度のGANモデルであるSRGANを拡張させたモデルESRGAN(Enhanced Super-Resolution Generative Adversarial Networks)を実装してみた比較結果と試したコードを載せたいと思います。
ESRGANとは
ESRGANとは2018年に発表されたモデルで上記でも述べましたが2016年に発表されたSRGANの拡張版です。
SRGANの概要については以前記事載せたので主にどのような点が拡張されたのかをまとめてみたいと思います。
論文を参考にしています。
・全てのBatchNormalization層の削除
BatchNormalization層をなくすことで超解像度の評価関数であるPSNR(Peak Signal to Noise Ratio:ピーク信号対雑音比)が向上し、計算の複雑さを軽減させメモリの削減されることが証明されています。理由はBatchNormalizationはバッチごとに平均・分散を求めて学習しますがtestデータで推論を行った時に平均と分散に差が生じるためアーティファクトが入ってしまうからです。
・Residual Block を Residual in Residual Dense Block(RRDB)に置き換える
RRDBに置き換えて層を深くしています。深いネットワークでも学習ができるように残差をResNetのように足算を行うのではなくDenceNetと同様に連結させることで可能にしています。また、残差スケーリングを定数を0と1の間の定数を乗算することにより学習の不安定になるのを防いだり、最初にパラメータの初期値の分散が小さい方が残差構造が学習が簡単になるなど工夫をしています。
・Relativistic Discriminator
識別器の学習では本物を1、偽物を0として出力するように学習を行うため本物画像でしか学習を行うことができません。本物・偽物画像両方からシグモイド関数の出力を受け取ります。両方の損失を平均したものを学習するため本物・偽物画像の両方から学習を行うことができます。
・Perceptual Loss
活性後ではなく活性化前に特徴を制限を行っています。SRGANではReLU関数の出力を用いていましたがこれでは画素情報が失われてしまうからです。この問題を解消すると「深いネットワークでは特徴量がまばらになりやすい」「明るさが不安定になってしまう」などの問題が解消できます。
今回のデータセット
今回使用している画像はkaggleで公開されている衛星写真のデータセットです。
画像のリンク
SRGAN と ESRGANの出力結果
実際両方200epoch学習させた結果です。
右から入力画像、推論結果、オリジナル画像です。
ESRGAN
SRGAN
両方ともそれなりに解像度が上がりそれなりに綺麗な画像になっているように見えます。
ただ決定的な違いとしてSRGANではオリジナル画像と比べて全体的な色彩が明るいように見えます。ERGANではオリジナル画像と比べてそのような違いは見られませんでした。もしかしたら活性化前に特徴を制限を行っているため明るさの不安定さが改良されたことが原因かもしれません。
実装コード、参考資料
実装で参考にしたGithub
自分が実装したGithub
このディレクトリに画像ファイルをアップロードして実行してください。
論文
参考にしたサイト