はじめに〜Neural Style Transferとは〜
画風変換(Style Transfer)とは文字通り、イラストや写真の「画風」を自由に変換するという画像処理の一領域です。中でもNeural Style Transfer(NST)はそのタスクにディープニューラルネットワークを適用したものであり、視覚的・芸術的にも興味深い成果を出しています。
本記事では、NSTの概要を数式なしで簡単に説明し、この記事での実装を参考にしながら自分の選んだ画像に対してどんな結果が出るか試します。
NSTの概要
ある画像は、その描かれている内容物「コンテンツ」と、その画風「スタイル」によって規定されると考えられます。NSTの取り組む課題は、「コンテンツ画像」と「スタイル画像」を入力として、前者のコンテンツと後者のスタイルを併せ持つ画像を生成することです。
ところでこの構図は、どこかカードゲームの「UNO」に似ています。コンテンツが「数字」、スタイルが「色」に対応するとするならば、「赤の6」と「緑の3」の2枚のカードを入力として、1枚目のカードと同じ数字で、なおかつ2枚目のカードと同じ色を有する(ちょうど両者を仲介するような)カード「緑の6」を生成することが目標となります。
NSTでは、例えばコンテンツ画像そのものを初期状態として、細かな調整をピクセル単位で繰り返すことによって、所望の画像に近づけていきます。この調整にあたって、「コンテンツ画像とコンテンツが似ている」ほど、そして「スタイル画像とスタイルが似ている」ほど値が小さくなるような目的関数を設け、それを指針としてピクセルを(勾配降下法によって)変化させていきます。従って、二つの画像の「コンテンツの類似度」を測る指標と、「スタイルの類似度」を測る指標がそれぞれ必要となります。
コンテンツ損失
物体認識用に訓練されたディープCNNは、画像に描かれた構造の特徴抽出器として機能することが期待されます。そこで、同じCNNの特定の(深い)1層の出力をコンテンツ画像と生成画像とで比べ、その乖離度を平均二乗誤差で測ることによって両者のコンテンツが似ているほど小さい値をとるような目的関数を設計できます。
スタイル損失
テクスチャ情報は、ある層の出力の相関で表現されると考えます。この特徴相関は、具体的には、ベクトル化された特徴マップの内積を全通りとってできるグラム行列によって与えられます。内積の値は、似た方向を向くベクトル同士に対して大きな値をとり、逆の方向を向くベクトルに対して小さな値をとるため、ベクトルの各成分の値というより、二つのベクトルの関係性を司る量となります。グラム行列をスタイル画像と生成画像とで比べ、その乖離度を各成分の二乗誤差で計算することによって両者のスタイルが似ているほど小さい値をとるような目的関数を設計します。また、このグラム行列の差については複数の層のものを含めることで、大局的な配置ではない、静的でマルチスケールな特徴を捉えることができます。
最終的な目的関数は上記のコンテンツ損失とスタイル損失の重み付き和となります。生成画像の更新を繰り返すことで、目的関数が小さな値をとる、画風変換が施された画像を得ることができます。
実行結果
適当に見つけてきたフリー画像を使うと、次のような結果になりました。
コンテンツ画像

スタイル画像(ムンクの「叫び」)

生成画像
目的関数の推移
かなりそれらしい画像が生成できています。面白い結果が出そうな組み合わせを考えるのも楽しいですね。
おまけ〜東京ホテイソンの「画風○○か」シリーズに対する一考察〜
東京ホテイソンの持ちネタに、大喜利の回答に「画風○○か」とツッコむ次のようなシリーズがあります。

それでは試しに、「メスを持つ医者」の画風を「ゲルニカ」にしたものを生成して見ましょう。


とてもゲルニカらしくなっているとは言えません。
お次は、これです。

こちらも、色合いこそ近づいたとはいえ、モチモチの木の画風とは似ても似つきません。
これらの例で望ましい結果を得られなかったのは、「ゲルニカ」や「モチモチの木」の「画風」があまりに特徴的であり、それらをアイデンティファイする情報は「スタイル」というよりもむしろ「コンテンツ」の側に入っているからだと考えられます。つまり、画風変換といったときの「画風」は、我々が日常的に使う「画風」とは少々異なる意味を持ったものだとも言えそうです。とはいえ、ネットワークの設計次第では、もっと我々の感覚に近い意味での「画風」に変換できるような技術も可能なのかもしれません。
参考文献・サイト