Tensorflowで自分に合った彼女を探すCNNを実装しようとしてみた(第二回)

# 目的
##### [前回の実験](https://qiita.com/kangaroo-san/items/89548805795c1efbdc37)で出た反省
・人物切り抜くスクリプトを導入して背景に左右されないようにすること
・データ絶対偏ってる…もっと偏りのないデータの軸を作ること
・服だけじゃなくて、もっと顔だけとか、細かい要素に分けるべきか？

これらをもとに、とりあえず顔のタイプを分類わけするコードから書いてみた！！

# 顔の分類
顔の分類は、恋愛系のYouTubeで上がりがちなカワイイ系vsワイルド系を参考に作っていきました！

|性別|wild|cute|
|:--:|:-:|:-:|
|男|ワイルド系|カワイイ系|
|女|ギャル系|カワイイ系|

# データ収集
最初はHOT PAPPER BEAUTYからDQNがやってそうな髪型と量産型がやってそうな髪型を検索してスクレイピングしてみてたんだけど、データは重複しまくるし、大体みんな同じ顔だし…
と言うことで、芸能人の写真を使ってやることにしました！！

芸能人の選抜は以下のサイトを利用
[ワイルド系男子](https://rankingoo.net/articles/ikemen/20_107/5)
[カワイイ系男子](https://rank1-media.com/I0000827)
[ギャル](https://ranking.goo.ne.jp/column/6158/ranking/52278/)
[カワイイ系](https://rank1-media.com/I0000207/&page=2)
以上のサイトでランキングにされていたトップ１０の有名人を利用して系統わけできるデータを集めました！

```python:データ収集
def crawl(dic):
    for key, val in dic.items():
        for k, v in val.items():
            for elem in v:
                for e_k, e_v in elem.items():
                    crawler = GoogleImageCrawler(storage={'root_dir':'顔系データ/顔面タイプ/'+key+'/'+k+'/'+e_k})
                    crawler.crawl(
                        keyword=e_k,
                        max_num=e_v
                    )

dic3 = {
    'men':{
        'wild':[
            {'柳楽優弥':30},{'松本潤':30},{'新田真剣佑':30},{'桐谷健太':30},{'伊藤英明':30},{'山田孝之':30},{'西島秀俊':30},{'岡田准一':30},{'斎藤工':30},{'長瀬智也':30}
        ],
        'cute':[
            {'志尊淳':30},{'知念侑李':30},{'岡田将生':30},{'神木隆之介':30},{'三宅健':30},{'伊野尾慧':30},{'瀬戸康史':30},{'山崎賢人':30},{'小池徹平':30},{'千葉雄大':30}
        ],
    },
    'women':{
        'wild':[
            {'池田美優':30},{'藤田ニコル':30},{'木村有希':30},{'木下優樹菜':30},{'舟山久美子':30},{'益若つばさ':30},{'若槻千夏':30},{'鈴木奈々':30},{'ギャル曽根':30},{'安西ひろこ':30}
        ],
        'cute':[
            {'石原さとみ':30},{'橋本環奈':30},{'広瀬すず':30},{'新垣結衣':30},{'有村架純':30},{'綾瀬はるか':30},{'永作博美':30},{'白石麻衣':30},{'長澤まさみ':30},{'安達祐実':30}
        ]
    }
}

```

顔が整ってる芸能人たちのデータは本当に便利で、みんなしっかり顔の写ってるデータを世に広げてくれていたので助かりました（笑）

# データの加工
前回の反省から、対象になる写真の人物だけを切り抜く必要を理解したので今回は、OpenCVなる画像認識、加工の奴を導入して顔面だけを切り取ることにしました！

『[OpenCVで顔認識・切り出し](https://qiita.com/stpete_ishii/items/c4030ab664fab23313b0)』を参考にして、OpenCVを導入してみると…

そもそも、cv２のインポートが出来ず…
格闘しまくりました！笑

※もしも、miniforgeを使っていてopenCVの導入で困っていたら[このサイト](https://hyakushoblog.com/programing/how-to-install-the-opencv-in-m1-macbook/)が参考になるのでおすすめです！！

で、openCVを導入して顔だけ切り出すコードが下のもの
```python
IMG_FILE = "haarcascade_frontalface_default.xml"
cascade = cv2.CascadeClassifier(IMG_FILE)

dic = {
    'men':['wild','cute'],
    'women':['wild','cute']
}

def cut_face(image_picture,gender,cat,n):
    img = cv2.imread(image_picture)

    img_g = cv2.imread(image_picture,0)

    face = cascade.detectMultiScale(img_g)

    print(n," =====>> ",image_picture," _ ",gender)


    face_cut = np.arange(1)

    for x,y,w,h in face:
        face_cut = img[y:y+h, x:x+w]

    for x,y,w,h in face:
        cv2.rectangle(img,(x,y),(x+w,y+h),(255,255,255),2)

    if(face_cut.ndim > 1):
        cv2.imwrite('picture/'+gender+'/'+cat+'/face_cut'+str(n)+'.jpg', face_cut)

```

これで画像を切り抜いてみると…
![切り抜いた画像](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2773097/6b956f2f-90fb-6420-ca4f-89c17a225df8.png)

なんともゴミデータが多く、目視で削っていきます。

で、残りを前回同様の方法でパラメータを作っていいったら、ちゃんとギャルはギャル、まいやんはカワイイで認識してくれるようになりました！！

# まとめ
で、こいつらがどう理想的な彼女探しに繋がっていくと言うのか、作り終わった今、疑問となっています…
いや、これを基にね、次は顔の形で四種類くらいで分けて、顔のタイプを八種類で分析できるようにして、その後で、写真をもとに服装、写真の雰囲気みたいなのを分析できるようにして…
で、自分がどんなタイプの女の子と付き合いがちな男なのかを調査とかしながらわかっていければ、いいよな…
次は顔の形状分布をやってみよう。

とりあえず、夏の間に彼女は出来なさそうだ（笑）