Help us understand the problem. What is going on with this article?

MicrosoftのCognitive Servicesの表情認識APIを使ってみた

More than 1 year has passed since last update.

MicrosoftのCognitive Servicesの表情認識APIを使ってみた

注意: APIの使用方法がかなり変わってしまったので、いま記事を書き直しています。

ブログ宣伝:http://jotarout.hatenablog.com/

顔は心の窓?

人の表情を知ることで、その人の生理的・内部的状態を推定できるかもしれない。 コンピューターの力を借りて、あらゆる人の表情を認識してみよう。

Microsoftの表情認識APIを使う。

↑のサイトから登録して、APIキーを得たら、 ソースコードと同じディレクトリにapi_key.txtに保存しておく。

コードはこれ。同じディレクトリにAPIキーと好きな画像を用意しておく。 ひとまずは、表情の横っちょに5つ感情とレベルを表示するUIを引っ付ける、みたいなコードを書きます。

ms_emotion.py
# Calling Emotion APIs is
# restricted to 20 transactions per minute
# and 30,000 transactions per month.
# 20 transactions per 60 seconds
# 1 transaction per 3 seconds

import httplib
import urllib
import base64
import os
import sys
import cv2
import numpy as np
import json
import math

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

def display_expression(data,img):
    font = cv2.FONT_HERSHEY_PLAIN
    text = "test cyber"
    font_size = 1
    data = json.loads(data)
    for face in data:
        f_rec  =  face['faceRectangle']
        width  =  f_rec['width']
        height =  f_rec['height']
        left   =  f_rec['left']
        top    =  f_rec['top']
        f_rec  =  face['scores']
        f_rec = sorted(f_rec.items(), key=lambda x:x[1],reverse = True)
        cv2.rectangle(img,(left,top),(left+width,top+height),(130,130,130),2)
        cv2.rectangle(img,(left+width,top),(left+width+150,top+50),(130,130,130),-1)

        for i in range(0,5):
            val = round(f_rec[i][1],3)
            emo = f_rec[i][0]
            cv2.rectangle(img,(left+width,top+10*i),(left+width+int(val*150),top+10*(i+1)),(180,180,180),-1)
            cv2.putText(img, emo+" "+str(val),(left+width,top+10*(i+1)),font, font_size,(255,255,255),1)

if __name__ == '__main__':
    if len(sys.argv) != 2:
        print 'Usage: # python %s /path/to/image' % sys.argv[0]
        quit()

    with open('api_key.txt', 'r') as f:
        key = f.read().rstrip('\n')
    f.close()
    headers = {
        'Content-Type': 'application/octet-stream',
        'Ocp-Apim-Subscription-Key': key,
    }

    data = get_emotion(sys.argv[1], headers)
    img = cv2.imread(sys.argv[1],-1)

    display_expression(data,img)

    cv2.imshow('image',img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

python ms_emotion.py your_image.png で実行できる。

20160517002308.png
スクリーンショット 2016-05-25 21.06.06.png
スクリーンショット 2016-05-25 21.08.03.png

Screenshot from 2016-08-21 02-58-00.png

結構精度がいいと思う(小さい顔はあんまり取れない)。 表情は10種類ぐらいカテゴリ分けされるので、色々遊んでみると楽しそう。

動画像解析にも使えそうですね!APIが許してくれる限り・・・。

JotaroS
高専生だった系東大生 機械系だった系情報系 日本の大学生だったドイツの大学生
http://jotaros.github.io
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away