LearningLog

主に機械学習について学んだことを残していく予定

Artistic-styleでムンクの叫び風のドラえもんを作る

やりたいこと

入力した画像を他の画像の作風(style)で描き直す.以下の例では猫の写真をゴッホ風に描き直している.

https://no2147483647.files.wordpress.com/2015/12/pogo-vangogh-mxnet_600px.png?w=1008

Deep learning for hackers with MXnet (2): Neural art | Number 2147483647

DNNを活かした面白い技術だと思うのでそれっぽい顔をしたドラえもん(アニメ)をムンクの叫び風に描き出してみる.

Artistic styleの基本

参考:A Neural Algorithm of Artistic Style

  • 2つの画像をVGGモデルに入力する.1つからContent,もう1つからStyleを抽出する.
  • content画像を入力し,最後の畳み込み層から得た出力をcontent representationとする.後段の層の出力を利用するのがポイント.後段であればある程より画像の抽象的な特徴を捉えているから.
  • style画像を入力し,それぞれの畳み込み層から計算したGram Matrixをstyle representationとする.Gram Matrixは画像内の位置的情報を取り除いてテクスチャ情報を抽出できるようだが,何故上手くいくかはよくわかっていないらしい.
  • content画像と同じrandom white noise画像をモデルに入力して,先程抽出した2つのrepresentationとの誤差を取り,noise画像を誤差逆伝播法で変更していく.

要は2枚の入力画像をCNNに通して一度抽象的な形にし,そこから画像を生成し直すということか.入力画像自体を変化させて最適化するというのは面白い.DNNの応用範囲の広さを改めて感じた.

 

結果

Practical Deep Learning part2の講義資料を元に実装してみた.part2はyoutubeで見られるが,まだ公開準備中という段階らしいのでリンクは貼らないでおく.

f:id:budti:20170718002759p:plain

上手くいったのかよくわからない結果,元の画像が顔に寄り過ぎか?contentとstyleのlossの比重など,ハイパーパラメータが多いので調整によってはもっと良い結果が得られるだろう.すまんドラえもん

Tips
  • artistic-styleではMax pooling(ある領域の最大値を得る)よりも,Average poolong(ある領域の平均を得る)方が良い.Max poolingは元の画像情報を失ってしまうため.
  • Keras modelクラスのget_layerで名前あるいはindexで指定した層を得られる.layerはoutputメソッドでその段階での出力を得られる.今回のように中間層の出力を利用する場合に便利そう.