AzureのFaceAPIの出力結果を色々試してみた

# はじめに
先日、赤ちゃんの感情を読み取るベビーカメラを作った際に、AzureのFaceAPIを使ったのですが、感情以外にもいろいろな情報を読み取ることができそうなので、どんな情報があるのか試しに使ってみようと思いました。

https://qiita.com/akahira/items/8a227d7409a7f751ee7c

# FaceAPIを使うまでの準備

1. Azureのコンソールで「すべてのサービス」からFaceAPIを選択
![face1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1359985/120c0a0e-e72a-fc35-a5e7-b79eb4bdc5a3.png)

1. 基本情報を入れてインスタンスの作成
![facc2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1359985/0b753c7c-b1de-58b2-85f8-728da9162704.png)


1. 作成したインスタンスからキーとエンドポイントの情報を取得
![facc3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1359985/2805b976-058d-13bf-5768-93897ee63f0a.png)

1. これでAzure側の準備は完了です

# FaceAPIの使い方
以下のようなコードをwifiにつないだラズパイで実行してます。ネットワークにつながった環境であれば同じコードで動くと思います。
「face_client.face.detect_with_stream」の引数の「return_face_attributes」に取得したい顔属性を設定します。どんなものが表示されるか見たいので、今回は全部の顔属性を設定しています。

※「XXXXXXXXXXXXXXXX」には作成したインスタンスのキー１の情報を指定。
※「https\://YYYYYYYYYYYYYYYYY.azure.com/」には作成したインスタンスのエンドポイントの情報を指定。
※「/home/pi/ZZZZZZZZZ.jpg」には分析したい画像ファイルを指定。

``` python3
#!/usr/bin/python
# coding: UTF-8

from azure.cognitiveservices.vision.face import FaceClient
from msrest.authentication import CognitiveServicesCredentials

#キーとエンドポイントを設定する
KEY = "XXXXXXXXXXXXXXXX"
ENDPOINT = "https://YYYYYYYYYYYYYYYYY.azure.com/"
face_client = FaceClient(ENDPOINT, CognitiveServicesCredentials(KEY))

# 画像を分析する
filepath = '/home/pi/ZZZZZZZZZ.jpg'
img = open(filepath, 'rb')
params =["age", "gender", "headPose", "smile", "facialHair", "glasses", "emotion", "hair", "makeup", "occlusion", "accessories", "blur", "exposure", "noise"]
detected_faces = face_client.face.detect_with_stream(img, return_face_attributes = params)

#分析結果を表示する
print(detected_faces[0].as_dict())
```

# お試し画像その１
使用したのはこの画像です。フリー素材を使わせていただきました。
![1271992_s.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1359985/32766892-5553-d581-d765-5ed9cd396c9d.jpeg)

```
{'face_id': 'b2d813f9-4d75-4dff-9e70-8c488fba7c70', 
'face_rectangle': {'width': 157, 'height': 157, 'left': 298, 'top': 94}, 'face_attributes': {
'age': 1.0, 
'gender': 'female', 
'smile': 1.0, 
'facial_hair': {'moustache': 0.0, 'beard': 0.0, 'sideburns': 0.0}, 
'glasses': 'noGlasses', 
'head_pose': {'roll': 4.7, 'yaw': -5.8, 'pitch': 2.4}, 
'emotion': {'anger': 0.0, 'contempt': 0.0, 'disgust': 0.0, 'fear': 0.0, 'happiness': 1.0, 'neutral': 0.0, 'sadness': 0.0, 'surprise': 0.0}, 
'hair': {'bald': 0.11, 'invisible': False, 'hair_color': [{'color': 'brown', 'confidence': 0.9}, {'color': 'black', 'confidence': 0.77}, {'color': 'blond', 'confidence': 0.55}, {'color': 'gray', 'confidence': 0.55}, {'color': 'other', 'confidence': 0.21}, {'color': 'red', 'confidence': 0.08}, {'color': 'white', 'confidence': 0.0}]}, 
'makeup': {'eye_makeup': False, 'lip_makeup': False}, 
'occlusion': {'forehead_occluded': False, 'eye_occluded': False, 'mouth_occluded': False}, 
'accessories': [], 
'blur': {'blur_level': 'Low', 'value': 0.0}, 
'exposure': {'exposure_level': 'GoodExposure', 'value': 0.67}, 
'noise': {'noise_level': 'Low', 'value': 0.0}}}
```

# 属性の意味とお試し画像その１に対する結果

| 属性名 | 属性の意味 | 実行の結果 |
| ---- | ---- | ---- |
|  age  |  年齢　|女の子は「1.0」歳くらいに見えるのであっていそうです  |
|  gender |  性別　| 写っているのは女の子なので「female」となっています　|
|  headPose |  頭の向き | 正面を見ているように見えますが、「roll:4.7 yaw:-5.8 pitch:2.4」になっています |
|  smile | 笑顔 | 女の子は笑顔なので「1.0」になっています |
|  facialHair |  顔の毛 | 口ひげ、あごひげ、もみあげは生えてないので。すべて「0.0」になっています  |
|  glasses |  眼鏡 | 眼鏡をかけていないので「noGlasses」となっています|
|  emotion |  感情 | 幸せそうなので「happiness」の感情が1.0になっています |
|  hair |  髪　| 髪の特徴と髪の色です。<br>髪色は高い順に並んでいて「brown」が最初に表示されてます　|
|  makeup |  メイク | 目と口にメイクをしていないように見えるので「False」になっています |
|  occlusion |  閉塞 | 目や口は開いてるので「false」となっています。<br>「forehead_occluded」はよくわかりませんがこれも「false」になってます  |
|  accessories |  アクセサリー | 何もつけてないので何も表示されていません  |
|  blur |  ぼかし |「Low」で「0.0」なので、特にピンボケのない画像ってことなのかもしれません|
|  exposure |  露光 | 「GoodExposure」で「0.67」なので、光の量が充分ってことなのかもしれません|
|  noise |  ノイズ |「Low」で「0.0」なので、ノイズのない画像ってことなのかもしれません|

