お手軽に日向坂46の顔分類！

# はじめに

[PyTorchを使って日向坂46の顔分類をしよう！](https://qiita.com/coper/items/b1fd51062642d624e26f) という記事などで、シンプルなCNNを用いて日向坂メンバーの顔分類を行っています。画像分類タスクではなく顔認識タスクとして捉えて、もっと手軽に高い精度でメンバーの顔を認識してみましょう。

![iine._label.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529001/9476d605-4d3c-dcaf-8e3b-f4ee22f27e03.jpeg)

## 使用するモデル
顔認識は非常に応用範囲の広い技術で、空港でのゲートに用いられたり、監視カメラシステムに導入したり様々な場面で活用されます。顔認証には非常に高い精度が要求され、非常にラベルの数が多いという特徴があります。
ラベルの数が可変で大量に存在している為、softmax等を用いたクラスタリングではなく、文書分類などと同様に顔画像の特徴量ベクトルに対する埋め込みを学習するということが行われています。（詳しくは深層学習を用いた顔認識の[サーベイ論文](https://arxiv.org/abs/1804.06655)などを参照してください。）
今回は、顔画像を特徴量ベクトルに埋め込む学習済みモデルを使用することにします。

![po._label.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529001/33d46b3d-40e7-80bd-99a1-33655f9fbec4.jpeg)


## 使用ライブラリ

[face recognition](https://github.com/ageitgey/face_recognition)というリポジトリがあり、非常に簡単に顔認識モデルを扱うことが出来ます。内部でdlibという機械学習ライブラリを使っているようです。
顔の場所を識別する関数と顔画像を128次元ベクトルに埋め込む関数が用意されていて、以下のように簡単に使用することが出来ます。推論しかしないため、GPUを積んでいないパソコンでも現実的な時間で実行させることが出来ます。

``` python
import face_recognition

#顔の位置に対応する長方形の座標が得られる
face_locations = face_recognition.face_locations(image)

#128次元ベクトルが得られる
face_encodes = face_recognition.face_encodings(image, face_locations)

```

![apa2_label.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529001/453c2749-f12a-cce3-3c73-d5095a9e9515.jpeg)



## 教師用の画像の用意
ラベルづけされたメンバーの画像を用意する必要があります。google画像検索などを用いても良いですが、日向坂のブログからダウンロードすると簡単に大量の画像を入手することが出来ます。pythonスクリプトを書いて、一晩待つと全てのブログの画像をダウンロードすることが出来ました（サーバーに負担をかけないように間隔を開けてダウンロードしているため、時間がかかりました。常識はあるので）

![josiki._label.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529001/cbd1d317-08ac-8dd4-64fa-38bb87defbd6.jpeg)

そのうち一人だけ写っている画像を適当に抽出して、各メンバー20枚弱のラベル付きの顔写真を用意しました。

## 顔認識
画像に対して顔の場所を取得し、face recognition用いて128次元の空間に埋め込みます。そして教師用のラベル付き画像から求めたベクトルとのコサイン類似度（２つのベクトルが為す角のコサイン）に基づいて誰の顔写真なのか判定します。今回は非常に単純にk-近傍法を用いました(k=1)。（つまり最も近い画像が属するクラスに属していると判定する）
ブログの画像は、高画質であり顔が大きく写っていてラベル付けの手間もあまりない点が優れていますが、自撮りアプリのフィルターがかかってしまったり、上手く取れた写真だけ選別してアップロードされているという点で少し分布が偏ってしまうことが懸念されます。

![konoka._label.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529001/66cad2b7-d4fe-305d-e9a0-115421baa96b.jpeg)


## 顔認識結果
以上より顔認識アプリが完成しました！
google画像検索で得られたブログに載っていない画像を用いて今回のモデルがどれだけ上手く顔認識出来るか確かめてみましょう

![all._label.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529001/b7b60964-1931-90d2-ce3c-1668ecb4506b.jpeg)

これは3rdシングル「こんなに好きになっちゃっていいの」の選抜発表の時の画像ですが、非常に高精度に識別出来ていることが分かります（正しいラベルがわからない人は「日向坂で会いましょう」を見てください）

20枚弱のラベルと非常にシンプルなアルゴリズムで顔識別を行えることが確認できました。

## 今後の改良
一人の顔が大きく写っている画像ではほぼ間違いなく顔認識をすることが出来ました。皆が集合している写真でも、サードシングル選抜発表の画像は高精度の識別が出来ましたが、これはアー写を用いた画像であるためブログ画像と性質が近かった可能性が考えられます。
「立ち漕ぎ」の公式twitterの画像を用いてみるともう少し精度が落ちます。
![EFjn5pdVAAEMU__._label.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529001/1b30661f-859d-c392-f958-a43efea113a4.jpeg)

教師用の画像をブログ以外から取得することでバリエーションを増やしたり、k-近傍法のkの数を調整したりすることでもっと高精度に判定できることが期待できます。
今回のモデルを活用することで、どのメンバーと良くブログにツーショットを上げているかや、どのメンバーと良く一緒にテレビに写っているかなど様々な事を気軽に調べることが出来るようになります。
また笑顔判定などを併用することで、メンバーが可愛く写っているフレームを動画から抜き出すなどといった活用も考えられます。
深層学習モデルをどんどん活用していきましょう。

![03e32f91_label.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529001/06cd7031-15f3-075c-b273-4147c9c8369c.jpeg)

今回のコードの[リポジトリはこちらです](https://github.com/tomabou/hinata-face)

## おわりに

みなさんも是非、令和最強アイドルバラエティ「日向坂で会いましょう」を見てください。日曜の深夜1:05〜1:35 テレビ東京などで放映されています。次回も非常に楽しいこと間違いなしです。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">次回は…「クレーム続出！この際だから言っておこう！前半」<br>ひらがな推し時代からは１年半を超える関係となり、<br>楽しくやっているかと思いきや、続々と集まる衝撃のアンケート。<br>番組へ、メンバーへ、MCへのクレームが止まらない！？<br>遺恨を残さず全員スッキリできるのか！？</p>&mdash; 日向坂で会いましょう (@hiraganakmax) <a href="https://twitter.com/hiraganakmax/status/1191031029017927685?ref_src=twsrc%5Etfw">November 3, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>