ウェイ(17)がAIで「男の娘」を見破ってみたw。

#卍男の娘絶対判別AI卍
こんにちは。

今回、アニメの女の子と「男の娘」を見分けるAIを流行中の[ディープラーニング](https://www.slideshare.net/drken1215/ss-93635358)を用いて、一晩で作ってみました。わかりやすくいうと、アニメの女の子の画像をこれに見せると、「女の子」、男の娘を見せると、「男の娘」とジャッジしてくれます。
正答率は80％くらいです。(~~絶対とは???~~)

これは2回目の投稿で、1ヶ月前に[ウェイ(17)でもCourseraのMachineLearningを死につつ修了できた話](https://qiita.com/pigiipanku/items/cbfe0d3168292b7f8c1d)という機械学習講座を修了したものを投稿しているので、興味があればどうぞ。
#「男の娘」ってなに？

[wikipedia](https://ja.wikipedia.org/wiki/%E7%94%B7%E3%81%AE%E5%A8%98)を参照すると、
>**男の娘**（おとこのこ）とは、男性でありながら**女性にしか見えない容姿**と内面を持つ者を指す言葉。

とされていて、

具体的なアニメのキャラを上げると、

* 戸塚　彩加(やはり俺の青春ラブコメはまちがっている3話)
<img src="https://qiita-image-store.s3.amazonaws.com/0/232961/cff6feb4-30a0-5f95-9e03-7091967dbf28.jpeg" width=35%>


* 木下　秀吉(バカとテストと召喚獣6話)
<img src="https://qiita-image-store.s3.amazonaws.com/0/232961/f49f2ec9-9920-b762-4889-d1f4feb22689.jpeg" width = 35%>



* 潮田　渚(暗殺教室10話)
<img src="https://qiita-image-store.s3.amazonaws.com/0/232961/1b1baf55-39d7-164a-0d26-41fe30233d12.jpeg" width = 35%>
* **クラピカ**(HUNTER×HUNTER148話)
 <img src="https://qiita-image-store.s3.amazonaws.com/0/232961/e58a23eb-81c4-8e66-2c7b-4e0ad1869807.jpeg" width = 35%>



などが、男の娘の代表的なキャラクターです。
女の子よりも可愛らしい...。**だが男だ。**

ようするに、女の子みたいな男の子ってことですね。

ちなみに今回は彼ら（？）の内面は見れてないです。

#How to create
###画像集め
一般的に機械学習はたくさんの画像を学習に必要とします。どんな良いアルゴリズムを持つものよりも、データを多く持つもののほうが強いという格言があるくらいです。

AIが男の娘を女の子と間違えずにどれくらい正しく判断できるかを調べるために、データのクラスを男の娘と女の子に分けました。こうすることで、男の娘を女の子と間違えずに判断することができたのか、女の子を男の娘と間違えずに判断することができたのかが調べられます。

今回は、
だいたいデータの比は訓練:テスト=4:1にし、
train(訓練用)のデータを
女の子176枚、男の娘98枚
valid(テスト用)のデータを
女の子50枚、男の娘25枚集めました。
データは2時間位でgoogleの画像検索で集めたので、結構少ないです。本当はウェブスクレイピングなどの技術を使って大量に集めたいところです。

このデータを集める際に注意したことは、trainのキャラクターとvalidのキャラクターが同じにならないようにすることです。
例えば、trainの画像の中に、クラピカ、validの画像の中にも、クラピカがいたら、trainですでにクラピカの特徴を学習しているので、validのクラピカが男の娘だと判断するのは簡単です。
こうすることで、trainで一般的な男の娘の特徴を学習でき、validで男の娘を正しく判断できたかどうかの割合を調べられます。

女の子はgoogle検索を参考に、男の娘はpixivを参考に画像収集しました。

女の子のtrain画像の一覧
<img src="https://qiita-image-store.s3.amazonaws.com/0/232961/5b9ddb5e-39ef-b5b8-6247-62df6d5aee03.png" width = 50%>

男の娘のtrain画像の一覧
<img src="https://qiita-image-store.s3.amazonaws.com/0/232961/4581a608-ad26-6b5a-16c7-fbba10764bda.png" width = 50%>


###環境構築
マシン:[PaperSpace](https://www.paperspace.com/console)
月20ドルくらいで、パブリックIPアドレス、50GBのストレージ、8GBのGPUレベルのスペックを貸してくれるアメリカのレンタルサーバー。
ソフトウェア:[jupyter notebook](http://jupyter.org/)
ブラウザで動作するプログラムの対話型実行環境。プログラミング言語はPython。
機械学習のライブラリ:[PyTorch](https://pytorch.org/)
テンプレートみたいなプログラムを書く必要がなく、簡単なコードで実装できる。使いやすい。

###機械学習の手法の選定
畳み込みニューラルネットワークCNN(Convolution Neural Network)を使いました。CNNは画像認識で最もよく使われる手法で、最近の自動運転技術とかにも使われています。

CNNは「畳み込み層」と「ブーリング層」を持つニューラルネットワークを利用したアルゴリズムで、
「畳み込み層」はある画像の局所的な部分を抽象化、特徴を浮き立たせます。
「ブーリング層」は局所的な部分をまとめあげます。
これを交互に置くと、特徴量を表現してくれます。

今回の学習に使ったCNNのアルゴリズムは、2015年のImageNetで優勝した[resnet34](https://github.com/KaimingHe/deep-residual-networks)です。

エポック数（同じデータで学習させた数)はオーバーフィット(あまりにもtrainデータに固執して、一般性がなくなること)を起こさないように、試行錯誤の末、３にしました。

#学習
###trainデータ(学習させる画像の数)を増やすことで判別の精度は上がるのか？
一気にデータをすべて入れるのではなく、データの枚数を増やす前と増やしたあとで比較して、判別の精度の向上を見てみます。

#####1.trainデータの女の子も男の娘も10枚ずつに制限した場合

train(学習させる画像の数):女の子　10枚　男の娘　10枚
valid(テスト用の画像の数):女の子　50枚　男の娘　25枚
<img src=https://qiita-image-store.s3.amazonaws.com/0/232961/05e9651c-8923-cb0a-b625-fa500a212bd0.png width=75%>
男の娘を男の娘、女の子を女の子と正しく判別できた精度は**42%**でした。
これならランダムに女の子か男の娘か選ばせたほうが五分五分になるので精度がいいですねw。

#####2.trainデータの女の子も男の娘も50枚に増やした場合

train(学習させる画像の数):女の子　50枚　男の娘　50枚
valid(テスト用の画像の数):女の子　50枚　男の娘　25枚
<img src=https://qiita-image-store.s3.amazonaws.com/0/232961/0d4facee-e06a-b905-7eed-391420d20bb6.png width = 75%>


判別の精度は**75%**まで引き上がりました。
これは10枚のときの42％と比べて、大きな進歩です。ていうか、かなりの衝撃です。
trainデータを増やすことによって、正しく判別できる確率も上がる、相関関係が明らかになりました。
また、判別の精度が50％を遥かに超えたので、男の娘には男の娘たらしめるなにかが外見の特徴にあるという事実が判明しました。

###Unlimited Classification(持ちうるすべての画像用いた判別) 


#####3.trainデータの女の子を176枚、男の娘を98枚に増やした場合

持ちうるすべての画像です。
train(学習させる画像の数):女の子　176枚　男の娘　98枚
valid(テスト用の画像の数):女の子　50枚　 男の娘　25枚
<img src=https://qiita-image-store.s3.amazonaws.com/0/232961/f5f2aeb3-ac32-6bbd-5e0c-e33f599cb163.png width=75%>
判別の精度は**86%**まで上がりました。
100回判別させたら、86回正解を叩き出します。

具体的な判別結果を出します。
画像の見方は、
画像の上の数字が男の娘の判断指標を表しています。(数値が1にちかいと男の娘、数値が0にちかいと女の子と判別されている）
各画像はそのタイトルに最も近い画像を出力している。

#####判別成功例
最も女の子だ!!と判断された女の子
<img src="https://qiita-image-store.s3.amazonaws.com/0/232961/8e148767-0ba2-e3b5-85dd-80612da272e6.png" width=75%>


最も男の娘だ!!と判断された男の娘(男の娘という事実を***AI***に暴かれた男)
<img src="https://qiita-image-store.s3.amazonaws.com/0/232961/1ba7d17f-8a42-7349-6c0a-9496a98a06f2.png" width=75%>

#####判別失敗例
男の娘だ!と判断された女の子(本当は女の子なのに男の娘と断言されてしまった女の子)
<img src="https://qiita-image-store.s3.amazonaws.com/0/232961/8f74f0f4-c660-0124-c60a-9728fdb028e7.png" width=75%>

女の子だ!と判断された男の娘(男の娘という事実を***AI***を使っても暴けない完璧な男の娘)
<img src="https://qiita-image-store.s3.amazonaws.com/0/232961/3c240775-2b81-26f8-1406-e02f8c686e17.png" width=75%>

人間目線からAIの判別結果をみてみると、
The女の子のような画像には正しい、
熟練した男の娘鑑定士なら判定できそうな男の娘にも正しい判断を下しています。
反対に、
中性的な外見?の女の子には間違った
誰もが見間違ってしまうような最強の男の娘には間違った判断を下しています。
これの正答率が**86%**ってすごくないですか!?

###卍男の娘絶対判別AI卍
今までの学習のvalid(テスト用の画像)には男の娘だけではなく、女の子の画像も含まれていました。
だから、女の子を判別するのが上手くいっていただけで、男の娘はうまく判別できていない可能性があります。
そこで、validの女の子のデータを0にして、男の娘だけにします。

train(学習させる画像の数):女の子　176枚　男の娘　98枚
valid(テスト用の画像の数):女の子　0枚　 男の娘　30枚

<img src="https://qiita-image-store.s3.amazonaws.com/0/232961/2f5c0a1d-71d0-3a9c-16ab-2557c3a8a8c5.png" width=75%>

判別の精度は**86.6%**で、男の娘30枚中26枚を正しく判別できています。

具体例をあげると、

男の娘と正しく判断された男の娘(***AI***によって男の娘バレしてしまった男)
<img src="https://qiita-image-store.s3.amazonaws.com/0/232961/78c3a160-7b9e-74b2-eba5-32effd7193cc.png" width = 75%>

***AI***の指標で最も男の娘であると断言されてしまった男の娘
<img src="https://qiita-image-store.s3.amazonaws.com/0/232961/bb9e24eb-90a7-8026-7d2f-783181cda6db.png" width = 75%>

***AI***でさえ、女の子だと間違って判断してしまった男の娘
<img src="https://qiita-image-store.s3.amazonaws.com/0/232961/931d56c2-91e9-8514-2cfe-159b1522fa49.png" width = 75%>

この結果から、ディープラーニングを使ったAIを使えば男の娘を見破れることが解明されました。

#考察
我々が男の娘に対して感じる「こいつ男じゃね？」という直感はとても口では説明しようがありません。ですが、ディープラーニングはその直感を数値化しています。そして、高い精度での判別に成功しました。男の娘という抽象的な概念を獲得した可能性があり、ディープラーニングが従来の機械学習を超越するものだと感じられました。

僕自身、男の娘判別に挑戦してみたところ正答率が60%程度だったので、この**卍男の娘絶対判別AI卍**の正答率86%の凄さが実感できました。プロの男の娘鑑定士にも勝てるのではないでしょうか。

結果から男の娘には3種類のタイプが存在すると思われます。
1.中性的な外見な男の子([アフロディ](https://dic.pixiv.net/a/%E3%82%A2%E3%83%95%E3%83%AD%E3%83%87%E3%82%A3)(イナズマイレブン),[クラピカ](https://dic.pixiv.net/a/%E3%82%AF%E3%83%A9%E3%83%94%E3%82%AB),[潮田渚](https://dic.pixiv.net/a/%E6%BD%AE%E7%94%B0%E6%B8%9A)など）
2.男と言われれば、納得できる男の娘([戸塚彩加](https://dic.pixiv.net/a/%E6%88%B8%E5%A1%9A%E5%BD%A9%E5%8A%A0),[白](https://dic.pixiv.net/a/%E7%99%BD%28NARUTO%29)(NARUTO),[フェリス](https://dic.pixiv.net/a/%E3%83%95%E3%82%A7%E3%83%AA%E3%83%83%E3%82%AF%E3%82%B9%E3%83%BB%E3%82%A2%E3%83%BC%E3%82%AC%E3%82%A4%E3%83%AB)など)
3.デザインがもはや女の子であって、言われても納得できない男の娘([漆原るか](https://dic.pixiv.net/a/%E6%BC%86%E5%8E%9F%E3%82%8B%E3%81%8B)、[荒木光太郎](https://dic.pixiv.net/a/%E8%8D%92%E6%9C%A8%E5%85%89%E5%A4%AA%E9%83%8E)など)

この中でどうやっても3の男の娘、先程のAIでさえ女の子だと間違って判断してしまった男の娘だけは**卍男の娘絶対判別AI卍**でも見破ることができないと思われ、いくらtrainデータを増やしても正答率は90％を超えられないと思います。
ですが、1と2に対しては**卍男の娘絶対判別AI卍**は絶対的なので、男の娘を隠しているキャラを速攻で出落ちさせることができます。あぁ、俺はとんでもない化物を生み出してしまったかもしれない。

#最後に
ここまで読んでくれてありがとうございました。
「面白いｗ」とおもったらシェアしてくれると嬉しいです。
判別できた、できなかった男の娘のリストなども作れたら作ろうかなと思っています。
どうあれ、AIで男の娘を見破れると証明できてよかったです。
[Jeremy Howard](https://twitter.com/jeremyphoward)先生の[fast.ai](http://course.fast.ai/index.html)というサイトで勉強したので興味がある方におすすめするとともに、[Aidemy](https://aidemy.net)でpythonとディープラーニングを学び始め、pythonは包括的に、ディープラーニング基礎は学習で貢献してくれました。