StyleGAN2による めるアイコン生成

# はじめに

　めるアイコンは主に技術界隈を中心に広く受け入れられているアイコンです。
しかしながら、このアイコンは公式製作者が非常に少なく(筆者調べ3人)、需要に対して供給が追いついていないという問題があります。
これに対する解決策として、深層学習による画像生成が挙げられます。

　この記事を読んでいる方はご存知かもしれませんが、既存研究として[zassou](https://twitter.com/zassouEX)さんによる以下の記事があります。

https://qiita.com/zassou65535/items/cad3f61177880e8230ab

https://qiita.com/zassou65535/items/57fe3bd677159cdb2528

しかしながら、これらの記事は投稿日が2020年と古く、必然、用いている手法にも改善すべき点が残されています。
そこで、最新の手法でめるアイコン生成を行おう、というのが本記事の趣旨となります。

結果から示すと、以下のような生成ができます。
![hook.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3117337/fc5cd4f7-5551-103b-9888-8c6eaa10f7a0.gif)


# 画像生成手法

　深層学習を用いた画像生成手法は概ね以下の3つに大別されます。
- GAN
- VAE
- Diffusion Model

この中でも、特によく用いられているのがGANとDiffusion Modelです
解説を書くのが面倒なので誤解を恐れず全部端折ると、GANは「**生成は早いが、多様な出力[^1]が苦手**」、Diffusion Modelは「**多様な出力ができるが、生成に時間がかかる**」という特徴があります。
近年Diffusion Modelが爆発的に知名度を向上させているのは、この「多様な出力ができる」という性質が理由だと思います。

　幸いにも、めるアイコンは形式が確立しており、多様性が高くありません(悪口ではないですよ)。
そのため、めるアイコン生成タスクについては今のところGANを使用するのが適切であると考えられます。

(実はDiffusion Modelによる[めるアイコン生成](https://twitter.com/zassouEX/status/1555198276982689794)も既存研究があります。~~またzassouさんか~~)

# StyleGAN
　GANの最先端としてStyleGANという手法が存在します。説明が面倒なのでこれもざっくり端折りますが、概ね以下のような流れで洗練されていった手法です。詳しくはリンク先の論文を参照のこと。
- [PGGAN](https://arxiv.org/abs/1710.10196)
    - 徐々に解像度を上げて生成するよう学習するProgressive Growingを採用。高解像度の画像生成が可能に。
    - [zassouさんの記事](https://qiita.com/zassou65535/items/57fe3bd677159cdb2528)で使用されているのがこれ
- [StyleGAN](https://arxiv.org/abs/1812.04948)
    - PGGANに、AdaINという操作を取り入れることで画像の性質の制御が可能に
    - 生成画像の品質も向上
- [StyleGAN2](https://arxiv.org/abs/1912.04958)
    - AdaINとProgressive Growingを廃止。
- [StyleGAN2-ADA](https://arxiv.org/abs/2006.06676)
    - データ拡張を確率的に行うadaptive discriminator augmentationを提案。少数データでも学習が可能に。
    - アーキテクチャはほぼStyleGAN2
- [StyleGAN3](https://arxiv.org/abs/2106.12423)
    - エイリアシング対策を徹底することで[テクスチャが固定される問題](https://nvlabs-fi-cdn.nvidia.com/stylegan3/videos/video_0_ffhq_cinemagraphs.mp4)を解消
    - 位置合わせされていない画像の生成も得意に

今回はStyleGAN2-ADAを採用しました。
なお、使用したコードはrosinality氏による[非公式実装](https://github.com/rosinality/stylegan2-pytorch)です。

Q: なんでStyleGAN3を採用しなかったんですか？
A: ~~使ったことなかったから~~ めるアイコンは塗りがフラットなためテクスチャ固定問題があまり問題にならないこと、予め位置合わせされているためStyleGAN3のメリットを活かせるわけではないこと、その他様々な理由[^2]から総合的に判断いたしました。

# データセットサイズの対策と学習
　如何にStyleGAN2-ADAが少数データでも学習可能といえど、その学習には最低でも1000~2000枚程度の画像が必要です。
しかしながら、手持ちのめるアイコンデータセットの画像数は352枚です。これではモード崩壊(同じ画像ばかり生成される現象)はおろか、まともな品質の画像を生成できるかどうかすら定かではありません。
そこで、めるアイコンに類似した豊富なデータセットで事前学習を行い、その後めるアイコンデータセットで学習し直すことで画像枚数を補う、転移学習という戦略[^3]を採用しました。

　さて、めるアイコンに似ていて、かつ十分な数用意できる画像とは何でしょうか。
そう、斜め45度から顔を出すアニメイラストですね。
……当然そのようなデータセットは存在しないので、適当に顔イラストを用意して、読み込み時45度回転させてから学習させます。
顔イラスト画像には以下のデータセットを利用しました。

https://www.kaggle.com/datasets/subinium/highresolution-anime-face-dataset-512x512?resource=download

なお、解凍が待ちきれずデータセットのうち約50000枚のみ使用しました。(まあADAなので十分でしょう。)
また、以下のような学習に適さないであろうと判断した画像は手動での除去を試みましたが、途中で面倒になったため相当数が混在したまま学習を行いました。
![除去.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3117337/a312782d-9bc7-ffc2-1a5d-ead6d11de4b9.png)


100000 iter学習させた結果が以下となります。なお、画像サイズは$256^2$pxです。
![100000.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3117337/2dc5644a-5033-5f0c-025f-2e0c79e71158.png)

ここからめるアイコンデータセットで転移学習を行いました。
**+300 iter**
![100300.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3117337/dfa0b748-77b5-3762-70be-51286e68588b.png)


**+1k iter**
![101000.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3117337/03b173c2-4182-cbf4-a744-a81eb29905bc.png)

**+10k iter**
![110000.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3117337/90fffb70-c514-bc16-8d6d-774636f37395.png)

！！！
結構いい感じなのではないでしょうか！

転移学習の経過から以下のようなことが観察できます。
- 口を無理やり変形させることでめるアイコンにおける首を再現している
- 基本的には+1k iterより+10k iterのほうが品質が良い
- 2行1列目など一部のうまく生成できない画像は、+1k iterよりも+10k iterのほうが崩れている

とりあえずは+10k iterを使えば良いでしょう。

# 画像生成で遊ぶ
StyleGANには好ましい性質がいくつもあります。
ここでは色々な方法で画像を生成して遊びます。

## モーフィング
　StyleGAN2の特徴として、潜在変数$\mathbf{w}\in\mathbb{R}^{512}$を用いて畳み込み層の重みをスケーリングするというものがあります。
この潜在変数$\mathbf{w}$が画像の見た目を決定するのですが、$\mathbf{w}_3=\alpha \mathbf{w}_1 + (1-\alpha)\mathbf{w}_2$で生成した画像は、$\mathbf{w}_1$で生成した画像と$\mathbf{w}_2$で生成した画像の中間的な画像となります。

百聞は一見にしかず、以下のgifを御覧ください(最初に貼ったものと大差ありませんが……)。
![interpolate.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3117337/f147c1b0-0594-cd83-e29d-ac779d7842d2.gif)

なめらかにモーフィングできているのがわかると思います。
問題点を上げるとすれば、やはり崩れるタイミングがあることでしょう。
崩れる現象の対策もいくつかあるので、暇があればまた記事を書きます。

## StyleMixing
　前述の通り、StyleGANは潜在変数$\mathbf{w}$で畳み込み重みをスケーリングします。
それでは前半の畳み込み層では$\mathbf{w}_1$を入力し、後半の層では$\mathbf{w}_2$を入力するとどうなるのでしょうか？

画像の構造は$\mathbf{w}_1$で生成した画像の構造を、画像の色合いは$\mathbf{w}_2$で生成した画像の色合いを受け継ぎます。

![stylemixing.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3117337/ecfd1aff-203a-578c-125f-9872c88075b8.png)

n行m列目の画像は、形状はn行1列目、色合いは1行m列目を受け継いでいることがわかると思います。

# おわりに
　~~**いかがでしたか？**~~

　本記事ではStyleGAN2を用いることで高品質なめるアイコンを生成しました。
また、データセットの少なさを補うために、めるアイコンが一般的なアニメイラストに類似していると仮定して事前学習にAnime Faceデータセットを用いました。

　今後の展望として以下が挙げられます。
- 画像が崩れる現象の対策
- 画像変換など他タスクへの応用




[^1]: [位置合わせされた人の顔画像](https://github.com/NVlabs/ffhq-dataset) は多様性が低く、[多クラス画像](https://image-net.org/) は多様性が高い、程度に捉えると良いでしょう。しらんけど。
[^2]: メモリの消費量が多いことやStyleGAN2と種々の性質の違いがあるという[報告](https://github.com/yuval-alaluf/restyle-encoder/issues/45)や、Layer Swappingがうまく機能しないという[報告](https://twitter.com/Buntworthy/status/1448377547440467968)があります。
[^3]: この戦略はStyleGAN-ADAの付録でも言及されており、たとえば人の顔画像(FFHQ)で学習後、芸術作品の顔画像([MetFaces](https://github.com/NVlabs/metfaces-dataset))で転移学習することで、わずか1336枚のデータセットで学習を行っています。