Twitter社が発表した超解像ネットワークをchainerで再実装

f:id:Hi_king:20161218093554p:plain

この記事は Chainer Advent Calendar 2016の18日目の記事です。昨日は@zacapa_23さんのPokemonGANでした。僕もDCGANを使って百合漫画の解析に活かそうとしたことがあるので、なんだか親近感がわきます。ちなみにこの記事もDCGANがらみです。

数年前にニューラルネット超解像を行う研究が発表されてから、近年のディープラーニングブームの中で、特に企業の研究として(学習型一枚絵)超解像が発表されています。国内でも、特にイラストへの応用として、waifu2xという実装が注目を浴びたりしました。GitHub - nagadomi/waifu2x: Image Super-Resolution for Anime-Style Art

さて、いくつかある論文の中で、今回はTwitter社が9月に公開したもの( Photo-Realistic Single Image Super-Resolution Using a Generative Adversarial Network )を実装してみました。

github.com

この論文を選んだ理由は、ここ1年くらいのトレンドを余すことなく押さえた、という印象の、素直に"強い"実装だからです。以下に、このネットワークの特徴を記します。

ネットワークの構造と4つの工夫
f:id:Hi_king:20161218054443p:plain
  • 工夫1. ResNetを用いて、微修正をたくさん行う非常に深いネットワークになっている
  • 工夫2. Content Lossを用いて、従来の最小二乗誤差を用いたものよりも、"主観的"な超解像を行う
  • 工夫3. 加えてAdversarial Lossを用いて、更に"主観的に"
  • 工夫4. Deconvolutionの代わりにPixel Shufflerを用いて高速かつ綺麗な画像を生成

以上4点が全て、この一年ほどで独立に現れた技術で、この論文ではそれを全て実装しています。いかにこの業界の技術の伝搬が早いかがわかりますね。

工夫1. ResNetによる深い微修正ネットワーク

convolutionを通る/通らないの2つのパスがあるResidual構造(論文Fig4)
f:id:Hi_king:20161218034159p:plain

原論文は "Deep Residual Learning for Image Recognition" 。 MSRAから発表され、2015/12の画像認識コンペティションで猛威を振るったネットワークの論文で、今年度は様々な問題に適用されました。ネットワークを深くするときに、必ずしもその追加分のレイヤーを使わず、バイパスするルートも設けることで、簡単なネットワークから深いネットワークに滑らかに変化するものです。

今回の論文の生成ネットワーク(論文Fig4)
f:id:Hi_king:20161218033922p:plain

超解像の問題は、元の画像とほぼ同じだが、ディテールが異なるものを出力する、という性質上、非常にResNetと相性がいいと考えられます。今回の論文では、原論文にならった、Layer2つごとにバイパスする経路のほか、ほぼ全てのLayerをskipする(!?)特別な経路も設けています。

工夫2. Content Lossによる主観的な学習

つぎの工夫は、"超解像が何を目標とするか"の問題設定の修正です。 ここで参考とする論文は、これもまた大きく話題となった、Neural Artの論文です。 この論文の中で、"元画像のざっくりした見た目を保存しながら別の操作を加える"ために使われていたのがContent Lossです。

超解像が抱えている決定不能性 最小二乗誤差基準の超解像でやりがちなこと
f:id:Hi_king:20161218041451p:plain f:id:Hi_king:20161218040601p:plain

さて、ここで、超解像に対して筆者らが抱いている問題意識を説明すると、上の図のように、本来、低解像度画像から超解像度画像を生成する際には、しばしば、どういう線が正しいか決定できない場合が存在します。このときに、ピクセル単位の二乗誤差を最小化するよくある手法では、ある種"平均的な画像"が作られてしまいます。平均的な画像は、基本的にぼやけてしまいがちで、本当の高解像度画像とは簡単に見分けられてしまいます。

赤のどれかを作りたいのに、誤差の最小化で青が作られてしまう(論文Fig3)
f:id:Hi_king:20161218051106p:plain

そこで、まず導入したのが、ピクセル単位で無理やり合わせようとすることをやめて、もっとざっくりした特徴を表してくれるContent Lossを利用するものです。なお、詳細はNeural Artの原論文を参照していただきたいのですが、ここでいうContent Lossというのは、画像認識のためにトレーニングされた別のネットワークに、超解像と高解像の2つの画像を通した後の、中間層同士の二乗誤差を指します。

ところで、Content Lossの最小化問題にしたことで得られたのは、"だいたいあってる画像"を作る能力であり、 それだけでは片手落ちで、やはりぼやけた画像になってしまいます。 次に説明するAdversarial Lossを加えることで、ぼやけた画像を許容しないようなロスの設計にします。

工夫3. Adversarial Lossによる"画像生成"の"超解像"への応用

ちょうど1年前、アドベントカレンダーで盛り上がった論文を皮切りに、今年は画像生成ネタが多いに流行りました。このDCGANの亜種がいくつも提案されたり、学習を安定させる方法が検討されたり、単に生成するだけでなく文章などを入力に与えらたりなど、とにかくGANまわりでは話題を事欠かない年でした。

qiita.com

qiita.com

