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


はじめに

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

FaceAPIを使うまでの準備

  1. Azureのコンソールで「すべてのサービス」からFaceAPIを選択

  2. 基本情報を入れてインスタンスの作成

  3. 作成したインスタンスからキーとエンドポイントの情報を取得

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

FaceAPIの使い方

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

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

#!/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())

お試し画像その1

使用したのはこの画像です。フリー素材を使わせていただきました。

{'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}}}

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

属性名 属性の意味 実行の結果
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 髪  髪の特徴と髪の色です。
髪色は高い順に並んでいて「brown」が最初に表示されてます 
makeup メイク 目と口にメイクをしていないように見えるので「False」になっています
occlusion 閉塞 目や口は開いてるので「false」となっています。
「forehead_occluded」はよくわかりませんがこれも「false」になってます
accessories アクセサリー 何もつけてないので何も表示されていません
blur ぼかし 「Low」で「0.0」なので、特にピンボケのない画像ってことなのかもしれません
exposure 露光 「GoodExposure」で「0.67」なので、光の量が充分ってことなのかもしれません
noise ノイズ 「Low」で「0.0」なので、ノイズのない画像ってことなのかもしれません

お試し画像その2

全然違う結果が見たかったので、今度はこの画像を使ってみました。
口ひげ、あごひげ、もみあげが生えているので「moustache」「beard」「sideburns」が 0.6になってます。
口は完全に閉じてると思うんですが、「mouth_occluded」が「false」になっています。

{'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}}}

お試し画像その3

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

{'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もあるので、今度はそっちのほうも触ってみたいなと思ってます。