はじめに
最初にご報告があります。我が家の猫ちゃんは非常に可愛いです!!!普段もよく写真を撮っています。
そして今日、平成最後の日において、この子に関する記事を書こうと思いました。
ということで、今回は我が家の猫ちゃんの写真で遊べるNeural Style Transfer(NST)について記事を書きます。
あくまでも個人の趣味なので、間違いがあったらご容赦ください。
NSTの歴史
調べてみたところ、Qiita上にすでにDeNA社のエンジニアによる素晴らしいまとめ記事が存在します。非常にわかりやすく書いてあります。良かったらチェックしてみてください。
NSTの発展はGatys et al.から始まり、キーアイディアは、pre-trainedの画像認識用の内部のConv層の出力であるfeature mapの統計情報(平均、分散など)が画像の画風を表現できるということです。
最初はoptimizationベースの手法が多いでしたが、その後、Feed-forward networkを生成器として使った研究が主流となりました。その中の代表的な手法とそれらの説明はDeNA社の記事に書いてあるので、ここでは詳しく比較しません。
今回はその中で割と簡単なAdainを実装したので、ここでは簡単に補足説明します。
Arbitrary Style Transfer in Real-time with Adaptive Instance Normalization
この手法はAdaptive instance normalization/Adainを使うのが特徴です。Adainを理解するには、まずInstance normalizationを理解しなければなりません。
しばしば, Instance normalizationとBatch normalizationがよく比較されますが、一体どういう違いがあるでしょう?
一般的なCNNの中間層の出力を考えます。そのサイズは(b, c, h, w)としましょう。では各Normalization手法はどういうところで正規化し、どういう平均と分散が得られるかをまとめてみましょう。
-
BN
- (b, c, h, w)のb, h, wに対し、平均と分散を計算します。
- shape=cの平均と分散のベクトルが得られます。
-
IN
- (b, c, h, w)のh, wに対し、平均と分散を計算します。
- shape = (b, c)の平均と分散の行列が得られます。
-
LN(ついでにLayer Normalizationも説明しましょう)
- (b, c, h, w)のc, h, wに対し、平均と分散を計算します。
- shape = bの平均と分散のベクトルが得られます。
この論文の提案手法は何をしたかというと、真ん中にAdain層が存在するVGGベースのAutoEncoderを学習させます。Conten画像とStyle画像をそれぞれEncoderに入力して、ここでは、それぞれの出力のfeature mapをC_feature, S_featureと呼びましょう。それぞれに対して、IN手法のように、C_featureとS_featureの平均と分散を計算します。最後に、C_featureをC_featureの平均と分散で正規化して、S_featureの平均と分散で逆正規化します。言い換えると、C_featureの平均と分散をS_featureのものに変えます。なぜかというと、Gatys et al. による、feature mapの統計情報が画風を表せるという理由からです。
元論文の実装はTorchでやってましたが、今回はAdainをPytorchで一から実装しました。CodeはGithub上に載せておきます。よろしければチェックして、スターをください。
結果
結果図をいくつか載せておきます。また、画風の具合を調整する機能も実装したのですが、よろしければぜひそれも試してください。
まあまあって感じですかね。
我が家の猫ちゃんはどうなるの?
さて、本題に入りますが、今回のお遊びは我が家の猫ちゃんを他のスタイルの猫ちゃんに変えることなので、一体どうなるでしょう?
画風の定義が難しいと思いますが、まあまあできているからいいやと思いました。
ということで、もし面白い画風の画像があったら、連絡していただきたいですね。何ができるか気になります。
これから
一応、DeNA社の記事を沿って、とUniversal Style Transfer via Feature Transforms、 Fast Patch-based Style Transfer of Arbitrary Styleと Avatar-Net: Multi-scale Zero-shot Style Transfer by Feature Decorationも実装していくつもりです。興味のある方は私に声をかけてください。仲間も大歓迎です。一緒に遊びましょう。