顔認証を簡単に作成する

# はじめに

「face++」という中国製の顔解析のAPIで、
顔認証のように与えた画像が誰なのか当ててもらう方法の紹介です。
これを使えば、顔認証がとても簡単にできちゃいます。
API Keyの取得については、こちらをご覧ください。
https://qiita.com/kudota/items/52a197e271474e022b63

今回はフリーの写真で使える大川さんと朽木さんの顔をどっちの顔か当ててもらいましょう
大川さん
![OOK161104408_TP_Vのコピー.jpg](https://qiita-image-store.s3.amazonaws.com/0/218021/a730cfba-2f9b-d36a-b81c-0635c9425b23.jpeg)
朽木さん
![KK187104856_TP_V.jpg](https://qiita-image-store.s3.amazonaws.com/0/218021/0f54d1fb-18d3-0ab3-953b-424ff9462612.jpeg)


全体の流れとしては、
1. 人の顔が含まれた画像からface_tokenを取得
2. 生成したface_tokenにuser_idをつける
3. user_idをつけた何枚かの画像のface_tokenを一つのグループにする
4. 今回user_idを登録していない画像がそのグループの中でどの画像に一番近いかを当ててもらう
という感じです。
では、早速やってみます。

# face_tokenを取得

まず、APIからface_tokenを取得します。
まずは、大川さんの写真のface_tokenを取得します。

```
curl -X POST "https://api-us.faceplusplus.com/facepp/v3/detect" 
-F "api_key=<api key>" \
-F "api_secret=<api secret>" \
-F "image_url=https://www.pakutaso.com/shared/img/thumb/OOK161104408_TP_V.jpg"
```

以下のようなjsonが返却され、face_tokenを取得できます
この場合、face_tokenは845d393e700a95d82d4257328b28614fになります。

```json
{
    "faces": [
        {
            "face_rectangle": {
                "height": 405, 
                "left": 727, 
                "top": 423, 
                "width": 405
            }, 
            "face_token": "845d393e700a95d82d4257328b28614f"
        }
    ]
}
```

同様に朽木さんの写真も行います。

```
curl -X POST "https://api-us.faceplusplus.com/facepp/v3/detect" 
-F "api_key=<api key>" \
-F "api_secret=<api secret>" \
-F "image_url=https://www.pakutaso.com/shared/img/thumb/KK187104856_TP_V.jpg"
```

それぞれのface_tokenを取得できました。


```json
{
    "faces": [
        {
            "face_rectangle": {
                "height": 234, 
                "left": 869, 
                "top": 399, 
                "width": 234
            }, 
            "face_token": "a4f5bc341ecd5e5ef0a492a89d9cc9aa"
        }
    ]
}
```

# use_idを登録
続いて、その写真が誰の顔なのかを紐付けるためにさきほど取得したface_tokenを使ってuser_idを登録します。
基本的に、user_idをその人の名前などにすればいいと思います。

```
curl -X POST "https://api-us.faceplusplus.com/facepp/v3/face/setuserid" \
-F "api_key=<api key>" \
-F "api_secret=<api secret>" \
-F "face_token=845d393e700a95d82d4257328b28614f" \
-F "user_id=ohkawa" 
```

以下のようなjsonが返ってくれば、成功です。

```json
{
    "face_token": "845d393e700a95d82d4257328b28614f", 
    "request_id": "1516635572,27ed1397-a966-43d4-ab3a-c84266b97bb1", 
    "time_used": 35, 
    "user_id": "ohkawa"
}
```

同様にもう一枚も行います。

```
curl -X POST "https://api-us.faceplusplus.com/facepp/v3/face/setuserid" \
-F "api_key=<api key>" \
-F "api_secret=<api secret>" \
-F "face_token=a4f5bc341ecd5e5ef0a492a89d9cc9aa" \
-F "user_id=kuchiki"
```

# faceset作成
次に、facesetに2枚の画像のface_tokeを登録します。
faceset_tokenにさきほどのface_tokenをカンマ区切りで送信します。
facesetとは顔画像のグループみたいなものです。
outer_idとはこのグループの名前です。

```
curl -X POST "https://api-us.faceplusplus.com/facepp/v3/faceset/create" \
-F "api_key=<api key>" \
-F "api_secret=<api secret>" \
-F "outer_id=facegroup" \
-F "face_tokens=845d393e700a95d82d4257328b28614f,a4f5bc341ecd5e5ef0a492a89d9cc9aa"
```

以下のようなjsonが返却され、faceset_tokenを取得できます。

```json
{
    "face_added": 2, 
    "face_count": 2, 
    "faceset_token": "9825b551e8ad557891ccae6789770400", 
    "failure_detail": [], 
    "outer_id": "facegroup", 
    "request_id": "1516635755,df10eede-35b3-4259-a4da-b62993d27b4e", 
    "time_used": 519
}
```

# 誰の顔を当ててもらう
では、faceset_token使って誰の顔か当ててもらいましょう。
別の大川さんの写真を使います。
![JIDORIIMGL2614_TP_V.jpg](https://qiita-image-store.s3.amazonaws.com/0/218021/096cf230-624b-10e6-bea6-bfb7e7a9a0e0.jpeg)

```
curl -X POST "https://api-us.faceplusplus.com/facepp/v3/search" \
-F "api_key=<api key>" \
-F "api_secret=<api secret>" \
-F "image_url=https://www.pakutaso.com/shared/img/thumb/JIDORIIMGL2614_TP_V.jpg" \
-F "outer_id=facegroup"
```

以下の結果が返ってきました。

```json
    "results": [
        {
            "confidence": 88.544, 
            "face_token": "845d393e700a95d82d4257328b28614f", 
            "user_id": "ohkawa"
        }
    ]
```

ちゃんとohkawaが取得できました。
成功ですね！
ちなみにconfidenceは信頼度でどれくらい正しそうかみたいなものです。
これを使って顔認証とかは簡単にできちゃいます。