Tencent Cloud Face Recognition API 触ってみた

みなさん、顔解析してますか？
僕はやったことがないので、Tencent Cloudのサービスの1つである"Face Recognition API"を用いて、画像の顔解析を試してみました。

## TCCLIの準備

https://intl.cloud.tencent.com/jp/document/product/1013/33464

```shell
$ pip3 install tccli-intl-en

$ tccli --version
3.0.322.1

$ tccli configure
TencentCloud API secretId[None]: xxx
TencentCloud API secretKey[None]: xxx
Default region name[ap-guangzhou]: ap-tokyo
Default output format[json]: json
```
tccliが使えるようになりました。

## DetectFace APIを叩いてみる
https://intl.cloud.tencent.com/jp/document/api/1059/36979

評価用画像として、弊社代表を使用（公式webから拝借）。
![jin.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2127401/8b0bfafb-1dbe-31d5-9605-e1e986ac9148.jpeg)

当該のAPIはap-tokyoリージョンでサポートされていなかったため、
ap-singaporeを指定し、下記コマンドを実行。

```shell
tccli iai DetectFace --region ap-singapore --Url https://mynet.co.jp/assets/uploads/sites/2/2017/05/c7252e9ab2c39d35379de17646d163c5.jpg
```

2秒ほどでレスポンスが返ってきました。結果は以下。

```json
{
    "ImageWidth": 920,
    "ImageHeight": 800,
    "FaceInfos": [
        {
            "X": 371,
            "Y": 103,
            "Width": 209,
            "Height": 272,
            "FaceAttributesInfo": {
                "Gender": 0,
                "Age": 0,
                "Expression": 0,
                "Glass": false,
                "Pitch": 0,
                "Yaw": 0,
                "Roll": 0,
                "Beauty": 0,
                "Hat": false,
                "Mask": false,
                "Hair": {
                    "Length": 0,
                    "Bang": 0,
                    "Color": 0
                },
                "EyeOpen": false
            },
            "FaceQualityInfo": {
                "Score": 0,
                "Sharpness": 0,
                "Brightness": 0,
                "Completeness": {
                    "Eyebrow": 0,
                    "Eye": 0,
                    "Nose": 0,
                    "Cheek": 0,
                    "Mouth": 0,
                    "Chin": 0
                }
            }
        }
    ],
    "FaceModelVersion": "3.0",
    "RequestId": "1482e17c-5108-4624-803f-75eb257d3b59"
}
```

FaceInfos.X,YからWidth,Heightを取ると

![jin_face.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2127401/09d561b4-f0ba-5f10-b8a6-817f513ec6e3.png)
こんな感じ。しっかりと顔の領域が取れていますね。

FaceAttributesInfo, FaceQualityInfoが空値なのは、それぞれのデフォルトがFalseなためです。
ためしに、全部入りのレスポンスを受け取ってみましょう。

```shell
tccli iai DetectFace --region ap-singapore --Url https://mynet.co.jp/assets/uploads/sites/2/2017/05/c7252e9ab2c39d35379de17646d163c5.jpg --NeedFaceAttributes 1 --NeedQualityDetection 1
```

```json
{
    "ImageWidth": 920,
    "ImageHeight": 800,
    "FaceInfos": [
        {
            "X": 371,
            "Y": 103,
            "Width": 209,
            "Height": 272,
            "FaceAttributesInfo": {
                "Gender": 99,
                "Age": 33,
                "Expression": 85,
                "Glass": false,
                "Pitch": 12,
                "Yaw": 6,
                "Roll": -4,
                "Beauty": 69,
                "Hat": false,
                "Mask": false,
                "Hair": {
                    "Length": 1,
                    "Bang": 1,
                    "Color": 2
                },
                "EyeOpen": true
            },
            "FaceQualityInfo": {
                "Score": 92,
                "Sharpness": 1045,
                "Brightness": 62,
                "Completeness": {
                    "Eyebrow": 99,
                    "Eye": 99,
                    "Nose": 99,
                    "Cheek": 99,
                    "Mouth": 99,
                    "Chin": 99
                }
            }
        }
    ],
    "FaceModelVersion": "3.0",
    "RequestId": "e63e1c5c-d849-41cc-821f-00fc2abf75a4"
}
```
詳細な情報を取得できました。
眼鏡や帽子・マスクの有無や推定年齢などがありますね。
Pitch/Yaw/Roll値も取れるため、実装によっては立体的な演出も加えられそうですね。素晴らしい。

1枚の画像から複数の顔を検知する必要がある場合は、--MaxFaceNum値を渡します。
デフォルトは1なので、数量を明示しないと顔を複数検知できる画像でも、1つしか検知しません。
検知の優先条件は今の所不明。

## 次のステップ

コマンドラインから--Imageで、実データをbase64変換して渡してみたところ、bash: argument list too manyで渡せませんでした。
リダイレクトで渡せそうですが、せっかくなので次はSDKを用いた代替の実装をした上で、実データ渡しの対応と、活用例として簡単な画像処理を試してみます。

## おわりに

株式会社マイネットでは一緒に働く仲間を募集しています！
弊社では様々なゲームタイトルをより長く、安定して運営していくために、インフラ最適化にも積極的に取り組んでいます。興味のある方、ご応募お待ちしております！
https://mynet.co.jp/recruitment/