Python・メモ:MS の Emotion API の使い方

Emotion API

Microsoft の Emotion API は画像を投げると写っている顔の表情をスコア化してくれるAPIです。 デモをつかてみたのでその時の内容は以下の記事を見てください。

gray-crown.hateblo.jp

今回はPythonから使うにはどうするかを調べたのでまとめてみました。

準備
  • Python (2.7 or 3.2、ここでは2.7で書きます)
  • Pythonライブラリ:httplib, base64
  • Microsoft Azure の subscription (APIのキーのため)

使い方

画像の送り方に二種類方法があるのでそれらを別々に見ていきます。

  1. 画像を外部からアクセス可能なサーバに置きURLを送信する
  2. 画像をローカルサーバからバイナリーデータとして送信する
URLで画像を指定する

import httplib, base64

headers = {
    # Request headers
    'Content-Type': 'application/json',
    'Ocp-Apim-Subscription-Key': '{subscription key}',
}

try:
    conn = httplib.HTTPSConnection('api.projectoxford.ai')
    conn.request("POST", "/emotion/v1.0/recognize", "{'url': 'http://example.com/picture.jpg'}", headers)
    response = conn.getresponse()
    data = response.read()
    print data
    conn.close()
except Exception as e:
    print "[Errno {0}] {1}".format(e.errno, e.strerror) 

このシンプルなコードで結果を得ることができます。 {subscription key}には自身のAPIキーを入力してください。 画像のURLを変更することで任意の画像を利用することができます。

バイナリデータとして画像を送る

import httplib, base64

headers = {
    # Request headers
    'Content-Type': 'application/octet-stream',
    'Ocp-Apim-Subscription-Key': '{subscription key}',
}

try:
    conn = httplib.HTTPSConnection('api.projectoxford.ai')
    conn.request("POST", "/emotion/v1.0/recognize", open('picture.jpg', 'rb'), headers)
    response = conn.getresponse()
    data = response.read()
    print data
    conn.close()
except Exception as e:
    print "[Errno {0}] {1}".format(e.errno, e.strerror) 

URLを指定する時とことなるのは、Content-Type が application/octet-stream となった点、 request関数のbody部分が画像をバイナリで読み込んだオブジェクトになっている点です。

レスポンス
  • 200:問題なし
  • 400:JSONのパースエラーもしくはContent-Typeが間違っている
  • 401:subscription key が間違っている
  • 403, 429:APIの呼びすぎ。エラーメッセージにしたがって一定時間待って再実行する。