Microsoft Azureが提供しているFace APIで顔認識し、人間でも場合によっては読み取ることの難しい「感情」をAIは認識することができるようになるのか、動画から顔の表情を抽出して、感情を分析してみようと思います。

チャレンジ&ナレッジ最終更新日: 20191218

顔認識ソフトウェア「Face API」を使って、彼氏のことが大好きな女の子の表情から感情を読み取ってみた

  • このエントリーをはてなブックマークに追加

ライターのranranです。近年、様々な分野に特化したAIが次々と登場していますが、その中でもやはり気になるのは人間の「感情」を理解しようと試みるAIではないでしょうか。

人間でも場合によっては読み取ることの難しい「感情」を機械は認識することができるようになるのでしょうか? また、現段階でどのくらいまで認識できているのでしょうか?

私が協力した下記の記事では、動画から抽出した音声データを使い、感情の分析を行いました。
“音声感情解析AIを使って、彼氏のことが大好きな女の子の声から感情を読み取ってみた”
https://www.pc-koubou.jp/magazine/27137

今回は、動画から顔の表情を抽出して、感情を分析してみようと思います。また、音声データでの結果と顔の表情からの結果を比較してみたいと思います。

データの準備

まず彼氏のことが大好きだという知人の女の子に、それぞれのセリフを発しているところを動画に撮ってもらいました。

準備したのは、以下の4つのシチュエーションです。

シチュエーションA
彼氏にサプライズでディズニーに連れて行ってもらえることになった

シチュエーションAの動画イメージシチュエーションAの動画イメージ

シチュエーションB
彼氏に「明日は何時まで予定あるの?」と聞かれた

シチュエーションBの動画イメージシチュエーションBの動画イメージ

シチュエーションC
彼氏に知らない女からLINEが来ているのを見つけた

シチュエーションCの動画イメージシチュエーションCの動画イメージ

シチュエーションD
彼氏から、明日のデートに仕事で行けなくなったと伝えられた

シチュエーションDの動画イメージシチュエーションDの動画イメージ

実際の分析には動画ではなく静止画で分析を行うため、これらの動画から静止画を切り出していきます。

動画から画像を切り出す

動画から画像を切り出すツールにはフリーウェアを含めて様々なソフトウェアがありますが、フレーム(1秒間に表示する映像のコマ数)単位で書き出しができるものを使用してください。

Windows 10の場合は標準でインストールされている「フォト」を使用すると1フレーム単位での静止画書き出しが可能です。今回はひとつの動画について1秒あたり20枚の画像を書き出し、5秒で100枚の画像を準備しました。

今回は5秒の動画から、1秒あたり20枚ずつ切り出し、100枚の画像にしました。今回は5秒の動画から、1秒あたり20枚ずつ切り出し、100枚の画像にしました。

Face APIとは?

ここまでで切り出した画像の表情から感情を分析していくのに使用する「Face API」について説明します。

「Face API」はMicrosoft Azureが提供している顔認識ソフトウェアです。今回は感情の分析に使用しますが、2つの顔が同一人物のものである確率を算出したり、年齢や性別、姿勢、メガネの有無、ヒゲの有無などの分析も行えたりします。

下記の公式ページより、画像をアップロードして各機能を試すことができるので、ぜひ試してみてください!

“Face API – 顔認識ソフトウェア | Microsoft Azure”.Microsoft.2019.
https://azure.microsoft.com/ja-jp/services/cognitive-services/face/

Face APIの使い方

サブスクリプションキーの取得

今回は、このFace APIをPythonから使用するので公式ページの「Faceを試す」から会員登録を行います。

会員登録が完了したら、ポータルに移動します。

ポータル画面ポータル画面

ポータルに移動したら、「すべてのサービス」から「cognitive services」を検索します。

「すべてのサービス」から「cognitive services」を検索「すべてのサービス」から「cognitive services」を検索

「Cognitive Services」を選択して「追加」をクリックすると、「Marketplace」に移動するので、そこで「Face」と検索します。

「Marketplace」で「Face」を検索「Marketplace」で「Face」を検索

「Face」が出てきたら「作成」をクリックすると、必要情報を入力する画面が出てきますが、名前・場所・リソースグループなどは、適宜入力してください。価格レベルについては、下記サイトに詳しい説明がありますが、今回の分析を行うだけであれば無料で全く問題ありません。

“価格 – Face API | Microsoft Azure”.Microsoft.2019.
https://azure.microsoft.com/ja-jp/pricing/details/cognitive-services/face-api/

入力が完了したら、「作成」をクリックします。すると、Face APIが利用できるように準備を始めてくれます。
準備が終わったら、メニューから「キー」をクリックします。

ここに記載されているサブスクリプションキーを使用ここに記載されているサブスクリプションキーを使用

ここに記載されているサブスクリプションキーを使用します。キーは2つありますが、使用するのは「キー1」のみで、「キー2」は予備となります。

PythonからFace APIを使う

今回は「cognitive_face」というライブラリを使用して、PythonからFace APIを動かします。

環境構築の方法は下記の記事を参考にしてください。

“Python Windowsで開発環境の構築”
https://www.pc-koubou.jp/magazine/4188

「cognitive_face」は下記のコマンドでpipを使いインストールします。

$ pip install cognitive_face

続いて、下記の公式マニュアルを参考にしながら、画像から顔の表情を分析していきます。

