Azure Face APIを使ってみた

## はじめに

Microsoftのクラウドサービス Azure にある、Face APIでお手軽に画像解析ができる噂を聞いたので、使ってみました。結果、ホントに簡単に画像解析ができました。

# 参考

こちらのサイトを参考にさせて頂きました。

- [Custom Vision ProjectでエラーでPublishできないときの一つの対処法](https://protoout.studio/posts/custom-vision-project-publish-error)
    - Azureで作成するリソースグループとFace APIの『場所』を統一しておいた方が良いそうです

## やること概要

今回やることは以下です。

- [Azureポータル](https://portal.azure.com)にサインインする
- リソースグループを作成する
- Face APIを作成する
- Face APIで画像解析する

では、Azureポータルにサインインした状態から始めていきます。

## リソースグループを作ろう

Azureでリソースを作るためには、リソースグループが必要になります。そのため、まずはリソースグループを作成します。[Azureポータル](https://portal.azure.com/)にサインインし、リソースグループをクリックします。

<img border="0" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274270/8d033e0f-c426-595d-335a-17456d1a5d7e.png" width="300">



追加ボタンからリソースグループを作成します

<img border="0" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274270/57356ced-5467-bc50-f97b-30bf561176b5.png" width="300">







リソースグループ名やリージョン（`場所`という項目と同意っぽい）を設定します。リージョンはFace APIを作成するときに重要になります。そのため今回は、リソースグループ名だけで、リソースグループのリージョンが分かるように`fuga-JapanEast`とリージョン情報を含めた名前にしました。

<img border="0" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274270/281717ff-eb60-1c68-37bd-984cd441991e.png" width="300">

このようにリソースグループが作成されれば成功です。

<img border="0" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274270/eb5a5024-ae51-080d-a264-3e7c2a990b4e.png" width="300">



## Face APIを作ろう

リソースグループが作成できたので、今回の主役Face APIを作成します。
作成したリソースグループ上で追加をクリックします。

<img border="0" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274270/b05aecba-c669-885f-d9e7-5234208d7359.png" width="300">



Faceで検索すると見つかります。作成ボタンをクリックします
<img border="0" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274270/c8247eb1-764f-1d1b-9458-b62e3f942179.png" width="300">




『場所』をリソースグループのリージョンと同じにします。価格レベルF0は無料枠の意味らしいです。

<img border="0" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274270/6f7bb6c8-fcd7-b885-549d-e1b5aaff49c5.png" width="300">

デプロイが完了したらFace API作成完了です。リソースに移動して、画像解析を試してみます。

<img border="0" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274270/01a136a5-5fd7-3d57-1686-c25691844a20.png" width="300">


## Face APIで遊ぼう

前回の手順で、ｍ作成したFace APIに移動し、`Key1`と`エンドポイント`をメモ帳などにコピーします（あとで使います）。その後、`API Console`のリンクをクリックします。

<img border="0" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274270/b586a965-76f9-5865-3dbd-ab560c547f40.png" width="300">



`Detect`をクリックします。

<img border="0" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274270/fcdd05e8-6482-eb07-3a16-63a224b30abb.png" width="300">

表示されたサイトの下方にスクロールし、`Japan East`をクリックします。（多分、どのリージョンを選択しても問題ないと思います）

<img border="0" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274270/557a8556-85ff-969a-07c6-36df55e663bf.png" width="300">

Nameのプルダウンで`[resource name]…`を選択します。

<img border="0" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274270/ef231ed3-b100-0e56-7f62-67898052b4f1.png" width="300">

先ほどメモした情報をもとに`Resource Name`, `Ocp-Apim-Subscription-Key`の2項目を設定します。

<img border="0" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274270/1689fdc2-f1a1-92da-b426-7677405034e0.png" width="300">


少し下にスクロールし、インターネット上にある画像データのURLを選択します。

<img border="0" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274270/93b46998-8f0c-9945-6beb-436e3acb7937.png" width="300">


画像について、こちらの写真を使わせて頂きました。
https://www.pexels.com/ja-jp/photo/1128065/

<img border="0" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274270/8892bfc8-4f5e-b25a-4238-f4eaf623b191.png" width="300">


Face APIの分析結果はこうなりました。
<img border="0" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274270/485014f2-bc42-3e19-a031-3cca7e84ddfa.png" width="300">

顔の位置を検出したようです。数値だけではわかりにくいので、オプションを変更し、他の情報も表示してみます。先ほどのURLに、`returnFaceAttributes=age`を追加し年齢も表示してみます。

Face APIの実行は、以下のようにcURLコマンドを使用します。（PowerShellを使うなら[こちらのサイト](https://qiita.com/rnakamuramartiny/items/48af81533a05e0817914)が参考になります）
（実行するときは、<FaceAPI Key>に作成したFaceのキーを登録し、`https://hogehoge.local/01.PNG`を分析する画像のURLに変更してください。）

```
$ curl -v -X POST "https://face-api-fuga.cognitiveservices.azure.com/face/v1.0/detect?returnFaceId=false&returnFaceLandmarks=false&recognitionModel=recognition_01&returnRecognitionModel=false&detectionModel=detection_01&returnFaceAttributes=age" \
-H "Content-Type: application/json" \
-H "Ocp-Apim-Subscription-Key: <FaceAPI Key>" \
--data-ascii '{"url":"https://hogehoge.local/01.PNG"}'
```

実行結果がこちら、`{"age":21.0}`、つまり21才と判断したようです。当たってそうです。

```
Note: Unnecessary use of -X or --request, POST is already inferred.
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0*   Trying 13.78.17.188:443...
* TCP_NODELAY set
* Connected to face-api-fuga.cognitiveservices.azure.com (13.78.17.188) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:

ー中略ー

{ [97 bytes data]
100   178  100    97  100    81    109     91 --:--:-- --:--:-- --:--:--   201[{"faceRectangle":{"top":378,"left":790,"width":340,"height":340},"faceAttributes":{"age":21.0}}]
* Connection #0 to host face-api-fuga.cognitiveservices.azure.com left intact
```


今度は、年齢だけでなく性別も表示するようにオプションを変更します。`returnFaceAttributes=age,gender`と追加するだけ、楽ですね。

```
curl -v -X POST "https://face-api-fuga.cognitiveservices.azure.com/face/v1.0/detect?returnFaceId=false&returnFaceLandmarks=false&recognitionModel=recognition_01&returnRecognitionModel=false&detectionModel=detection_01&returnFaceAttributes=age,gender" \
-H "Content-Type: application/json" \
-H "Ocp-Apim-Subscription-Key: <FaceAPI Key>" \
--data-ascii '{"url":"https://hogehoge.local/01.PNG"}'
```

実行結果の抜粋です。年齢だけでなく性別`"gender":"female"`も表示されました。

```
100   196  100   115  100    81    113     79  0:00:01  0:00:01 --:--:--   193[{"faceRectangle":{"top":378,"left":790,"width":340,"height":340},"faceAttributes":{"gender":"female","age":21.0}}]
* Connection #0 to host face-api-fuga.cognitiveservices.azure.com left intact
```

今度は`returnFaceAttributes`で取得できる情報をすべて取得してみます。

```
$ curl -v -X POST "https://face-api-fuga.cognitiveservices.azure.com/face/v1.0/detect?returnFaceId=false&returnFaceLandmarks=false&recognitionModel=recognition_01&returnRecognitionModel=false&detectionModel=detection_01&returnFaceAttributes=age,gender,headPose,smile,facialHair,glasses,emotion,hair,makeup,occlusion,accessories,blur,exposure,noise" \
-H "Content-Type: application/json" \
-H "Ocp-Apim-Subscription-Key: <FaceAPI Key>" \
--data-ascii '{"url":"https://hogehoge.local/01.PNG"}'
```

結果がこちら、情報多いので整形したJSON情報のみ記載しました。
眼鏡かけてない（`"glasses": "NoGlasses"`）、感情がニュートラル（`emotion "neutral": 0.998`）など、ちゃんと分析できているようです。

```json
{
    "faceRectangle": {
        "top": 378,
        "left": 790,
        "width": 340,
        "height": 340
    },
    "faceAttributes": {
        "smile": 0.001,
        "headPose": {
            "pitch": -0.6,
            "roll": 8.5,
            "yaw": 18.6
        },
        "gender": "female",
        "age": 21.0,
        "facialHair": {
            "moustache": 0.0,
            "beard": 0.0,
            "sideburns": 0.0
        },
        "glasses": "NoGlasses",
        "emotion": {
            "anger": 0.0,
            "contempt": 0.0,
            "disgust": 0.0,
            "fear": 0.0,
            "happiness": 0.001,
            "neutral": 0.998,
            "sadness": 0.001,
            "surprise": 0.0
        },
        "blur": {
            "blurLevel": "low",
            "value": 0.0
        },
        "exposure": {
            "exposureLevel": "goodExposure",
            "value": 0.44
        },
        "noise": {
            "noiseLevel": "low",
            "value": 0.0
        },
        "makeup": {
            "eyeMakeup": true,
            "lipMakeup": true
        },
        "accessories": [],
        "occlusion": {
            "foreheadOccluded": false,
            "eyeOccluded": false,
            "mouthOccluded": false
        },
        "hair": {
            "bald": 0.05,
            "invisible": false,
            "hairColor": [
                {
                    "color": "other",
                    "confidence": 0.93
                },
                {
                    "color": "red",
                    "confidence": 0.83
                },
                {
                    "color": "black",
                    "confidence": 0.53
                },
                {
                    "color": "gray",
                    "confidence": 0.31
                },
                {
                    "color": "brown",
                    "confidence": 0.15
                },
                {
                    "color": "blond",
                    "confidence": 0.14
                }
            ]
        }
    }
}
```

## おわりに

AzureのFace APIで画像解析してみました。知識なくても機械学習で画像解析できるの便利です。