#MakeGirls.moe で口パクGIF画像を作る

[#MakeGirls.moe](http://make.girls.moe/)が流行っています。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">今回コミケで出すサイトです！　A.I.で二次元キャラ生成！　Automatically created by <a href="https://twitter.com/hashtag/MakeGirlsMoe?src=hash">#MakeGirlsMoe</a>: <a href="https://t.co/hbiLgGTv72">https://t.co/hbiLgGTv72</a> <a href="https://t.co/iQ3KF4XibM">pic.twitter.com/iQ3KF4XibM</a></p>&mdash; Aixile@MakeGirlsMoe (@namaniku0) <a href="https://twitter.com/namaniku0/status/896521874519146496">2017年8月13日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

私も似たようなことをやりましたが、ここまでのクオリティのものは出せませんでした。すごいです。
[Girl Friend Factory - 機械学習で彼女を創る -](http://qiita.com/Hiroshiba/items/d5749d8896613e6f0b48)　<img src="https://qiita-image-store.s3.amazonaws.com/0/103491/a0def66f-b173-2df5-9192-2e16ab8e4ee5.png" width=30%>

（それと、[ペーパー](https://makegirlsmoe.github.io/assets/pdf/technical_report.pdf)で私が引用されていました↓。嬉しいです。）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/103491/2dd6bac2-e964-40be-23ab-37e6bc792b78.png)

さて、今DeepLearning界隈で大流行しているGANという技術の素晴らしい点はいくつかあり、その１つに、どうやら任意の空間を任意の空間にマッピングでき、かつ線形性を獲得できるらしい点があります。これができると、ある空間をより密な空間にマッピングしたあと、密な空間上での連続点から元の空間での点群を得ることで、意味を持ったモーフィングが可能になります。実際に[ペーパー](https://qiita-image-store.s3.amazonaws.com/0/103491/a0def66f-b173-2df5-9192-2e16ab8e4ee5.png)内でも触れられているように、潜在変数空間での連続点からモーフィング画像を生成できることが報告されています。

ところで、MakeGirls.moeが用いるモデルは、潜在変数の他に、髪の色や開口などのラベルを受け取ります。このラベルはたぶん、学習時は-1/1の二値にして入力されます。そしてモデル使用時は-1か1を与えて画像を生成するのが普通です。では、この値を-1から1に徐々に変化させるとどうなるかというと、

←「口を開く」＝−１　　　　　　　　「口を開く」＝＋１→
![0001.png](https://qiita-image-store.s3.amazonaws.com/0/103491/877a379f-1f30-56a4-f1c1-a9f65088b32f.png)![0002.png](https://qiita-image-store.s3.amazonaws.com/0/103491/48cc0f63-d665-cb42-f985-a759cc7e84fc.png)![0003.png](https://qiita-image-store.s3.amazonaws.com/0/103491/8b483407-42a8-d13b-dfdc-ad5dc86c7763.png)![0004.png](https://qiita-image-store.s3.amazonaws.com/0/103491/2a9bbe4c-750d-4d7f-a5dd-4ff7c2050176.png)![0005.png](https://qiita-image-store.s3.amazonaws.com/0/103491/ec627c24-b229-2d50-58a0-d8b10846afce.png)

このようになりました。「口を半開きにする」学習をしなくても、モーフィングを使えばそれっぽい画像が得られます。これは私が実験したときも同様の結果が得られていました。なぜそんなことができるのか明確な理由はわかりませんが、できたので、OKです。（8/16現在、ラベルの値を中間にして画像を生成するにはjavascriptをちょこちょこっと書く必要があります。やり方は記事の終わりで紹介します。）

口パクモーフィングができることがわかったので、口パクGIF画像にしてみました。
![hoge.gif](https://qiita-image-store.s3.amazonaws.com/0/103491/81828524-bf27-3f1c-3ae0-e3831ba6d206.gif)
ちゃんと口パクできていることがわかります。しかし、体の一部のみを変形させるのは難しいらしく、左肩が左眉が一緒になって動いています。「口を開く」ラベルは、人が思う「口が開く」空間に完全にはマッピングされていないことになりそうです。

MakeGirls.moeにはありませんが、「目を閉じる」ラベルがあるとまばたきGIFが作れたりします。これを活用したイラストGIF生成サービスを作ろうと思っていましたが、そうこうしている内にハイクオリティなモデルが公開されました。この分野も参入者がどんどん増えて、より一層進展していってほしいです。

それにしても、なんでこんなきれいなのが生成できるんでしょうか。中でも驚いたのが、服が服らしい形を保っている点です。DRAGANにしたこと、生成器をResNetにしたこと、データセットを選別したこと、学習率を変化させたこと、SRGANを使ったこと、一体どれが最も寄与したんでしょうか。とても気になります。

### 中間ラベル値の入力方法
0. google chromeで[MakeGirls.moe](http://make.girls.moe/)を開く
1. デベロッパーツールを開き、`Sources`から`/static/js/main.hogehoge`を開く
2. `this.gan.run`で検索し、BreakPointを設置する（行番号をクリックする）
3. 好きなタグを選んでGenerateする
4. `Console`に移動し、`n[20]`に-1~1を代入する（`n[20] = 0`など）
5. 停止したスクリプトを再度動かす

`n[20]`が`open mouth`ラベルっぽいです（ラベルの順番はたぶんペーパーのタグの順番と同じ）。コードは詳しく読めていませんが、`run`メソッドの引数で潜在変数以外っぽいのはこれしかないなぁと当たりをつけました。

※ [#MakeGirlsMoe でもっと遊べるプログラムを書いた（実質百合画像生成）](http://tosaka2.hatenablog.com/entry/2017/08/15/174439)を参考にさせて頂きました。