筆者らが注目したのは、GANの"データセットと出力が見分けられないように学習する"というアイデアは、まさに、超解像の目的を、美しい画像を作り、"超解像と高解像を見分けられないように人間を騙す"というところにおけば、そのまま流用可能なところです。ただし、これが本当にすべての超解像の目的かは疑問の余地はあります。たとえば防犯カメラの超解像を犯罪捜査に使う、などの目的を考えると難しいところでしょう。

Adversarial Lossによる学習
f:id:Hi_king:20161218065617p:plain

この図に示すように、見分けがつかない画像を生成するネットワークは、素直にGANの仕組みをつかって実装できます。ただし、実は、これだと、低解像度画像に全く関係のない超解像度画像を生成してしまいます。なので、工夫2のContent Lossと適切に混ぜ合わせて利用します(論文では1:0.00001と書いてある)。

これによって、前の節で問題とした、平均っぽい画像を作るからぼやける問題が、解決する、というお話です。

工夫4. Pixel Shufflerによる高速かつ美しい画像生成

最後に、これも最近のトレンドなので紹介しておきます。 たとえば前節で紹介したDCGANの論文などでは、低次元の抽象的な特徴から、画像を生成するために、Deconvolutionを用いているのですが、最近幾つかのタスク(物体認識など)で、あまりこの仕組みは、精度も速度も上手くないと考えられつつあります。

この論文では、低解像度から画像サイズを大きくする過程では、同じように超解像に取り組んでいる論文で提案された、PixelShuffler Layerを利用しています。

チャンネルの深さをサイズに変換するPixel Shuffler
f:id:Hi_king:20161218043005p:plain

PixelShuffler Layerでは入力のチャンネルをそれぞれ別Pixelとして展開するため、処理がメモリコピーだけで高速、かつ、オーバーラップもないので学習が上手くいっていればぼやけにくいと考えられます。

実験結果

さて、ここまで長々と説明してきたネットワークが、いかほどの能力か、というのを紹介します。

トレーニングには100万枚ほどの画像を利用し、3エポックほど回しています。 そのうち2エポックはLossは従来の二乗誤差、最後の1エポックをAdversarial+Content Lossで回してます。

イラスト編

学習データは、ニコニコ静画から100万枚ほど

条件 結果
入力低解像度 f:id:Hi_king:20161218081357p:plain
二乗誤差最小化で超解像度(工夫1と2のみ) f:id:Hi_king:20161218081417p:plain
工夫1〜4を全部入れた超解像 f:id:Hi_king:20161218082232p:plain
正解高解像度 f:id:Hi_king:20161218081438p:plain

工夫1と2のみの結果でかなりいい絵が出来てるようにみえます。 一方でLossの改良は、たしかにぼやけるのを消そうと頑張ってるのはわかるんですが、今度は画面全体に幾何学的なノイズを載せる安易な出力に陥っているように見えます。 これがAdversarialとContentの割合調整が悪いのか、まだまだ学習が足りないだけなのか、などはしょうじきわからなです。。あるいはイラストではまだGANが高解像度に働かない問題のせいかもしれません(自然画像と違ってイラストはピクセルあたりの情報量が少ない)。

実写編

学習データは、Imagenetから200万枚ほど

条件 結果
論文で使われてるサンプル
入力低解像度 f:id:Hi_king:20161218075109p:plain
二乗誤差最小化で超解像度(工夫1と2のみ) f:id:Hi_king:20161218074846p:plain
工夫1〜4を全部入れた超解像 f:id:Hi_king:20161218074755p:plain
工夫1〜4を全部入れた超解像度(論文に乗ってる版) f:id:Hi_king:20161218081029p:plain
正解高解像度 f:id:Hi_king:20161218074039p:plain
新たに作ったサンプル 夢のなかで香る(バラ)|フリー写真素材・無料ダウンロード-ぱくたそ
入力低解像度 f:id:Hi_king:20161218085850p:plain
二乗誤差最小化で超解像度(工夫1と2のみ) f:id:Hi_king:20161218085904p:plain
工夫1〜4を全部入れた超解像 f:id:Hi_king:20161218090051p:plain
正解高解像度 f:id:Hi_king:20161218090104j:plain

こちらも、工夫1と2のみの結果でかなりいい絵が出来てるようにみえます。 また、こちらではLossの改良が、イラストよりは差が出ているように見えます。 ただ、大きな問題として、論文と同じデータセットで試してみたのに、大分論文より結果が悪く(というか論文の結果がとんでもない。。すごい)、実験環境なりパラメタなり実装なりをもう少し見直さなきゃなぁというところです。また、自分で低解像度画像を作ったものの方が、結果がいいようにちょっと感じるので、もしかしたら縮小時のアルゴリズムに強く依存するものを学習してる可能性もあり、検討が必要かもしれません。

まとめ

Twitter社から発表された超解像の論文を実装しました。この論文は今年のトレンドであるネットワーク構造を上手く取り入れており、超解像自体を利用しない人も参考にするところがあると思います。ResNetは当たり前のことになりつつありますが、Adversarial Lossを直接的な画像生成以外の問題に使うのは、他の問題でも検討する価値があると思います。

ちなみに発表時点では妥当な手法であることはまちがいないんですが、いまなら、pix2pix のネットワークとの比較が必要になるかと思います。僕も、機会を見つけてpix2pixでの超解像とも比べてみたいと思います。