DCGANでさくひまの子供を推定する ~ キャラクターのベクトル演算 ~
結果
ひまわり <-> さくらこモーフィング
コードは以下で公開
DCGAN
以下の2記事のように、昨年末はDCGANの効果のすごさを感じましたね。DCGANの仕組みについては両記事をみてもらうとして、この記事ではDCGANを用いて、既に存在する画像の平均画像を生成します。
画像からパラメタの算出
DCGANでは、"Generator: パラメタから画像を生成する"と、"Discriminator: 画像が機械的に生成されたものかどうかを判別する"の2つを学習します、詳しくは前述の記事を参照。このGeneratorの学習済みモデルは前述の記事で公開されているので、これで遊べるぜ、ってやつです。ところで、今回はひまわりさんとさくらこさんの子供の顔がみたいんじゃーという欲求を満たしたいんですが、そのためにパラメタチューニング職人になってひまわり画像を生成するパラメータを探したりはしたくないです。
ちょうどそういうパラメータ探しこそ機械学習が得意とするところゆえ、学習しておきましょう。つまり、"Vectorizer: 画像を入力として、Generatorによってその画像が再現されるパラメタを出力する"を学習します。コードは以下。
https://github.com/Hi-king/chainer-DCGAN/blob/master/bin/test_vectorizer.py
学習済みモデルは以下に公開します。
モデルは、Discriminatorの出力をGeneratorの入力と同じ100次元にするだけです。学習用データセットは、ランダムなパラメータと、Generatorによって生成された画像をペアとして、画像からパラメータを出力するようにトレーニングします。ただし、DCGANの学習に使われたデータセットは、かなり綺麗に顔が切りだされているようで、ちょっとでも顔の位置がずれている画像だと、上手く再生成(後述)出来ませんでした。なので、Vectorizerで学習するデータセットでは、生成された画像を拡大縮小、上下左右移動をランダムに行います(Data Augmentation)。
本当にこのVectorizerでパラメタの学習が出来たかを確かめるために、画像A -> Vectorizer -> Generator -> 画像A'という再生成をやってみます。
ココアさん再生成
チノさん再生成
さすがに服装まで綺麗に生成することは出来ませんでしたが、無事にココアさん、チノさんだと言って納得してもらえる画像が生成出来たと思います。
モーフィング
Vectorizerでベクトルに落とし込めた、ということは、2人の距離の中間に存在する画像、というのも生成できるわけですね。やってみましょう。
ひまわり <-> さくらこ
左側がひまわりさん100%、右側がさくらこさん100%です。中間だと2人のベクトルを50%ずつ足し合わせた画像ということになります。ひまさくの子供はこういう顔になるんでしょうか(^_^)
ココア <-> チノ
さきほどの二枚のイラストからも中間画像を作ってみます。2人のベクトルの中間だと、紫髪の子になりそうですね。
ところで今回の仕組みとは違うんですが、nico-opendataでも、同様に二枚の画像の中間画像の検索機能があります。これによると、中間画像は漣ちゃんのようで、まぁピンク、紫あたりが中間画像になってて、DCGANと似たような特徴にはなってるかなぁ、と言った感想ですね。
複数人の平均画像
2人の画像の中間が作れるんだから、もっといろいろ混ぜてみたくなりますね。と、いうことで、ニコニコ静画で"ラブライブ"タグで引っかかった画像100枚の中間を作ってみました。生成に使ったパラメタは以下。100枚ないのは、顔認識に成功したもののみを使っているからです。
中間画像は
真姫さんだコレー
と、いうことで、皆の特徴をもっているというよりは、西木野真姫さんになってしまいました。ナニソレイミワカンナイ