DCGANでNBA選手のロスター画像を生成してみた。

## はじめに
この記事はドコモ先進技術研究所アドベントカレンダー13日目の記事です

ドコモのアドベントカレンダーを見てくださった皆さま、お疲れ様です。
NTTドコモ 先進技術研究所 2年目社員の角谷です。

タイトルを見ていただければわかる通り、完全にネタ枠での参加です。
（普段はまじめに無線通信基地局のエネルギーマネジメントを主題に研究してます。）

最近興味を持ち始めたGANと、物心ついた時から続けているバスケットボール、
この２つを掛け合わせた最強の趣味を模索した結果、気付いたらこんな形になりました。

先進技術研究所のメンバーが普段家で何をしているのかを把握する際の参考になればと思います。笑

## DCGANって何？
ここでは簡単に説明したいと思いますが、雰囲気で理解していますので細かいところの解釈は間違っているかもしれません！
正確に理解したい方ははこちらの[論文](https://arxiv.org/abs/1511.06434)を読んでいただければと思います。

![DCGAN説明画像.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543486/2f194954-dbc7-2e10-0acd-f5ad18d00a5e.png)

Discriminator：画像の真偽の判定を行うネットワーク
Generator：ノイズから画像を生成するネットワーク

このGeneratorとDiscriminatorを交互に学習させることで、DiscriminatorはGeneratorの嘘を見抜くように、GeneratorはDiscriminatorを騙すように学習を進めていきます。

上手く２つのネットワークの学習が進むと、それっぽいオリジナル画像の生成ができるGeneratorを作り出すことができます。

## NBA選手のロスター画像って何？
NBAは National Basketball Association の略で、アメリカの男子バスケットボールのプロリーグのことです。
NBAがどんなリーグか簡単に説明すると、世界でバスケが強い奴を上から順に450人集め戦わせているリーグだと思って頂ければ大丈夫です。笑
最近は日本人選手もリーグに参加しており、八村選手に至っては201９年ドラフト全体９位で指名、ルーキーイヤーから先発出場と大活躍をしております！！

で、肝心のロスター画像が何かと言うと、簡単に言えば下の写真の様な選手一覧で使用される画像です。
なぜか全員不気味な作り笑いをしているのが特徴です。

![lakers_roster.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543486/cfa027c0-af94-abf9-0039-41fd289ac315.jpeg)

今回は現在NBAに登録されている全選手 + 有名な過去の選手、合計で590人の画像を使用いたしました。
また、元の画像サイズが260×190ですので、64×64と128×128の2通りに解像度を変化させた場合の結果を掲載致します。

## 参考サイト
実装は下記のサイトを参考にしております（ほぼ参考通りです。笑）

[DCGANによるポケモン生成](https://qiita.com/Kohey1480/items/1d72b7f2a4ea92915734)
[DCGANでモンスターハンター・アイスボーンの新種のモンスターを作成してみた！！](https://qiita.com/kanzaki0507/items/c7164b7ff9807b30333e)
[Deep Convolutional GANs(DCGAN)をkerasで実装して、いらすとや画像を生成する](http://yusuke-ujitoko.hatenablog.com/entry/2017/05/09/211400)
[GAN(Generative Adversarial Networks)を学習させる際の14のテクニック](https://qiita.com/underfitting/items/a0cbb035568dea33b2d7)
[【秒速で無料GPUを使う】深層学習実践Tips on Colaboratory](https://qiita.com/tomo_makes/items/b3c60b10f7b25a0a5935)

## 結果 64×64
![nba_64.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543486/3c09c680-4735-968d-2a57-a6a7fb3162e2.gif)

しょっぱなからいい感じに学習してくれました！

似た様な画像を使用していたため、モード崩壊が起きたりするのではないかと予想していましたが、
7000 epoch あたりから徐々に人間の形をし始め、19000 epoch の下の画像なんか遠目で見たら平均10.8ptくらい取りそうなベテラン選手に見えてきます！（右肩はきっとテーピングをしているんでしょう。笑）

<img width="175" alt="スクリーンショット 2019-12-12 14.44.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543486/5e13411b-47d1-da68-3fb3-a16bacba5518.png">


## 結果 128×128

64×64の勢いそのままに特にハイパーパラメータをいじることなく学習させたところ、、、

![nba_gan_128.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543486/98401bb5-946f-8694-137e-e4eef636073a.gif)

こ、怖すぎる、、、笑
なぜか左肩を顔の開始位置にしていますね、、、笑

<img width="175" alt="スクリーンショット 2019-12-12 16.46.45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543486/a49106e1-f78a-1b2a-f849-bf090a5a0a46.png">

このままではホラー画像生成機になってしまうのでハイパーパラメータを調整し再トライ。
主に変更したのは Discriminator の kernel_size 、 strides 、 Dropout です。

何パターンか試すうちに以下の結果に

![nba_gan_256.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543486/ebb4fdb8-fb2e-651c-656c-8e26a5483038.gif)

<img width="204" alt="スクリーンショット 2019-12-12 19.58.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543486/80bc9f83-3389-0882-585f-773d9685497f.png">

おおっ！！なかなかに綺麗なロスター画像になっているのではないでしょうか！？
自分的にはかなり満足の仕上がりです。

## まとめ
128×128で最初学習が上手くいかなかった理由は分析仕切れていませんが、一個の原因として下の様な状況が起きているのかなと思います。

![二つの違い.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543486/f4052162-d129-0e93-70b0-355c5f81f1b5.png)

Generatorはノイズから、つまり何も知らない状況からトライ&エラーで学習を進めていきます。
そのため解像度が上がるとその分難しい問題を何のヒントも無い状態から学習することとなり、結果として上手く学習が進まなかったのだと思われます。

同様なことがこの[論文](https://arxiv.org/abs/1710.10196)でも指摘されており、またこの問題に対する対策の一例が記載されておりますので興味があれば読んでみてください。

## 所感
DCGANは失敗で生成される画像も含めて面白い。笑