【Python】ガキ使さようなら山崎邦正、山ちゃんの表情から感情をFace APIで分析してみる〜山ちゃんはあの時どんな感情だったのか〜


結論(何ができるか)

ガキ使さようなら山崎邦正の写真から山ちゃんの感情を分析することができる

背景

「こんな…いっぱい…花束…貰えるって誰が思いますか?」
ガキ使の名物企画さようなら山崎邦正。年一回のペースで放送されている企画で毎回楽しみにしている。一番の見所は山ちゃんの多彩な表情だ。毎回様々な表情を繰り出し、楽しませてくれる。でも山ちゃんは本当はどんな感情なんだろうかと疑問に思った。表情から感情を読み取ることができることもあるので、表情から感情を客観的に分析できる方法はないかと探していたらMicrosoftが提供しているFace APIというものを見つけた。写真の表情からAIが感情を分析してくれるらしい。Pythonの学習をかねてチャレンジしてみることにした。

全体の流れ

①ガキ使さようなら山崎邦正の時の写真を準備する
※今回は手動で素材を収集(スクレイピングでできるかな)
②写真をFace APIに投げる
③Face APIから返ってきた情報から一番高い数値の感情を抽出する
④抽出した結果をデータベースに格納する
⑤データベースに入った情報を集計する

実際のコード

main.py
# モジュール読み込み
import cognitive_face as CF
import sqlite3
import time
import glob

# face api設定情報
KEY = '**************************'
CF.Key.set(KEY)

BASE_URL = '**************************'
CF.BaseUrl.set(BASE_URL)

# パラメータemotionを取得して、一番値の高いものを変数に格納
# anger: 怒り, contempt: 軽蔑, disgust: 嫌悪, fear: 恐れ, 
# happiness: 幸福, neutral: 無表情, sadness: 悲しみ, surprise: 驚き
pic_list = []
for pic in glob.glob("img/*.jpeg"):
    faces = CF.face.detect(pic, face_id=False, landmarks=False, attributes='emotion')
    for face in faces:
        emo = face['faceAttributes']['emotion']
        emo = max(emo, key=emo.get)
        pic_list.append(emo)
        time.sleep(3)

# DB処理
dbpath = "emotion.db"
con = sqlite3.connect(dbpath)
cursor = con.cursor()

# 取得したpic_listをDBに格納し、集計
sql = 'INSERT INTO em(e)VALUES(?)'
for pic in pic_list:
    cursor.execute(sql, (pic,))
cursor.execute('select e, count(e) from em group by e')
data = cursor.fetchall()
print(data)

con.commit()

con.close
print("OK")

結果↓

[('anger', 3), ('disgust', 2), ('happiness', 8), ('neutral', 15), ('sadness', 7), ('surprise', 11)]

Face APIは他にも取得できるパラメータがあるので、追加すればもっといろいろなことができる。

まとめ

あんなに激しくおもしろい表情をだしているのに、意外と山ちゃんは無表情であることがわかった。サンプル数も少なく、写真の内容によって結果が変わってしまうかもしれないが、おもしろい結果が出た。今年もさようなら山崎邦正を楽しみにしている。
ちなみに、ダウンタウン二人の表情も分析したら・・・

[('neutral', 2)]

無表情(笑)

山ちゃんはやめへんで!

参考にした情報