StarGANの実装をしてみた（1）

# Linux上でStarGANの実装をしてみた
今回は、StarGANの実装をしてみました。
基本的に、githubで公開されているコードをもとに実装を行っていきます。
本ページでは、軽い論文の説明と実装をしていきます。
自分のデータセットを用いて適用する回は、次回やっていきたいと思います。

- StarGANについて超簡単に
- Linux上での実装

簡単ではありますが、上の２項目に従って説明します。

# StarGANについて超簡単に
論文：https://arxiv.org/abs/1711.09020

**StarGAN**とは、異なるドメイン間への変換を可能とするGenerative Adversarial Netwok (GAN)の一種である**CycleGAN**と、GANに多クラス分類の学習を加えた**AC-GAN**を組み合わせたものです。

**CycleGAN**は、2つのドメイン間でのドメイン変換しか行えません。
2つ以上のk個のドメイン間でのドメイン変換を実現するためには、k(k-1)個のGeneratorを学習しなければなりません。
これは、事実上可能ではありますが、面倒くさいです。
<img width="311" alt="コメント 2020-05-22 234300.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642312/805d7c03-214c-508c-c2b7-4bc36c84e722.png">
この画像は、論文内のものですが、k=4だとすると、4*3=12個のGeneratorが必要だということを表しています。

そんな問題を解決するために、StarGANでは、1つのGeneratorで複数のドメインの変換を行うアルゴリズムを導入しています。
<img width="329" alt="コメント 2020-05-22 234328.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642312/7e948593-f63d-a90e-e1aa-57d922b03b9b.png">
5つのドメインがある場合、上の画像のようにあらわされます。
星形をしていますね。だからStarGANなんでしょう。なんか厨二心をくすぐられます。

丁寧な説明が[他の記事](https://qiita.com/uyuutosa/items/5dd9b2b80a9aaca67050)ありましたので、共有いたします。（これ以上の解説は自分のはできない）

# Linux上での実装
公開コード
https://github.com/yunjey/StarGAN

実装環境
- Ubuntu 18.04 LTS
- Python 3.6
- PyTorch 0.4.0
- Tensorflow 1.4.0

### 公開データセットで実装

まずは、任意のディレクトリにgitをクローンします。
続いて、`StarGAN/`のディレクトリに移動します。
今回は、論文でも使用されていたCelebA datasetとRaFDいうデータセットをダウンロードしていきます。

```
$ git clone https://github.com/yunjey/StarGAN.git
$ cd StarGAN/
$ bash download.sh celeba
```

ダウンロード完了です。

```
  .
  .
  .
  inflating: ./data/celeba/images/072137.jpg  
  inflating: ./data/celeba/images/027742.jpg  
  inflating: ./data/celeba/images/188764.jpg  
  inflating: ./data/celeba/list_attr_celeba.txt 
```
こちらのCelebA datasetというデータセットは、[こちら](http://mmlab.ie.cuhk.edu.hk/projects/CelebA.html
)で公開されております。

このデータセットには、有名人のカラー顔画像が178×218ピクセルで202,599枚含まれています。
これに加えて、それぞれの画像に対して、40種類のattribute (属性) が付与されています。
例えば、Black_Hair、Blond_Hair、Brown_Hair、Male、Youngなどなどです。
もっと知りたい人は[こちら](http://cedro3.com/ai/celeba-dataset-attribute/)を参照ください。

<img width="382" alt="コメント 2020-05-22 215619.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642312/deb2c392-9377-9620-e0c7-fdb5f46a2332.png">

ダウンロードディレクトリには、上のような画像と`list_attr_celeba.txt`という各画像に対する属性が記されているtxtファイルが保存されます。
こちらの中身は、

```
[画像フォルダ名] 1 1 -1 1 -1 1 1 ... 1 -1
```
となっています。1 or -1は属性の数の分（40個）あります。
1のとき、その属性であり、-1のとき、その属性ではないことを表します。
こちらは、自分のデータセットで学習させる際に生成する必要があるので覚えておいてください。

------------------------------
###**学習**

まずは、CelebA datasetを使ってStarGANを学習していきます。

```
$ python main.py --mode train --dataset CelebA --image_size 128 --c_dim 5 \
               --sample_dir stargan_celeba/samples --log_dir stargan_celeba/logs \
               --model_save_dir stargan_celeba/models --result_dir stargan_celeba/results \
               --selected_attrs Black_Hair Blond_Hair Brown_Hair Male Young
```
コマンドについて説明します。
`--mode` : モード
`--dataset` : 用いるデータセット
`--image_size` : 画像サイズ
`--c_dim` : attribute (属性) のクラスの数
`--sample_dir` : サンプルが保存してあるフォルダ
`--log_dir` : ログを保存するフォルダ
`--model_save_dir` : モデルを保存するフォルダ
`--result_dir` : 結果を保存するフォルダ
`--selected_attrs` : 学習したいattribute (属性)
という感じです。

###**テスト**

続いて、テストをしていきます。

```
$ python main.py --mode test --dataset CelebA --image_size 128 --c_dim 5 \
               --sample_dir stargan_celeba/samples --log_dir stargan_celeba/logs \
               --model_save_dir stargan_celeba/models --result_dir stargan_celeba/results \
               --selected_attrs Black_Hair Blond_Hair Brown_Hair Male Young
```
簡単にできてしまいます。

--------------------
続いて、RaFDのデータもダウンロードしたい、、、と思ったのですが、申請が必要でした。
おそらく、申請できても、こちらのページにも掲載することはできないと思います。

学習するのが面倒くさいという方のためにも、学習済みネットワークをダウンロードしていきます。

```
$ bash download.sh pretrained-celeba-128x128
```

ダウンロードされたモデルは、`./stargan_celeba_128/models`に保存されます。
つづいて、以下のコマンドで学習済みネットワークを使って画像変換をしていきます。

```
$ python main.py --mode test --dataset CelebA --image_size 128 --c_dim 5 \
                 --selected_attrs Black_Hair Blond_Hair Brown_Hair Male Young \
                 --model_save_dir='stargan_celeba_128/models' \
                 --result_dir='stargan_celeba_128/results'
```

という感じに超簡単です。

`./stargan_celeba_128/results`に変換画像が保存されます。
これで、公開データセットでの簡単な実装は終了。
次回は、自分で用意したデータセットに適用していきます。

-------
# 参考資料
論文：https://arxiv.org/pdf/1703.10593.pdf
Github：https://github.com/yunjey/StarGAN
CelebA：http://mmlab.ie.cuhk.edu.hk/projects/CelebA.html
7変化! AIで顔を変えよう：https://qiita.com/uyuutosa/items/5dd9b2b80a9aaca67050