芸能人の顔を機械学習させて顔タイプ診断してみる（その２）

#前回（[その１](https://qiita.com/yuni/items/c50306bdbe856580e7cc)）でやったこと
前回は下記の合計800枚の画像を使って学習させ、顔の4タイプ診断をしてみました。
学習モデルの精度は82.5%でした。

|顔タイプ|使用する画像|
|:--------------:|:---------------:|
|フレッシュ|吉高由里子(200枚)|
|キュート|宮崎あおい(200枚)|
|クール|長谷川潤(200枚)|
|フェミニン|滝川クリステル(200枚)|

#今回やろうとしていること
今回は、下記の合計2400枚の画像を学習させて、同様に顔の４タイプ診断をしてみます。

|顔タイプ|使用する画像|
|:--------------:|:---------------:|
|フレッシュ|吉高由里子(200枚)<br>小西真奈美(200枚)<br>広末涼子(200枚)|
|キュート|宮崎あおい(200枚)<br>小倉優子(200枚)<br>中川翔子(200枚)|
|クール|長谷川潤(200枚)<br>松下奈緒(200枚)<br>黒木メイサ(200枚)|
|フェミニン|滝川クリステル(200枚)<br>武井咲(200枚)<br>蛯原友里(200枚)|

###画像収集
bing_api.py([その４](https://qiita.com/yuni/items/7edfe68de918e12af0ee)にコード記載)を使って収集。
収集できた画像数はこちら。

|顔タイプ|名前|収集した画像(枚)|
|:--------------:|:---------------:|:---------------:|
|フレッシュ|吉高由里子<br>小西真奈美<br>広末涼子|616<br>514<br>593|
|キュート|宮崎あおい<br>小倉優子<br>中川翔子|602<br>628<br>600|
|クール|長谷川潤<br>松下奈緒<br>黒木メイサ|566<br>631<br>627|
|フェミニン|滝川クリステル<br>武井咲<br>蛯原友里|490<br>630<br>576|



###学習の下準備
顔のトリミングとゴミデータの削除をします。

ちょっとどうでもいい話なんですけど、1枚でたっくさん顔認識した画像があって、複数人の集合写真か何かかな？って思って気になって見てみたら、
![253c37d20666ed73ada5f07640d9afc94e8e5462fc815ba7d7137338894133f6.jpg](https://qiita-image-store.s3.amazonaws.com/0/223989/fb193afd-dd1d-367d-f307-e671eac12004.jpeg)

ん？
よく見てみると、

![253c37d20666ed73ada5f07640d9afc94e8e5462fc815ba7d7137338894133f6.jpg](https://qiita-image-store.s3.amazonaws.com/0/223989/e7d3a71a-4cdd-22d1-e7bc-683e2b761cd5.jpeg)
めっちゃ顔認識してるw
っていう余談でした。

①Face_trim.py([その１](https://qiita.com/yuni/items/73cd5f0175cc3fa357bb)にコード記載)を使って、顔の切り出しを実行した後の画像数はこちら。

|顔タイプ|名前|顔トリミング画像(枚)|
|:--------------:|:---------------:|:---------------:|
|フレッシュ|吉高由里子<br>小西真奈美<br>広末涼子|276<br>234<br>285|
|キュート|宮崎あおい<br>小倉優子<br>中川翔子|299<br>187<br>191|
|クール|長谷川潤<br>松下奈緒<br>黒木メイサ|263<br>310<br>275|
|フェミニン|滝川クリステル<br>武井咲<br>蛯原友里|266<br>280<br>226|



②ゴミデータ削除＆トリミング画像手動追加後の画像数はこちら。

|顔タイプ|名前|顔トリミング画像(枚)|
|:--------------:|:---------------:|:---------------:|
|フレッシュ|吉高由里子<br>小西真奈美<br>広末涼子|276<br>234<br>285|
|キュート|宮崎あおい<br>小倉優子<br>中川翔子|299<br>255<br>256|
|クール|長谷川潤<br>松下奈緒<br>黒木メイサ|263<br>310<br>275|
|フェミニン|滝川クリステル<br>武井咲<br>蛯原友里|266<br>280<br>255|

###ラベル付け
trainデータとtestデータを下記の通りにわけて、画像pathの後ろにラベルを付けたテキストファイルを作成します。

|顔タイプ|名前|train画像(枚)|test画像(枚)|ラベル|
|:--------------:|:---------------:|:---------------:|:---------------:|:---------------:|
|フレッシュ|吉高由里子<br>小西真奈美<br>広末涼子|200<br>200<br>200|50<br>50<br>50|0|
|キュート|宮崎あおい<br>小倉優子<br>中川翔子|200<br>200<br>200|50<br>50<br>50|1|
|クール|長谷川潤<br>松下奈緒<br>黒木メイサ|200<br>200<br>200|50<br>50<br>50|2|
|フェミニン|滝川クリステル<br>武井咲<br>蛯原友里|200<br>200<br>200|50<br>50<br>50|3|

###学習
画像枚数多くて、下準備大変でした;;
いざ学習です！
[その７](https://qiita.com/yuni/items/62a891fcf57cdc565822)で使用したtestFaceType.pyを使います。
今回も2クラス分類ではなく、４クラス分類なので

```
NUM_CLASSES = 4
```
に変更します。

###結果

```
$ python3 testFaceType.py
^[[Astep 0, training accuracy 0.251667
step 1, training accuracy 0.2675
step 2, training accuracy 0.241667
step 3, training accuracy 0.232917
step 4, training accuracy 0.223333
step 5, training accuracy 0.225
step 6, training accuracy 0.231667
step 7, training accuracy 0.239583
step 8, training accuracy 0.250833
step 9, training accuracy 0.256667
step 10, training accuracy 0.265
　　　　　　　　　　　　　　　　　　　　　　　　　　　 　・
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　・
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　・
step 140, training accuracy 0.627083
step 141, training accuracy 0.633333
step 142, training accuracy 0.630417
step 143, training accuracy 0.63125
step 144, training accuracy 0.632083
step 145, training accuracy 0.631667
step 146, training accuracy 0.634583
step 147, training accuracy 0.627917
step 148, training accuracy 0.632083
step 149, training accuracy 0.632917
test accuracy 0.551667
```
150step終わるのに1時間15分くらいかかりました。
それなのに、学習終わらない。。。

step150→400まで増やして再度いちから学習させます。
何時間かかるんやろ。
そして学習終わるのだろうか。

```
$ python3 testFaceType.py
step 0, training accuracy 0.245
cat *p.py
step 1, training accuracy 0.25875
step 2, training accuracy 0.287917
step 3, training accuracy 0.303333
step 4, training accuracy 0.316667
step 5, training accuracy 0.327917
step 6, training accuracy 0.341667
step 7, training accuracy 0.36
step 8, training accuracy 0.361667
step 9, training accuracy 0.372083
step 10, training accuracy 0.385833
　　　　　　　　　　　　　　　　　　　　　　　　　　　 　・
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　・
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　・
step 396, training accuracy 0.784167
step 397, training accuracy 0.784583
step 398, training accuracy 0.78375
step 399, training accuracy 0.7825
test accuracy 0.635
```

はい、終わらない。
3時間くらいかかりました。
step400→800にしてみます。

```
$ python3 testFaceType.py
step 0, training accuracy 0.21375
step 1, training accuracy 0.215417
step 2, training accuracy 0.210417
step 3, training accuracy 0.220417
step 4, training accuracy 0.232083
step 5, training accuracy 0.243333
step 6, training accuracy 0.25625
step 7, training accuracy 0.272917
step 8, training accuracy 0.279583
step 9, training accuracy 0.293333
step 10, training accuracy 0.307917
　　　　　　　　　　　　　　　　　　　　　　　　　　　 　・
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　・
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　・
step 790, training accuracy 0.900417
step 791, training accuracy 0.89875
step 792, training accuracy 0.903333
step 793, training accuracy 0.9025
step 794, training accuracy 0.902083
step 795, training accuracy 0.904167
step 796, training accuracy 0.903333
step 797, training accuracy 0.900417
step 798, training accuracy 0.901667
step 799, training accuracy 0.90125
test accuracy 0.673333
```
終わらないw
7時間40分かかりました。

step800→1000にしてみます。

```
$ python3 testFaceType.py
step 0, training accuracy 0.21375

　　　　　　　　　　　　　　　　　　　　　　　　　　　 　・
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　・
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　・
step 999, training accuracy 0.925833
test accuracy 0.688333
```
終わらないw
もういやや。
9時間20分くらいかかりました。
別な方法を考えます。

###パラメータ
#####①learning rate
なんでこんなに時間がかかっているかというと、learning rate（学習率）を1e-6にしていたからです。
1e-5以上にするとaccuracyの値が0.25から全く動かず、学習が進まなかったのです。
1e-6にしたら学習が進むようになったので、今回は適正値なのかなと思いました。

#####②batch_size
バッチサイズも10,20,100と試しましたが、100にした時にaccuracyの値が下がってしまったので、10でやりました。
バッチサイズが小さいほど、1つ1つのデータに敏感に反応し、大きいと平均化されるようです。

```testFaceType.py
flags.DEFINE_integer('max_steps', 1000, 'Number of steps to run trainer.')
flags.DEFINE_integer('batch_size', 10, 'Batch size'
                     'Must divide evenly into the dataset sizes.')
flags.DEFINE_float('learning_rate', 1e-6, 'Initial learning rate.')
```
###学習環境
時間がかかった原因としてローカル環境でやっていたことも大きな要因の１つです。

```
OS:macOS High Sierra
CPU:1.1 GHz Intel Core M
メモリ:8 GB 1600 MHz DDR3
```
macちゃんお疲れ様でした。
次回はazureVM環境使います。

こんなにepoch数増やさないといけないものでしょうか？
パラメータ設定こうすればいいよ、など、ぜひ教えてください。（切実）

(2018/4/15追記）
続きを書きました。
[芸能人の顔を機械学習させて顔タイプ診断してみる(AzureVMでGPU使ったよ)](https://qiita.com/yuni/items/bdccedb747a97d84d502
)