はじめに
先日、赤ちゃんの感情を読み取るベビーカメラを作った際に、AzureのFaceAPIを使ったのですが、感情以外にもいろいろな情報を読み取ることができそうなので、どんな情報があるのか試しに使ってみようと思いました。
FaceAPIを使うまでの準備
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もあるので、今度はそっちのほうも触ってみたいなと思ってます。