LoginSignup
31
37

More than 3 years have passed since last update.

OpenCVとAmazon Rekognitionでリアルタイムに顔の表情から感情を分析する

Posted at

image.png

AmazonRekognitionを使用すると物体認識だけでなく、顔認識やその感情分析までできるようです。
機械学習の専門家でなくてもAPIを利用するだけで手軽に画像認識が使えるというのは非常に魅力的です。
これを動画のようにリアルタイムでスキャンして解析できたら面白いだろうと思い、少し描いてみました。

今回作成したソースコードはこちらです。
公開しているリポジトリにはAmazonRekognitionを使用したソースコード以外にもOpenCVだけの機能で実装した顔検知も含まれています。

動作イメージ

笑顔を検知すると、四角い線が緑になるように実装しています。
左上には感情分析の結果を表示、SUPRISEDやCONFUSEDが目立ちますw
detect_faces.gif

実装

想像以上に簡単に実装できました。
Rekognitionには画像ファイルをAPIで送信し、返却されたJsonに顔認識の情報などが含まれているので
あとはJsonの中身を整形して画面に出せばいいというだけです。

detect_faces.py
import cv2
import numpy as np
import boto3

# スケールや色などの設定
scale_factor = .15
green = (0,255,0)
red = (0,0,255)
frame_thickness = 2
cap = cv2.VideoCapture(0)
rekognition = boto3.client('rekognition')

# フォントサイズ
fontscale = 1.0
# フォント色 (B, G, R)
color = (0, 120, 238)
# フォント
fontface = cv2.FONT_HERSHEY_DUPLEX

# q を押すまでループします。
while(True):

    # フレームをキャプチャ取得
    ret, frame = cap.read()
    height, width, channels = frame.shape

    # jpgに変換 画像ファイルをインターネットを介してAPIで送信するのでサイズを小さくしておく
    small = cv2.resize(frame, (int(width * scale_factor), int(height * scale_factor)))
    ret, buf = cv2.imencode('.jpg', small)

    # Amazon RekognitionにAPIを投げる
    faces = rekognition.detect_faces(Image={'Bytes':buf.tobytes()}, Attributes=['ALL'])

    # 顔の周りに箱を描画する
    for face in faces['FaceDetails']:
        smile = face['Smile']['Value']
        cv2.rectangle(frame,
                      (int(face['BoundingBox']['Left']*width),
                       int(face['BoundingBox']['Top']*height)),
                      (int((face['BoundingBox']['Left']+face['BoundingBox']['Width'])*width),
                       int((face['BoundingBox']['Top']+face['BoundingBox']['Height'])*height)),
                      green if smile else red, frame_thickness)
        emothions = face['Emotions']
        i = 0
        for emothion in emothions:
            cv2.putText(frame,
                        str(emothion['Type']) + ": " + str(emothion['Confidence']),
                        (25, 40 + (i * 25)),
                        fontface,
                        fontscale,
                        color)
            i += 1

    # 結果をディスプレイに表示
    cv2.imshow('frame', frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

boto3を利用するので~/.aws/credentialsにアクセスキーとシークレットキーを格納するのをお忘れずに
boto3を使用する際のAWS認証情報の取り扱いはこちらの公式ドキュメントを参考にしてください。

$ cat ~/.aws/credentials

[default]
aws_access_key_id = xxxxxxxxxxxxxxxxxxxx
aws_secret_access_key = yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy

さいごに

最近ではOpenCV.jsというJavaScriptで動作するOpenCVも話題になっていますね。
これをうまく使えばフロントエンド(ブラウザ)での顔認識+感情分析も簡単に実装できるかもしれませんね

31
37
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
31
37