クイック スタート: 画像から顔の表情を認識するアプリの作成Quickstart: Build an app to recognize emotions on faces in an image.

重要

Emotion API は、2019 年 2 月 15 日に非推奨となる予定です。The Emotion API will be deprecated on February 15, 2019. 現在は、Face API の一部として感情認識機能が一般提供されています。The emotion recognition capability is now generally available as part of the Face API.

このチュートリアルでは、Emotion API Recognize メソッド と Python を使って、画像内の 1 人以上の個人が表す感情を認識するための、役立つ情報とコード サンプルを提供します。This walkthrough provides information and code samples to help you quickly get started using the Emotion API Recognize method with Python to recognize the emotions expressed by one or more people in an image.

バインダーの起動バッジ Binder をクリックして、次の例を MyBinder 上で Jupyter Notebook として実行できます。You can run this example as a Jupyter notebook on MyBinder by clicking on the launch Binder badge: Binder

前提条件Prerequisite

無料のサブスクリプション キーをここから入手します。Get your free Subscription Key here

チュートリアルの実行Running the walkthrough

このチュートリアルを続行するには、前に入手した API キーで subscription_key を置き換えます。To continue with this walkthrough, replace subscription_key with the API key you obtained earlier.

subscription_key = None
assert subscription_key

次に、サービス URL が、API キーの設定時に使用したリージョンに対応することを確認します。Next, verify that the service URL corresponds to the region you used when setting up the API key. 試用版のキーを使用している場合、変更する必要はありません。If you are using a trial key, you do not need to make any changes.

emotion_recognition_url = "https://westus.api.cognitive.microsoft.com/emotion/v1.0/recognize"

このチュートリアルは、ディスクに保存されているイメージを使用します。This walkthrough uses images that are stored on disk. また、アクセスが公開されている URL にある画像を使用することもできます。You can also use images that are available via a publically accessible URL. 詳細については、REST API のドキュメントをご覧ください。For more information, see the REST API documentation.

画像データが要求本文に含めて渡されるため、Content-Type ヘッダーを application/octet-stream に設定する必要があることに注意してください。Since the image data is passed as part of the request body, notice that you need to set the Content-Type header to application/octet-stream. 画像を URL として渡している場合は、次のようにヘッダーを設定してください。If you are passing in an image via a URL, remember to set the header to:

header = {'Ocp-Apim-Subscription-Key': subscription_key }

URL を含むディクショナリを作成します。create a dictionary containing the URL:

data = {'url': image_url}

次を使用して、それを requests ライブラリに渡します。and pass that to the requests library using:

requests.post(emotion_recognition_url, headers=headers, json=image_data)

まず、Emotion API サイトからいくつかのサンプル画像をダウンロードします。First download a few sample images from the Emotion API site.

%%bash
mkdir -p images
curl -Ls https://aka.ms/csnb-emotion-1 -o images/emotion_1.jpg
curl -Ls https://aka.ms/csnb-emotion-2 -o images/emotion_2.jpg
image_path = "images/emotion_1.jpg"
image_data = open(image_path, "rb").read()
import requests
headers  = {'Ocp-Apim-Subscription-Key': subscription_key, "Content-Type": "application/octet-stream" }
response = requests.post(emotion_recognition_url, headers=headers, data=image_data)
response.raise_for_status()
analysis = response.json()
analysis
[{'faceRectangle': {'height': 162, 'left': 130, 'top': 141, 'width': 162},
  'scores': {'anger': 9.29041e-06,
   'contempt': 0.000118981574,
   'disgust': 3.15619363e-05,
   'fear': 0.000589638,
   'happiness': 0.06630674,
   'neutral': 0.00555004273,
   'sadness': 7.44669524e-06,
   'surprise': 0.9273863}}]

返される JSON オブジェクトでは、認識された顔に対して、境界ボックスと検出された感情が表示されます。The returned JSON object contains the bounding boxes of the faces that were recognized along with the detected emotions. それぞれの感情には 0 から 1 までのスコアが付いており、高いスコアは低いスコアよりも感情がはっきりしています。Each emotion is associated with a score between 0 and 1 where a higher score is more indicative of an emotion than a lower score.

次に示すコード行では、matplotlib ライブラリを使用して画像の顔の感情が検出されます。The following lines of code the detected emotions on the faces in the image using the matplotlib library. 見やすくするため、上位 3 つの感情のみが表示されます。To reduce clutter, only the top three emotions are shown.

%matplotlib inline
import matplotlib.pyplot as plt
from matplotlib.patches import Rectangle
from io import BytesIO
from PIL import Image

plt.figure(figsize=(5,5))

image  = Image.open(BytesIO(image_data))
ax     = plt.imshow(image, alpha=0.6)

for face in analysis:
    fr = face["faceRectangle"]
    em = face["scores"]
    origin = (fr["left"], fr["top"])
    p = Rectangle(origin, fr["width"], fr["height"], fill=False, linewidth=2, color='b')
    ax.axes.add_patch(p)
    ct = "\n".join(["{0:<10s}{1:>.4f}".format(k,v) for k, v in sorted(list(em.items()),key=lambda r: r[1], reverse=True)][:3])
    plt.text(origin[0], origin[1], ct, fontsize=20)    
_ = plt.axis("off")

次に示す annotate_image 関数を使用すると、ファイル システムのパスが指定された画像ファイルの上に感情をオーバーレイできます。The annotate_image function shown next can be used to overlay emotions on top of an image file given its path on the file system. これは、前に示した Emotion API を呼び出すコードに基づいています。It is based on the code for calling into the Emotion API shown earlier.

def annotate_image(image_path):    
    image_data = open(image_path, "rb").read()
    headers  = {'Ocp-Apim-Subscription-Key': subscription_key, "Content-Type": "application/octet-stream" }
    response = requests.post(emotion_recognition_url, headers=headers, data=image_data)
    response.raise_for_status()
    analysis = response.json()

    plt.figure()

    image  = Image.open(image_path)
    ax     = plt.imshow(image, alpha=0.6)

    for face in analysis:
        fr = face["faceRectangle"]
        em = face["scores"]
        origin = (fr["left"], fr["top"])
        p = Rectangle(origin, fr["width"], fr["height"], fill=False, linewidth=2, color='b')
        ax.axes.add_patch(p)
        ct = "\n".join(["{0:<10s}{1:>.4f}".format(k,v) for k, v in sorted(list(em.items()),key=lambda r: r[1], reverse=True)][:3])
        plt.text(origin[0], origin[1], ct, fontsize=20, va="bottom")    
    _ = plt.axis("off")

最後に、次の行に示すように、画像ファイルに対して annotate_image 関数を呼び出すことができます。Finally, the annotate_image function can be called on an image file as shown in the following line:

annotate_image("images/emotion_2.jpg")