VAEにモーショングラフィックスを学習させてみた

# モーショングラフィックスとは
**図形，ロゴ，イラストなどをかっこ良く動かしたもの**です．かなり曖昧な定義ですよね．実際に明確な定義はないと思います．俗に言うエモいという映像にはモーショングラフィックスが使われていることが多いです．
アーティストのMVや企業のCMなどに使われていることが多いです．YouTubeなどで「モーショングラフィックス」と検索するとかっこいい映像がたくさん出てくるのでぜひ見てみてください．

# モーショングラフィックスを自動生成したい！
モーショングラフィックスはクリエイターの方が手作業で作成してることがほとんどなんですよね．これってとっても時間がかる大変な作業なんですよ．
そこで最近はやりのAIをつかって生成できないかと考えました．モーショングラフィックスをAIに学習させて生成したら楽しそうじゃないですか？

# データセット
生成するにしても，学習用のデータセットが必要です．しかし僕のリサーチした結果では**モーショングラフィックスのデータセットは存在しませんでした．**そこで自分でデータセットを作成する必要があります．しかし，大量のデータセットを作成するには膨大な時間が必要なため，今回は簡易的に，6種類のパーティクルのモーショングラフィックスを作成しました．
データセットの作成にはAdobeのAfrer Effectsを使用しました．

## 作成したデータセット

<div align="center"><img width="115" alt="1" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268281/3525e206-abec-201f-e839-9acdb034561d.gif"><img width="128" alt="2" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268281/832d9696-980b-c405-64f4-5f2b60eb6004.gif"><img width="128" alt="3" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268281/36cf92c1-12db-3a73-0ccf-b1ea106c6cd1.gif"><img width="128" alt="4" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268281/a003511c-6697-0f75-5fc1-278177d1c772.gif"><img width="128" alt="5" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268281/8535b246-6f1b-9022-6fe4-a2ba07fb88fb.gif"><img width="128" alt="6" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268281/f9173350-4477-3fac-6b4b-cd7cc245c712.gif"></div>

<img width="891" alt="ae.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268281/17ac971a-e2eb-0775-f618-0184026bcb9c.png">

# 学習に使うモデル
データセットは作成した（かなり小規模でデータセットと呼べるかどうかは置いておいて）ので次に考えるのはモデルです．生成モデルはいくつかあり，現在主流なのはGANかVAEです．GANは学習が難しく，今回のようにデータセットが少ない場合，うまく学習してくれない可能性が高いのでVAEを採用しました．VAEとはAEの派生系で，データセットを圧縮，復元することで，潜在変数の分布を獲得します．訓練後，デコーダ部分にノイズzを与えることで生成することが可能になります．AE，VAEについては以下の記事が参考になると思います．
[Variational Autoencoder徹底解説](https://qiita.com/kenmatsu4/items/b029d697e9995d93aa24 "Variational Autoencoder徹底解説")
今回は動画の生成を行うのでVAEは3次元畳み込みによるUnet構造のモデルを構築しました．３次元畳み込みにより動画の時空間情報を学習します．デコーダ部分のtranspose convは転置畳み込みです．転置畳み込みは[ここ](ttps://qiita.com/kenmatsu4/items/b029d697e9995d93aa24 "転置畳み込み")の記事で動画付きで分かりやすく解説されています．

![models figure (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268281/95596f94-ba8a-4e6f-e91c-52f4ce25350a.png)

# 学習
データセットが少ないので学習はすぐに終わりました，およそ200epochのところで生成できていると判断したため，そこで学習を終了しました．GTX1080Tiで１時間ほどかかりました．

実験詳細

| 動画サイズ | epoch数 | フレームワーク | GPU |
|:-:|:-:|:-:|:-:|
| 128x128x32  |  200 | PyTorch | GTX1080Ti  |

# 生成結果

![gen1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268281/7ac36d2a-db21-6550-ef49-f6e83b33c3de.gif)
![gen2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268281/e6a241a8-10e5-b57d-e7ab-ad233ebae568.gif)
![gen3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268281/45c165ba-2c98-59e2-20cd-4ee81c4be6f3.gif)
![gen4.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268281/2d78960b-96b3-8284-75d6-2e99ee4fd60d.gif)

ちゃんと学習データっぽいモーショングラフィックスが生成できています．

## Morphing
デコーダに与えるノイズベクトルzをモーショングラフィックス間で補完していくことで，２つのモーショングラフィックスの中間的なモーショングラフィックスが生成できます．よくGANで生成されたものが少しづづ変化していくアレの動画バージョンです．
<img width="128" alt="1" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268281/3e5d3b81-76bc-2acc-b575-89ec3f1041a3.gif"><img width="128" alt="1" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268281/73635346-6103-68b5-0d2b-e2001575bc0d.gif"><img width="128" alt="1" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268281/aff51497-32e0-b781-7019-cc1de29fd970.gif"><img width="128" alt="1" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268281/b0b46a48-92da-32b5-e755-22188a56dd69.gif"><img width="128" alt="1" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268281/819fe8ed-374d-dc9a-81c8-8b5456e28b79.gif"><img width="128" alt="1" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268281/59f9e64f-0c6e-70eb-5877-48f097c96a7e.gif">

以下の式のように潜在変数zをモーショングラフィクス間で補完することで中間的なモーショングラフィクスを生成します．

```math
z = t z_1 + (1-t)z_2 \\
0 < t < 1
```

# まとめ
モーショングラフィックスをdeep learnigを使って生成することができました．今回はかなり小規模なデータセットのため生成に多様性はみられませんでした．大規模なモーショングラフィックスデータセットがあれば是非実験してみたいと思います．（誰か作ってくれないかなー）
しかし，Mophingなどで中間的なものを生成することができるのは面白いですね．小規模なデータセットでもMorphigができることが今回の実験で分かりました．
# 参考
[Variational Autoencoder徹底解説](https://qiita.com/kenmatsu4/items/b029d697e9995d93aa24 "Variational Autoencoder徹底解説")
[ニューラルネットワークにおけるDeconvolution](ttps://qiita.com/kenmatsu4/items/b029d697e9995d93aa24 "転置畳み込み")