高画質なGANでいろいろ生成してみた(ポケモン、ピカチュウ、漢字、動物)【Colab付】

# GANとは
GANというのは、Generative Adversarial Network (敵対的生成ネットワーク) の略です。
簡単に言うと、AIどうしを戦わせて、画像や音声などを生成する技術です。
より詳しく説明すると、AIを2つ用意して、一方に画像などの生成をさせる役 (generatorと呼ばれる)、もう一方は画像が本物か生成されたものかを判別する役 (discriminatorと呼ばれる)をさせます。

理論的なところを知りたい方は、こちらのシリーズの記事が非常にわかりやすかったです。
[今さら聞けないGAN（1）　基本構造の理解](https://qiita.com/triwave33/items/1890ccc71fab6cbca87e)

# PGGANとは
その中でも、PGGANを使いました。
PGGANはProgressive Growing GANの略で、Progressive GANとも呼ばれます (GitHubの検索とかのときのために統一してほしい...)。
**画質を少しずつ向上**させることによって、以前のものより高画質な画像を生成できるようになります。

こちらのサイトが、実例付きで非常にわかりやすいと思います。
[メルアイコン生成器 version2を作った話](https://qiita.com/zassou65535/items/57fe3bd677159cdb2528)

# 作品集
あまり、GANで色々つくってみたみたいな記事が存在しなかったので、自分でつくってみました。

とりあえず、今のGANがどれだけのものを生成できるのかを見てほしいです。
しかも、個人で画像仕分けができる程度の300～1000枚程度しか画像を用意してません。
本来、GANの研究とかだと1万枚から100万枚程度、あるいはそれ以上の画像を使うので、精度はあまり期待しないでください...
一番下に作り方とか載せるので、作りたくなったらまねしてみてください！

**一番末尾に実際に用いたコード(Colab)を載せているので最後まで見ていってくださいm(_ _)m**

下では学習順 (PGGANなので画質が低い順) に並べてあります。

## ポケモン
https://bohemia.hatenablog.com/entry/2016/08/13/132314
https://www.monthly-hack.com/entry/201612170000
https://tech.ledge.co.jp/entry/2020/07/02/120000
などなどあるように、n番煎じ(特に1番上すごい)ですが、画質が低いGANが多かったので、PGGANで画質上げたれって感じでやりました！


[公式イラスト](https://zukan.pokemon.co.jp/)を使いました。ダウンロードした際に、外縁の透過部分が白だったり黒だったりしてたみたいで、白い枠が残ってしまっています。申し訳ないです(前処理しろ)。

![027000.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365308/ccc3cdb4-c9d4-bdfa-b434-2d72a39b3b53.png)
![067000.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365308/2b3ba515-34ea-2e90-c8e5-1b7bd3f045f5.png)
![109000.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365308/7fda40c3-2614-ffc0-1882-4aa520eb7c44.png)
↓これをもとに絵を描けそう！！
![048000 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365308/0590dc2d-f904-ffc1-7d40-dcc0403099ac.png)
左の真ん中の
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365308/3d67b4d8-3575-73cd-a687-84d78309cf86.png)
とか
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365308/5647d31d-f521-2683-3a5c-63d7054779df.png)
とか。好みが出ますが（笑）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365308/3a1b7e14-1c20-b7cb-41be-6d781790bb3b.png)
こいつもかっこいい。
ここにはいないけど、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365308/7f0a5993-9fd2-7b6f-8fef-9e0a6b41b0ec.png)
こいつも結構お気に入り。とさかとくちばしと、ちょっとぽっちゃりなのがかわいい。


## ピカチュウ
技術が上がっているので、https://www.inoue-kobo.com/ai_ml/gan-pikachu/index.html より精度があげられるといいなという目標で。

ネット上の様々なイラストを使わせていただきました。ありがとうございます。
![100000.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365308/bd0ce38c-b125-49d4-dac9-68daf42e871f.png)
![024000.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365308/f9c959da-20c1-6969-f850-3abe18235d05.png)
へたくそだけど、かわいいのが描けて嬉しい。
![150000.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365308/42159bde-37eb-1696-2def-60ef154b5d79.png)

## アンノーン
画像が28枚しか用意できない状況で、どうなるかというのも興味があったので(オーグメンテーションしてもよかったが、あまり効果がない気がする)
集合体恐怖症の方は、ちょっと飛ばしてください。ごめんなさい。

↓実在するアンノーンが多いですが、アンノーンBの下の穴にも目がある...　Vと混ざっていそうです。
![101000.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365308/8f3523a3-98b5-f92f-4b0e-838f52300055.png)
↓モード崩壊(同じような画像ばかり生成されてしまうGANの学習失敗パターンの一例)してしまった...画像28枚は無理か...
![112000.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365308/7cc5ae74-2207-0b02-1242-e8e46bec4fac.png)

↓回転させた画像なども加えて再チャレンジ
![057000.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365308/1dcb56b8-c056-5d2a-e508-940eae1496ef.png)
↓結局モード崩壊した...
![210000 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365308/ca8ae470-3871-3128-d39b-7d6a6d96f572.png)




## ひらがな
文字をGANに読み込ませたらどうなるんだろうと。単純な興味です。
学習させたのは、PCに入っている明朝フォントのデータです。
https://github.com/uchidalab/font2img で、pngに変換しました。
![082000.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365308/851a9322-ed54-c596-8ddc-c6762ab531a1.png)
![200000 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365308/3f7171ea-3717-22db-2a1b-89f897db83ff.png)
![252000.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365308/2ce17215-cbe3-e878-bc52-e72f366cddf7.png)
なるほどなあ(語彙力)。実在するひらがなが多めですね。
似たような字があるときに、あいまいに書いてることがあっておもしろいです。さ、ち、ろとか。は、ほ、まとか。
でも、逆向きの字が出てくる理由がわかりません。データセットには逆向きの字は与えていません(コード内で勝手に鏡像反転して学習してる説がある)。