“Quickstart: Face client library for Python”.Microsoft.2019.
https://docs.microsoft.com/ja-jp/azure/cognitive-services/face/quickstarts/python-sdk

import cognitive_face as CF

KEY = 'サブスクリプションキー'
BASE_URL = 'https://japaneast.api.cognitive.microsoft.com/face/v1.0'

CF.Key.set(KEY)
CF.BaseUrl.set(BASE_URL)

img_url = "画像のファイル名"
faces = CF.face.detect(img_url, attributes='emotion')

print(faces)

上記のコードを実行すると、下記のように結果が返ってきます。

分析した画像分析した画像

[{'faceId': '238abd1b-5554-495a-8aac-445188157433', 'faceRectangle': {'top': 3, 'left': 352, 'width': 432, 'height': 432}, 'faceAttributes': {'emotion': {'anger': 0.0, 'contempt': 0.0, 'disgust': 0.0, 'fear': 0.0, 'happiness': 1.0, 'neutral': 0.0, 'sadness': 0.0, 'surprise': 0.0}}}]

’emotion’: {‘anger’: 0.0, ‘contempt’: 0.0, ‘disgust’: 0.0, ‘fear’: 0.0, ‘happiness’: 1.0, ‘neutral’: 0.0, ‘sadness’: 0.0, ‘surprise’: 0.0の部分が顔の表情から感情を分析した結果となります。

この結果の場合、下記のような結果となりました。結果の数値は0.0〜1.0の間で表されています。

●anger(怒り):0.0
●contempt(軽蔑):0.0
●disgust(嫌悪):0.0
●fear(恐怖):0.0
●happiness(幸福):1.0
●neutral(平常):0.0
●sadness(悲しみ):0.0
●surprise(驚き):0.0

この画像の分析結果でははっきりと幸福のみが1.0となっています。

分析結果

シチュエーションごとに100枚程度ずつの分析結果を求め、それぞれの結果の平均値を算出しました。

A:彼氏にサプライズでディズニーに連れて行ってもらえることになった
B:彼氏に「明日は何時まで予定あるの?」と聞かれた
C:彼氏に知らない女からLINEが来ているのを見つけた
D:彼氏から、明日のデートに仕事で行けなくなったと伝えられた

各感情で最も高い値に着色各感情で最も高い値に着色

全体的に「平常」の値が大きくなってしまっているものの、「幸福」・「驚き」で最も値が高かったのは、シチュエーションAでサプライズに驚きながら喜んでいるという感情をうまく認識できています。
事務的な印象の強いBでは「平常」が最も高くなっており、淡々と怒っている様子のCでは「怒り」・「嫌気」・「悲しみ」が高くなっています。落ち込んでいるシーンのDは「恐怖」が高くなっており、「悲しみ」などはあまり高くないという結果になりましたが、いずれもそこそこ納得感のある結果となっています。

声データから分析した感情の結果との比較

最後に、音声感情解析AIを使って、「音声感情解析AIを使って、彼氏のことが大好きな女の子の声から感情を読み取ってみた」記事の分析結果と今回の顔の表情からの分析結果を比較してみたいと思います。
“音声感情解析AIを使って、彼氏のことが大好きな女の子の声から感情を読み取ってみた”
https://www.pc-koubou.jp/magazine/27137

音声からの分析結果と今回の結果とで共通している「平常」「怒り」「喜び」「悲しみ」の4つの感情について比較します。また、各結果の値の表し方が異なっていたので、どちらも0〜100の値になるように調整しました。

顔の表情と音声からの分析結果の比較顔の表情と音声からの分析結果の比較

表情からの分析結果では全体的に値が低く差が出にくかった「悲しみ」「怒り」も音声では値に差が出ていました。

それぞれの分析では異なるAPIを使用しているため、安易に比較をすることはできません。しかし、結果を見比べてみると、表情よりも音声のほうが感情は分析しやすそうなのかな?と感じました。
確かに今回分析に使用した動画の表情のみを見たとき、嬉しそうな表情は読み取ることができそうですが、悲しいのか怒っているのかを判別するのは人の目でも困難なのではないかと感じました。一方で、音声のみの場合のほうが話し手の感情は推測しやすそうでした。それが今回の結果にも反映されているのではないかと思いました。

今回は、Microsoft Azureの「Face API」を使って顔の表情から感情を分析してみました。

音声から感情を分析することのできる「Empath」も今回の「Face API」も手軽に利用することができるので、自分でいろいろな素材を準備してぜひ試してみてください!

また、今回感情の分析を行ってみて、私たちは普段、人とコミュニケーションを取るとき、顔の表情や声のトーン、視線、ボディーランゲージ、話すスピードなど様々な情報から総合的に相手の気持ちを感じ取っていることを改めて実感しました。

そのようなことを考えると、これからは多くの情報から複合的に感情を認識するAIが増えていきそうだなと思いました。そもそも定量的に扱うのが非常に難しい感情ですが、人間よりも正確に機械が感情を読み取れるようになる時代が来たらどうなるのだろう…?といろんな想像が膨らんだ検証でした。

ranranプロフィール画像
ライタープロフィール ranran

工学部女子大生とライターをしています。卒業研究で彼氏の浮気を防ぐためにSNS上で彼氏と彼氏のフォロワーの親密度推定に挑戦中。大学院では計量言語学を専攻予定。

記事を
シェア