dondakeshimoの丸太

データサイエンス/Webアプリケーション/

Face API & Emotion API + Python 試してみた

巷で有名, Face API とは

Microsoftが提供しているMicrosoft Azure
その中のCognitive ServiceにあるFace APIが今回のターゲットです!

azure.microsoft.com

端的にいうと顔認識のweb APIですね。画像を渡すと、顔のある位置や年齢、顔のパーツの場所などをJSONファイルで返してくれるというものです。筆者、初めてAPIに触ったため多少ワクワクしておりました。それでは導入から行ってみましょう!

Face API導入

Microsoft Azure アカウント作成

Face API - 顔認識 | Microsoft Azure

とりあえず、このページの[無料アカウント]からAzureアカウント作成しました。クレジットカード情報記入とか結構めんどくさかった

Face APIAPI KEYを取得

Microsoft Azure

上記Azure Portalにて

  1. 左サイドメニューの[その他のサービス]
  2. 割と下までスクロールして[インテリジェンス+分析]グループ
  3. [Cognitive Service accounts]をクリック→[Face API]
  4. フォームはかなり適当に記入しました
  5. ダッシュボードに戻るなどして、先ほど自分が作成したリソースに飛ぶ
  6. 左から二番目のメニューバーのキーをクリックしたらジャーン

使ってみる

公式スタートアップ

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)、なぜか必要なコードが消されているため要注意

公式リファレンス

Microsoft Cognitive Services

ここに詳細なデータの渡し方や返ってくる値が書いてある 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キーを取得した地域に変えることですかね。 楽しそうなのでしばらくこれで遊んでます。

参考資料

azure-recipe.kc-cloud.jp