## カタカナ

![100000 (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365308/9331efa8-42bf-e05e-6422-d7440973092a.png)
![115000 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365308/4708a797-dde9-cb1f-2723-1d153acbf85c.png)
![193000.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365308/b57c85a1-9f8c-8e81-5f46-7aa0a88f1367.png)

同じく実在するカタカナか、それに近い文字が多いですね。
てか〃と゜が多すぎる。〃つければ、カタカナっぽくてdiscriminatorを騙せるということでしょうか？？
時々、三つ〃をつけてるの面白いですね！笑
あと、セが苦手？？ヒと混ざってる？

## アルファベット
フォントはCenturyです。

↓キリル文字感がすごい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365308/b78af3b4-2e7b-bbac-1eb0-15e027f779d1.png)
↓gがたいへんなことに
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365308/ea0ae1b3-3500-56df-4406-57b8368cedfd.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365308/1c327a03-dc4a-5fc2-aecd-9bcb6423e1d2.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365308/f8a21b66-5432-1699-3e21-d604ed87e60d.png)

なるほど。アルファベットどうしが結構混ざるようです(さっきのはaとgとuが混ざっていたのですね)。あと、震えた手で書いているような揺らいだ感じになるのも興味深いですね。

## 漢字

### JIS規格のすべての漢字
縦横にたくさん書けば、discriminator騙せると思ってるでしょ。
![218000.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365308/60cf6361-1417-f4f6-e507-1e7827a9aee3.png)

### 常用漢字のみ
すべての漢字だと複雑すぎるのかなと思って、常用漢字だけにしました。多少簡単な字も入ってきたかもしれないですが、それでもこれです笑
![258000.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365308/24912e4f-940b-119f-9e29-d787b8dc66c1.png)

### 古文書
漢字の画像データは[漢字字体規範史データセット](http://www.hng-data.org/index.ja.html)からいただきました。本当にありがとうございます。
ノイズが多かったので、前処理しています(参考: [画像のノイズ除去](https://qiita.com/cr-fun/items/916c266ee3e51621ec73))。
昔の人の達筆の字っぽい。本物だと言われたら、信じる。
![messageImage_1609254393607.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365308/553e88f3-c0c6-85da-d049-d197270386cd.jpeg)


## 虎
Google検索で虎、トラ、tigerを検索して画像を集めました (詳細は後で説明)。以降は同様に画像を集めています。
顔の特徴がとらえられるようになっていくのが、わかると思います！

![060000.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365308/9c002066-5088-a455-7b8b-8064f5531d78.png)

![040000.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365308/afc9ba54-d479-0386-a345-044f638226da.png)

![100000 (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365308/b13e2abc-cfa2-34d2-dda9-707319371d45.png)

どうでもいい話ですが、Googleでtigerを検索してダウンロードしていたのですが、タイガーウッズ氏の画像も一緒にダウンロードされたので、仕分けしながら笑ってました。

## キツネ
アイコンにしてるくらい好きなので。
いろんな顔のキツネがいて結構難しかった。
![082000 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365308/b1a91224-9689-52af-44ff-76249e7bd96a.png)



## 野菜
それっぽくはあるけど、よく見ると荒い。
![050000 (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365308/79f0a1f8-daa9-7685-0442-933d7dae5923.png)

## 夜景
あまりうまくいっていませんが、水面に写るビル群みたいな画像もありますね(一番上の左から4番目とその2個下など)。画像がもっとほしい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365308/57462b1c-9900-31ba-7882-ed293d9f7f4b.png)

# 初心者でも簡単にGANを作る方法
ここまで、紹介してきたGANですが、Google Colaboratoryを使うことで、いずれもみなさんのPCで簡単・無料で作ることができます。所要時間はColabの連続使用の制限により2～3日間程度です。

## 画像を集める方法(インターネット検索)
Colabで利用可能なものをご用意しました。google images downloadを利用していますが、現在300枚程度を上限にそれ以上ダウンロードできないバグが発生しているようです (直し方がわかる方は教えて下さると助かります)。
https://colab.research.google.com/drive/1igIULkva1BjKg62WfFK6p7Rv1UOEpzIj?usp=sharing

## GANを学習させる
GANは自分で実装してもいいですが(勉強にもなるし)、今回は、ネット上に公開されているものを用います。
PGGANは、`progressive gan pytorch`または`pggan pytorch`と検索すると色々出てくるので、お好きなものを使ってください(PyTorchでなくても大丈夫です)。
私は初心者に優しそうな
https://github.com/odegeasslbc/Progressive-GAN-pytorch
を使いました。フォルダに入れておけば全部自動でやってくれるので。
少しいじってみた感じ、デフォルトのハイパーパラメータが一番よさそうです。
Colabの雛形も用意しておくので、ご自由にご利用ください。
https://gist.github.com/bababax11/d8297befc4e02bba3b21b473ae92e58f


# 次回予告？
今までは、PGGANを用いてきましたが、より新しいStyleGANを用いたほうが精度があがるかもしれません ( やや複雑な仕組みになっていて、画像を増やさないと変えても意味がないかもしれませんが...)。時間ができたら、またそちらを用いた方法も紹介したいなと思っております。