Face API & Emotion API + Python 試してみた
巷で有名, Face API とは
Microsoftが提供しているMicrosoft Azure
その中のCognitive ServiceにあるFace APIが今回のターゲットです!
端的にいうと顔認識のweb APIですね。画像を渡すと、顔のある位置や年齢、顔のパーツの場所などをJSONファイルで返してくれるというものです。筆者、初めてAPIに触ったため多少ワクワクしておりました。それでは導入から行ってみましょう!
Face API導入
Microsoft Azure アカウント作成
Face API - 顔認識 | Microsoft Azure
とりあえず、このページの[無料アカウント]からAzureアカウント作成しました。クレジットカード情報記入とか結構めんどくさかった
Face APIのAPI KEYを取得
上記Azure Portalにて
- 左サイドメニューの[その他のサービス]
- 割と下までスクロールして[インテリジェンス+分析]グループ
- [Cognitive Service accounts]をクリック→[Face API]
- フォームはかなり適当に記入しました
- ダッシュボードに戻るなどして、先ほど自分が作成したリソースに飛ぶ
- 左から二番目のメニューバーのキーをクリックしたらジャーン
使ってみる
公式スタートアップ
Face API Python quick start | Microsoft Docs
最初に述べたように、自分がキーを取得した地域のurlにPOSTすることでJSONが返ってきます。APIってこういう感じなのだな。ふむふむ。
このQuick Startsの注意点
python2系とpython3系でかき分けているように見えるが罠です。
自分が使っている方だけ読めばいいわけではなく、
- python2: urlを用いた画像の受け渡し方法
- python3: バイト列を用いた画像の受け渡し方法
としれっと画像の渡し方を変えています。両方読みましょう笑
別の注意
https://docs.microsoft.com/ja-jp/azure/cognitive-services/face/quickstarts/python
上記ページは公式スタートアップに類似しているというか、本質的には同じはずだが、日本のページで(ja-jp)、なぜか必要なコードが消されているため要注意
公式リファレンス
ここに詳細なデータの渡し方や返ってくる値が書いてある Face APIにある機能は大きく分けると
- Detect: 顔の位置, パーツの位置など
- Find Similar: 二つ画像を渡すと顔がどれだけ似ているかがスコアとして返される
- Group: グループ分けしてくれる(まだ勉強不足)
- Identify: (まだ勉強していない)
- Verify: 顔認証, Detectと併用するらしい
cognitive_faceライブラリ
これ使うと、urllibとかrequestとかを勝手に使ってくれてて楽そう。 (日本語ドキュメントほぼ見つからないから英語か。。。) →Emotionの方で使えなさそうというか、これのライブラリの使い方で時間取られそうで本末転倒なのでこの子はスルー
Emotion APIについて
基本的にFace APIとほとんど同じことをすれば良い 違い
- urlとAPIキーを変える必要がある
- paramを空で渡す
- cognitive_faceが使いない(ないし筆者が使い方わからない、ドキュメント不足)
くらいと思われます。
コード
Face API with local image file
import requests
url = 'https://westus.api.cognitive.microsoft.com/face/v1.0/detect'
headers = {
'Content-Type': 'application/octet-stream',
'Ocp-Apim-Subscription-Key': 'c1d3ab4f6c2j40ao4k1813bf24c8a7f',
}
params = {
'returnFaceId': 'true', # The default value is true.
'returnFaceLandmarks': 'false', # The default value is false.
'returnFaceAttributes': 'age,gender', # age, gender, headPose, smile, facialHair, and glasses.
}
if __name__ == '__main__':
r = requests.post(url ,headers = headers,params = params,data = open("1643_fukada_kyoko.jpg",'rb'))
print(r.text)
result
[{"faceId":"c43a79cd-6bb6-424d-91ef-2e143cf61444","faceRectangle":{"top":133,"left":198,"width":191,"height":191},"faceAttributes":{"gender":"female","age":27.2}}]
Emotion API with image url
import requests
import json
url = 'https://westus.api.cognitive.microsoft.com/emotion/v1.0/recognize'
image_url = "http://img.horipro.co.jp/wp-content/uploads/sites/17/2014/09/4efa1206c3ddde742caafee8af2a531e.jpg"
headers = {
'Content-Type': 'application/json',
'Ocp-Apim-Subscription-Key': '3c8a635a9b849dc2a5a72926222e25fd',
}
params = {}
payload = {
"url": image_url,
}
if __name__ == '__main__':
r = requests.post(url ,headers = headers,params = params,data = json.dumps(payload))
print(r.text)
result
[{"faceRectangle":{"height":783,"left":339,"top":708,"width":783},"scores":{"anger":4.83580443E-05,"contempt":0.0011530855,"disgust":7.445373E-05,"fear":0.00015271669,"happiness":0.0037932964,"neutral":0.98582983,"sadness":0.00710687134,"surprise":0.00184137118}}]
こんな感じになります。 気をつけるところはurlで画像を送る時は
"Content-Type": "application/json"
localの画像を送る時は
"Content-Type": "application/octet-stream"
とすることと、urlの中のwestus
の部分を自分がAPIキーを取得した地域に変えることですかね。
楽しそうなのでしばらくこれで遊んでます。