にほんごのれんしゅう

日本語として伝えるための訓練を兼ねたテクログ

ディーブラーニングのDCGANを用いたmangaキャラクタの作成

ディーブラーニングのDCGANを用いたmangaキャラクタの作成

f:id:catindog:20160830175153p:plain

生成したなんかアンニュイなキャラ

 

 人間のみの権利と思われていた創造と創生の技術がついにマシーンが行えるようになりました。去年の今頃にDCGANという手法で画像を人間が、ぱっと見ただけではわからないほど、それっぽいベッドルームの画像の生成が行えるようになりました[1]。

 人工知能がテキストと音楽以外の画像描画という側面において進出した第一歩ではないのでしょうか。見ていてすごいなと思ったものです。

f:id:catindog:20160830161720p:plain1. 自動生成されたベッドルームの画像のあれこれ

 特徴量としてベクトル情報を得られることから、画像で得た特徴量を利用して類似製品をレコメンドに用いたらどうかなどの先行研究もありました[2]

 

あんまり商業的に活躍しているとは言いがたいDCGAN

 DCGANってなにかおもしろいことをできそうなんですが、お金に直結するような発想になかなかなりにくいです。

 先行事例として以下のようなものを見つけました。

理論

 GeneratorDiscriminatorの2つのニューラルネットワークのモデルがあって、Generatorが画像生成モデル、Discriminatorがその画像が本物かどうかを判別するモデルになっています。

 数式の理解に関しては、上記のリンクに大部分を譲ることになりますが、簡単な理解だけを示しておきます[3]

 関数の定義です。

D(x): 入力値xに対して、それが真の分布を持つかどうか

G(z): 一様乱数の入力値zから画像分布を作成

P_delta(x): 真の確率分布
p_g(x): Generatorによる確率分布

f:id:catindog:20160830161812p:plain

 これをJSダイバージェンスで示すと、以下のように示すことができます。

f:id:catindog:20160830161824p:plain

 Discriminator側は判別性能を上げることが目的であるため、式を最大化しようとします。比べて、Generator側はそれっぽい画像を作ることを目的とするんで、式を最小化しようとします。

 更新パラメータは以下のようになるのですが、画像の生成タスクと、判別タスクは必ずしも同様に学習が進むわけでないようです。判別タスクのほうがずっと収束が早い。

f:id:catindog:20160830161855p:plain

 そのため以下の様に式を変形しているようです。

f:id:catindog:20160830161906p:plain

 この式をいじくると、以下の式のp_g, p_delta間のKLダイバージェンスの最小化問題と捉えることができるそうです。

f:id:catindog:20160830161920p:plain

画像生成モデルのニューラル結合モデル

f:id:catindog:20160830161953p:plain

 図4. 論文ママ

 わずか100次元のインプットから、通常の画像判別タスクとは逆方向に接続していき、徐々に大きな空間にマッピングしていきます。

 

実際に画像生成タスクを行ってみる

 何はともあれ、画像生成タスクは非常に興味深いことこの得ない内容であります。実際にやってみましょう。

 簡単に動かすことができないか、様々なコードを見たのですが、chainerの有名なものはGPU計算をできるグラボをもっていない&CPUモードでは動作が重く、Torch7ではLuaを覚えるコストを躊躇したため、TensorFlowの実装を参考にしました。

 参考にしたコード: https://github.com/carpedm20/DCGAN-tensorflow

 

 漫画のキャラを自動的に生成できたら面白いなと思い、幾つかの「ダンジョン飯」「ワンピース」「キングダム」という電子書籍で買っていた漫画をひたすらスクショを取り、アニメ顔抽出スクリプトで切り出して112pxに正規化して、画像を1200枚ほど用意しました[4]。理想を言うならもっと枚数必要です。

 

 本番と違うのは出力結果を、90pxに拡大して、バッチサイズを100に拡大、サンプル数の拡大ぐらいです。すぎゃーんさんの拡大した出力結果を見ていると、ノードを減らしてもうまくいくようなので、自身のPCスペックに対して適切なノード数、インプットサイズを設定しても良いでしょう[5]

 

 枚数が少なく、学習がすぐ終わってしまうので、epoch数を代わりに多く設定しましたが、画質の向上などにはつながらなかったです。

 

幾つか試した例を載せます。

f:id:catindog:20160830162029j:plain

@epoch 91 ナミさんのような画像とキングダムのツリ目、チルチャックのような画像も見て取れます。新キャラにしか見えないのは、それぞれの特徴が混ざった新キャラなんでしょう、多分。

f:id:catindog:20160830162048j:plain

f:id:catindog:20160830162105j:plain

@epoch 243 epochを増やせばいいというわけでないのです。ダンジョン飯のファリンに似ていたので、選んでみました。ファリン可愛いですよね、チョイ役ですが。目は開いちゃいました。

f:id:catindog:20160830162135j:plain

@epoch 247 目がキラッキラなおじさま方がたくさん生成されました。うーん、他のサンプルでは1万枚オーダであり、多様な画像が生成されていることを考えると、学習に使う枚数増やさないとダメかーと判断いたしました。

 

このDCGANが行き着くところ

 人間の顔なら顔だけ、部屋の様子なら部屋の様子だけと適応できるドメインがあまり広くないようです。

 最終的に日本の国宝である漫画を全部読ませて、漫画をストーリも含めて自動生成することができれば、我々日本人は無尽蔵のカトゥーンコンテンツを持つことにもつながり、世界を文化的・精神的に支配することももしもの話ではなくなってくるでしょう。そのためには、いち早く、ディープラーニングの研究開発を行い、新しい理論を日本のコンテンツでドッグフーディングしていく必要があります。

参考

[1] https://arxiv.org/pdf/1511.06434.pdf

[2] ごめんなさい、Sideshareのようなサイトで見たことは覚えているのですが、、、

[3] http://yasuke.hatenablog.com/entry/generative-adversarial-nets

[4] https://github.com/nagadomi/lbpcascade_animeface

[5] http://memo.sugyan.com/entry/20160516/1463359395