終末 A.I.

データいじりや機械学習するエンジニアのブログ

Prisma で使われているという Neural Style を試してみた

7月くらいに話題に上がっていました Prisma ですが、皆さん覚えていらっしゃるでしょうか。Prisma では、A Neural Algorithm of Artistic Style というアルゴリズムをベースに、面白画像を生成していると言われていますが、10月の頭にその高速化手法であるPerceptual Losses for Real-Time Style Transfer and Super-Resolution が著者自身の手によりソースコードとともに公開されました。ちなみに論文自体は3月ごろには arxive に公開されており、yusuketomoto 氏による Chainer 実装 がほぼ同時期に公開されています。この手法では、低解像度の画像であればGPUを使用してほぼリアルタイムで Prisma のような画像を生成することが可能になるということで、ベース手法より実用性があがっています。

この記事ではその2つのアルゴリズムの中身がどのようになっているのかや実行速度などを比較してみたいと思います。

まず、ベース手法である A Neural Algorithm of Artistic Style ですが、こちらはコンテンツ画像とスタイル画像の2つをもとに、ImageNet などで学習させた Pre-Trained なモデル(論文中では VGG-19 のモデル)を使用して、スタイル画像から抜き出したスタイルを適用したコンテンツ画像を生成するというものです。

ランダムに生成した画像とコンテンツ画像およびスタイル画像をDCNNに入力し、生成画像とコンテンツ画像の特定層の出力の差と、生成画像とスタイル画像の特定の層までの出力の差を誤差として、SGD を生成画像に適用することにより生成画像をだんだんと期待する出力画像に近づけていくという処理を行っています。そのため一つの画像を生成するためには、500イテレーションや1000 イテレーションなどの大量の DCNN の学習処理を行う必要があり、どうしても画像の生成に時間がかかってしまいます。

一方で、改良版である Perceptual Losses for Real-Time Style Transfer and Super-Resolution は、学習により画像そのものを生成するのではなく、コンテンツ画像を入力とし、その画像に特定のスタイルを適用した画像を出力するような DCNN を生成することを学習の目的としています。上記の Neural Style で使用したような Pre-Trained のモデルを誤差計算用に用い、そこで計算された誤差をもとに画像を生成するためのニューラルネットワークを学習させていきます。

そのため画像の生成については、一回きりの順伝搬計算ですむので非常に高速にスタイルを適用した画像を生成することができます。スタイル毎にモデルを生成しなければならない点、モデルの学習に大量の時間とデータが必要になるというデメリットはありますが、実際にサーバ等で動作させることを考える場合はこちらの手法を取るほうが現実的でしょう。

以下はそれぞれの手法を AWS の g2.x2.large インスタンスで試してみた結果となります。適用スタイルとしては、Perceptual Losses for Real-Time Style Transfer and Super-Resolution で用意されているスタイルのうちモザイクのスタイルを適用しています。

実験には、Perceptual Losses for Real-Time Style Transfer and Super-Resolution の著者の一人である、jcjohnson 氏が公開している fast-neural-style という Torch のコードを使用しています。

ベース手法の方は、下記のように500イテレーション回して、GPUで3分17秒ほどかかります。

th slow_neural_style.lua -style_image images/styles/mosaic.jpg -content_image neko.jpg -output_image slow-ret.jpg -gpu 0 -backend cuda -use_cudnn 1 -optimizer adam -num_iterations 500 -save_every 100

一方で、fast-neural-style の方は、下記のようにモザイクスタイルのモデルを指定して、GPUで10秒ほどで完了します。実際はモデルのロードが完了しているような環境で実行するでしょうから、PCのスペックによってはデモにもあるようにほぼリアルタイムに変換を行うことも可能です。

th fast_neural_style.lua -model models/instance_norm/mosaic.t7 -input_image neko.jpg -output_image fast-ret.jpg -gpu 0 -backend cuda -use_cudnn 1 -cudnn_benchmark 1

変換結果は下記のようになりました。上から、ぱんくたそ さんから拝借してきたフリー素材の猫画像、ベース手法で変換した結果、高速化版で変換した結果の画像となります。高速化版はベース手法に比べてスタイルの適用だけでなくコンテンツ画像の利用もうまいこと行えていることがわかります。このあたりパラメーターチューニングの問題なのか、変換用の DCNN をかますことにより発生しているのかよく分かっていませんが、ちょっと動かすだけでこのクオリティの画像が生成されるのは驚きですね。

好きなスタイルを適用するためのモデルを生成するためのコードも公開されていますので、興味のある方はぜひ試してみてください!

元画像:

f:id:KSKSKSKS2:20161030002417j:plain:h200

ベース手法で変換した画像:

f:id:KSKSKSKS2:20161030002430j:plain:h200

高速化版手法で変換した画像:

f:id:KSKSKSKS2:20161030002438j:plain:h200

参考