学生証と顔認証で本人確認してみる [2] 〜Face APIにユーザーを覚えさせよう〜

先ほどぶりです。たてしきと申します。
本人確認しようってやつの続きです(雑)
## お品書き
・[学生証と顔認証で本人確認してみる [1] 〜MS Azure、Face APIの利用準備をしよう〜](https://qiita.com/Tateshiki0529/items/8f51020df986aaadf798)
・**学生証と顔認証で本人確認してみる [2] 〜Face APIにユーザーを覚えさせよう〜** ←いまここ！ 
・[学生証と顔認証で本人確認してみる [3] 〜Node-REDを使ってシステムを構築しよう〜](https://qiita.com/Tateshiki0529/items/638c5f63502e8e736c30)  \:blush: <font color="Red">***New!***</font> \:blush:
・~~学生証と顔認証で本人確認してみる [4] 〜実際に使ってみよう〜 (仮)~~ (執筆中)
## 学習のお時間
AIを使う上で欠かせないものといえば、やっぱり学習ですよね。
というわけでFace APIを学習させていきましょう。

## Face APIの準備
### 1. PersonGroupを作成する
"PersonGroup"、つまり人物のグループを作ってその中に"PersonGroup Person"、つまりユーザーを、その中に顔情報を記録していくわけです。
![構造1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1596729/19863a28-e7b0-9dd1-4168-e1db47dec37a.png)
[Cognitive Services APIs Reference - PersonGroup - Create](https://japaneast.dev.cognitive.microsoft.com/docs/services/563879b61984550e40cbbe8d/operations/563879b61984550f30395244/console)より、グループを作成します。緑色のやつです。
Hostに関しては前回の通り。
Query parameters - personGroupIdにはPersonGroupの名前を入力します。英小文字、数字ぐらいしか使えないみたいです(例では`authlist`)。
Headersもいつも通りに入力してください。
![Learning-1-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1596729/e81f2237-4f82-127b-b878-6ab26875d17a.png)
今度はbodyを編集します。
nameの欄には表示される名前を入力します。ほとんど使いませんが。(例では`大学の学生リスト`)
userDataは今回はまだ使わないので消してあげてください。
recognitionModelは`recognition_04`に変更してあげてください。最新版のほうがいいです。
![Learning-1-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1596729/d53229de-6f3f-f68e-0932-04155a4837c3.png)
「Send」を押すと作成できます。
![Learning-1-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1596729/709ed858-a03d-07d9-af3e-9b12e3a9807e.png)

### 2. Personを追加する
ユーザーを作成します。黄色のやつです。
[Cognitive Services APIs Reference - PersonGroup Person - Create](https://japaneast.dev.cognitive.microsoft.com/docs/services/563879b61984550e40cbbe8d/operations/563879b61984550f3039523c/console)から作成します。
Query parameters - personGroupIdには先ほど作成したグループのID(ここでは`authlist`)を入力します。
![Learning-2-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1596729/adc7032b-6ee1-678a-390d-a5783a4789fd.png)
body部分のuserDataはまたしてもいらないので消してあげてください。
nameにユーザーの名前(ここでは`Testuser01`)を入力します。
![Learning-2-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1596729/a4e7e42e-65ab-9f3e-3ffe-db8dd591ed6f.png)
「Send」を押すと、返り値に`personId`というものが入ってます。

```json:return
{
     "personId": "aa0dadea-a031-45c9-a759-1a5a3fe93cfe"
}
```
これがユーザーを識別するUUIDになるのでどこかに保存しておきます。
![Learning-2-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1596729/4f3398e3-2b01-350e-d96a-abe225ea728b.png)

### 3. PersistedFaceを登録する
顔写真を登録します。オレンジ色っぽいやつです。今回は班のメンバーの写真を登録しました。
もちろん枚数が多い方が精度が高くなりますが、実用化するわけでもないので僕の写真はとりあえず100枚準備しました。
[Cognitive Services APIs Reference - PersonGroup Person - Add Face](https://japaneast.dev.cognitive.microsoft.com/docs/services/563879b61984550e40cbbe8d/operations/563879b61984550f3039523b/console)からも登録できますが、圧倒的に時間がかかります。
というわけで、サクッとPythonでコードでも書いて自動化しましょう。

```Python:main.py
import requests, glob, os, time

resourceId = "tsukuru-system-faceapi" # リソースID
personGroup = "authlist" # さっき作ったグループID
personId = "aa0dadea-a031-45c9-a759-1a5a3fe93cfe" # さっきのpersonId
detectionModel = "detection_03" # 最新モデル
subKey = "********************" # サブスクキー

accessCount = 0 # アクセス制限用カウンタ

def main():
    imageList = glob.glob(".\\images\\"+personId+"\\image_*.jpg") # 保存フォルダから画像を選択 (環境によって書き換えてください)
    for image in imageList:
        print("Reading "+os.path.basename(image)+" ... ", end="") # デバッグ
        binData = open(image, "rb").read() # バイナリで読み込む
        print("OK. Uploading ... ", end="") # デバッグ
        response = requests.post(
            "https://"+resourceId+".cognitiveservices.azure.com/face/v1.0/persongroups/"+personGroup+"/persons/"+personId+"/personFaces?detectionModel="+detectionModel,
            headers={"Content-Type": "application/octet-stream", "Ocp-Apim-Subscription-Key": subKey},
            data=binData
        ) # 顔情報を登録する
        op = str(response.status_code)+" OK" if (response.status_code == requests.codes.ok) else str(response.status_code)+" Failed"
        print(op) # デバッグ
        print(response.json) # デバッグ
        accessCount += 1 # アクセスカウント (アクセス制限対策)
        if accessCount >= 20:
            time.sleep(60) # 1分待機
            accessCount = 0 # カウンタをリセット

if __name__ == "__main__":
    main()
```
`py main.py`で実行です。あとは登録が終わるまで待つ。

### 4. トレーニングする
いよいよ学習させます。[Cognitive Services APIs Reference - PersonGroup - Train](https://japaneast.dev.cognitive.microsoft.com/docs/services/563879b61984550e40cbbe8d/operations/563879b61984550f30395249/console)から指示します。
Query parameters - personGroupIdにはグループのID(ここでは`authlist`)を入力します。
![Learning-3-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1596729/cda73928-ff4a-9816-5007-d6a4781ecf8e.png)
![Learning-3-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1596729/2605f522-fbc8-559d-bd41-fc28db5c09a1.png)
「202 Accepted」となれば学習が開始されてます。
[Cognitive Services APIs Reference - PersonGroup - Get Training Status](https://japaneast.dev.cognitive.microsoft.com/docs/services/563879b61984550e40cbbe8d/operations/563879b61984550f30395247/console)から学習状況を確認できます。
![Learning-3-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1596729/8b3a6597-d848-c8f2-9739-7ac499871660.png)
100枚程度なら1秒程度で学習できました。おそろしく速い学習、オレでなきゃ見逃しちゃうね

## お疲れさまでした
学習まで完了しました。次はNode-REDを用いつつ、顔認証テストとシステム構築を行っていきます。

前: [学生証と顔認証で本人確認してみる [1] 〜MS Azure、Face APIの利用準備をしよう〜](https://qiita.com/Tateshiki0529/items/8f51020df986aaadf798)
次: ~~学生証と顔認証で本人確認してみる [3] 〜Node-REDを使ってシステムを構築しよう〜 (仮)~~ (執筆中)