DCGANでデスメタルっぽいジャケット画像を生成してみる＋そのためにメタルのデータベースサイトをスクレイピングする

#概要
その名の通り。[DCGANのgithubページ](https://github.com/Newmu/dcgan_code "DCGANのgithubページ")にもあるように、DCGANで架空のアルバムジャケットを生成することができるらしい。
 ![Generated Album Covers](https://raw.githubusercontent.com/Newmu/dcgan_code/master/images/albums_128px.png "Generated Album Covers")
画像引用：[*dcgan_code*](https://github.com/Newmu/dcgan_code "dcgan_code")
確かに遠目に見るとそれっぽい。ということで、私が好きなデスメタルのジャケットについても同じことができるかやってみた。以下に示すように、デスメタルのジャケットはホラー調だったりダークファンタジー調だったり**アレだったり**な画風が多いが、そういった特徴を持った画像が生成できるのだろうか…!!

<img width="220" alt="Domination, by Morbid Angel" src="https://upload.wikimedia.org/wikipedia/en/thumb/f/f6/Morbid_Angel_-_Domination.jpg/220px-Morbid_Angel_-_Domination.jpg"><img width="220" alt="Slowly We Rot, by Obituary" src="https://upload.wikimedia.org/wikipedia/en/f/fd/Slowly_We_Rot.jpg"><img width="220" alt="Mortification by Mortification" src="https://upload.wikimedia.org/wikipedia/en/thumb/5/50/Mortification_st_cover.jpg/220px-Mortification_st_cover.jpg">
画像引用：[*Domination*, by Morbid Angel](https://en.wikipedia.org/wiki/Domination_(Morbid_Angel_album) "Domination, by Morbid Angel"), [*Slowly We Rot*, by Obituary](https://en.wikipedia.org/wiki/Slowly_We_Rot "Slowly We Rot, by Obituary"), [*Mortification*, by Mortification](https://en.wikipedia.org/wiki/Mortification_(album) "Mortification, by Mortification")

#DCGANのTorchによる実装
[こちら](https://github.com/soumith/dcgan.torch "こちら")にはDCGANのTorchによる実装が公開されており、そちらではなんと自分で用意した画像を用いて画像の生成が可能になっている（ありがたい！）
ということで、今回必要になってくる作業は、なるべく多くのデスメタルのCDジャケット画像を集めてくることになる。

ここで今回は古今東西のメタルバンドのデータベースサイトである[Encyclopaedia Metallum](http://www.metal-archives.com/ "Encyclopaedia Metallum")を利用する。このサイト内にはあらゆるメタルバンドのディスコグラフィーが網羅されており、今回はこのサイトを[スクレイピング](https://ja.wikipedia.org/wiki/%E3%82%A6%E3%82%A7%E3%83%96%E3%82%B9%E3%82%AF%E3%83%AC%E3%82%A4%E3%83%94%E3%83%B3%E3%82%B0, "スクレイピングとは")して画像を収集する。スクレイピングは、pythonのスクレイピング用モジュールBeautifulSoupを利用したスクリプト<b>only_coverart_mining.py</b>（コードは[github](https://github.com/tyashima/metal_coverart_mining "github")上にある）を用いる。このスクリプトについての詳細は割愛するが、そのはたらきは、以下にその一部を示す入力データ用テキストファイル<b>input.txt</b>に記載されているバンドのページにアクセスし、リリースしているアルバムのジャケット画像を自動で収集するものになっている。今回はデスメタルバンドのみを対象にするが、ここで収集の対象になったバンドは[英語版Wikipediaのデスメタルバンドのリスト](https://en.wikipedia.org/wiki/List_of_death_metal_bands "英語版Wikipediaのデスメタルバンドのリスト")を参考にした。

ここで、<b>input.txt</b>においてバンド名とともにに書かれている数字などは、別のプロジェクトで使われる際に使われる情報であり、ここでの説明は割愛する。また、このファイルには他のアーティストの情報も付け加えることが可能なので、もしこのバンドのジャケット画像も学習させたい！という場合は各自ぜひ付け加えてほしい。


```input.txt
Aborted,0,Death
Cannibal_Corpse,0,Death
Immolation,0,Death
Deicide,0,Death
Suffocation,0,Death
...

```


#Death Metal Scraping
```
$ python only_coverart_mining.py
```
これによって自動的に<b>input.txt</b>に書かれているバンドを対象にスクレイピングが始まる。
[Encyclopaedia Metallum](http://www.metal-archives.com/ "Encyclopaedia Metallum")上のデータとの照合や画像ファイルが適切なものかなどといったチェックがあるため少々時間がかかるものの、無事スクレイピングが終われば128x128サイズの画像ファイル群が保存される（保存先は、--imgdirオプションで特に指定しない場合、カレントディレクトリ直下に生成されるimgs/以下に置かれる）。デフォルトではフルレングスアルバムのみを対象にジャケット画像を収集するようになっているが、オプションの指定でEPやシングル、ライブアルバムも収集の対象にできるようになっている。

スクレイピングの結果、2057枚のジャケット写真が集まった（EP, シングルも含む。ライブアルバムは除外）。

#DCGANを実行
前述したように、DCGANは[Torchによる実装](https://github.com/soumith/dcgan.torch "Torchによる実装")を使う。環境構築がなされているなら、そちらのページにあるように、以下のコマンドを打つだけで学習が始まる(ここではmyimagesはimgsの親ディレクトリ)。

```
$ DATA_ROOT=myimages dataset=folder th main.lua
```

<img width="500" alt="Training Process" src="https://qiita-image-store.s3.amazonaws.com/0/154093/99f014ce-0398-3ee6-d47b-f8835719d9cd.png">

スクリプトを実行するとこのように生成画像と訓練画像が表示され、GeneratorとDiscriminatorが徐々にパラメータを更新しながら、左側の生成画像がそれらしくなっていく（下部にその変化がわかるGIF画像を用意した）。


#途中結果
1000epochほど学習させると、わずかにそれっぽい、言われてみればデスメタルっぽい、ダークな感じだったり、おどろおどろしい感じの画像ができているようにも思える。
![experiment1(7).jpg](https://qiita-image-store.s3.amazonaws.com/0/154093/6c5bb4a4-3a11-9b72-a101-a5b1dc5f07b3.jpeg)


中には画像中にバンドロゴやアルバムタイトルっぽいものができているものも！ある。
<img width="400" alt="logo" src="https://qiita-image-store.s3.amazonaws.com/0/154093/442c35fc-f1b6-dbad-8024-ba22b1bc129e.jpeg">


#5000epochまで学習させた際の生成画像の変化
上記の実験と条件を変え（エポック数を5000に増加）、再度学習・画像生成を行ってみたところ、以下のような結果となった。
![1491319404dfKavNZhgXvi4Rq1491319397.gif](https://qiita-image-store.s3.amazonaws.com/0/154093/078acc66-7782-4a08-19a0-03cad30dffab.gif)

学習終了付近時（epoch数:4770）の画像
![epoch@4770.jpg](https://qiita-image-store.s3.amazonaws.com/0/154093/ac834c13-b6c2-8ddd-1024-b894d2736f54.jpeg)
非常にコメントしづらいが、抽象絵画のような画像が多いような…


#所感、今後の展望
遠目から見ればCDショップのデスメタルコーナーで見るようなデザインであるが、ちゃんと見るとなんだかよくわからない画像である（まぁ、そういうジャケットもあるにはあるが）。
冒頭の生成ジャケット写真は学習に一体何枚のジャケット画像を使ったのかわからないが、今回使った2000枚強ではやはり十分な学習は難しかったか。今後は訓練画像を増やしてみるなどして結果がどう変わるかも見てみたい。
また、今回は極端な例としてデスメタルを選んだものの、パワーメタルやブラックメタル、スラッシュメタルのジャケット画像に関しても同様の実験をしてみたい。

#コードなど
スクレイピングに必要なファイルはすべて[github](https://github.com/tyashima/metal_coverart_mining "github")上に置いてあります。メタルのジャケット画像集が欲しい！という場合はどうぞ。