#お試し画像その２
全然違う結果が見たかったので、今度はこの画像を使ってみました。
口ひげ、あごひげ、もみあげが生えているので「moustache」「beard」「sideburns」が 0.6になってます。
口は完全に閉じてると思うんですが、「mouth_occluded」が「false」になっています。
 
![4717101_s.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1359985/29595704-9935-c9d1-2c7b-5f2c11fbea34.jpeg)

```
{'face_id': '87dc75f3-3b00-42da-b60d-e58d4c2c076c', 
'face_rectangle': {'width': 87, 'height': 87, 'left': 345, 'top': 107},
'face_attributes': {
'age': 49.0, 
'gender': 'male', 
'smile': 0.937, 
'facial_hair': {'moustache': 0.6, 'beard': 0.6, 'sideburns': 0.6}, 
'glasses': 'noGlasses', 
'head_pose': {'roll': -9.8, 'yaw': -14.6, 'pitch': -8.4}, 
'emotion': {'anger': 0.0, 'contempt': 0.0, 'disgust': 0.0, 'fear': 0.0, 'happiness': 0.937, 'neutral': 0.063, 'sadness': 0.0, 'surprise': 0.0}, 
'hair': {'bald': 0.04, 'invisible': False, 'hair_color': [{'color': 'brown', 'confidence': 0.97}, {'color': 'gray', 'confidence': 0.85}, {'color': 'black', 'confidence': 0.8}, {'color': 'blond', 'confidence': 0.47}, {'color': 'other', 'confidence': 0.07}, {'color': 'red', 'confidence': 0.02}, {'color': 'white', 'confidence': 0.0}]}, 
'makeup': {'eye_makeup': False, 'lip_makeup': False}, 
'occlusion': {'forehead_occluded': False, 'eye_occluded': False, 'mouth_occluded': False}, 
'accessories': [], 
'blur': {'blur_level': 'Low', 'value': 0.0}, 
'exposure': {'exposure_level': 'GoodExposure', 'value': 0.64}, 
'noise': {'noise_level': 'Medium', 'value': 0.31}}}
```

#お試し画像その３
次はこの画像を使ってみました。
フレームなしのメガネのせいか「glasses」が「noGlasses」になっていて、レンズを勘違いしてるのか「eye_makeup」が「true」になっています。明らかに口紅をしてますが「lip_makeup」は「false」になっています。
イアリングもしてますが、「accessories」の所には特に情報は入ってませんでした。

![4047404_s.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1359985/b3c1dc10-ab88-9531-69f6-17e8f7f4f9b3.jpeg)

```
{'face_id': '66984c1a-f827-46ee-8cf2-009279212d8d', 
'face_rectangle': {'width': 165, 'height': 165, 'left': 188, 'top': 123},
'face_attributes': {
'age': 70.0, 
'gender': 'female', 
'smile': 0.0, 
'facial_hair': {'moustache': 0.0, 'beard': 0.0, 'sideburns': 0.0}, 
'glasses': 'noGlasses', 
'head_pose': {'roll': -12.3, 'yaw': -20.0, 'pitch': 16.3}, 
'emotion': {'anger': 0.002, 'contempt': 0.0, 'disgust': 0.018, 'fear': 0.196, 'happiness': 0.0, 'neutral': 0.257, 'sadness': 0.45, 'surprise': 0.075}, 
'hair': {'bald': 0.09, 'invisible': False, 'hair_color': [{'color': 'gray', 'confidence': 1.0}, {'color': 'blond', 'confidence': 0.92}, {'color': 'other', 'confidence': 0.46}, {'color': 'black', 'confidence': 0.16}, {'color': 'brown', 'confidence': 0.09}, {'color': 'red', 'confidence': 0.01}, {'color': 'white', 'confidence': 0.0}]}, 
'makeup': {'eye_makeup': True, 'lip_makeup': False}, 
'occlusion': {'forehead_occluded': False, 'eye_occluded': False, 'mouth_occluded': False}, 
'accessories': [], 
'blur': {'blur_level': 'Low', 'value': 0.02}, 
'exposure': {'exposure_level': 'GoodExposure', 'value': 0.65}, 
'noise': {'noise_level': 'Low', 'value': 0.0}}}
```

#おわりに
FaceAPIでどんな情報が見えるのかと思っていろいろ試してみました。
メガネ、化粧、アクセサリなどの認識については多少の間違いもありそうですが、年齢や性別や感情認識を収集するようなIoTを検討する場合にはFaceAPIを使ってみるのも便利そうです。
Azureには物体検知のComputer Visionもあるので、今度はそっちのほうも触ってみたいなと思ってます。