ぴよまるの雑多な技術所

間違えて休職中ってずっと書いていて心配されていました。全部ちょっとずつ齧って好きって思える技術を見つけたい。研究分野は数理最適化。

リアルタイム感情認識をしてみた

背景

いろいろあって以下のリポジトリの感情認識を使おうと思いました。Raspberry Piとかと組み合わせてIoT的なことをしたいと思っていて、感情ごとに出力がかわるといいなと思っています。ローカルで試しました。Macの内蔵のカメラを使ってデモコードを動かすことがゴールです。

github.com

リポジトリ概要

こちらが論文です。まとめるとCNN使って性別と感情を認識できるようにしたよという論文です。 出力は{"angry", "disgust", "fear", "happy", "sad", "surprise", "neutral"}の7種類です。今回はリアルタイムに表情認識がしたいのでリポジトリの中でも> src/video_emotion_gender_demo.pyだけ見れば大丈夫です。ちなみにtrained_modelsとかは学習済みのパラメータが読めない形で入っていたり、imagesはテスト用の画像(おそらく)が入っていたり、datasetsはローカルでデータ入れるようのフォルダだったりするので、実質srcフォルダのみを追います。

コードの解説

video_capture = cv2.VideoCapture(0) ここで内蔵のカメラとか接続したカメラから画像をよみとっています。あとはemotion_label_arg = np.argmax(emotion_classifier.predict(gray_face))でモデルにむかって推測してねを投げています。emotion_label_argに0,1,2…のラベルの数値が入っていて、emotion_textは「neutral」とか「happy」とかが入っています。このあたりを使えば感情ごとに何か制御できそう。

環境構築でつまづいた話

ちなみにリポジトリにはこのリポジトリは非推奨で、新しいTensorFlow2系で書いた方を使ってねとありますが、pipでインストール形式になっていてコードリーディング がしにくかったです(能力不足)。そのため旧リポジトリでゴリ押ししようと思いました。

という環境でREQUIREMENTS.txtを片っ端からバージョン無視してインストールしても動きました。 ただ、バージョンを揃えようとするとopen sslのエラーにぶちあたったり、opencvでエラーが起きたりしました。

上記の方針でもうとにかく自分のバージョンでいくぜ!としたのでTesorFlowも結局2.5です。 一応バージョンそろえたpip freezeをgistにあげます。

face_classificationのrequrements.txt · GitHub

あと気にするべきことは以下です。

  • Macのカメラアクセスを設定から許可する必要がある
  • OpenCVのビルド時にVideo I/OのFFMPEGがYESになっている必要がある
  • cv2.VideoCapture(0)の0のところは-1とか1の可能性もある(自動でカメラに割り当てられているみたい)、特にこの場合は明確にエラーが出なくてわからなさそう

OpenCVのビルド情報については

import cv2
print(cv2.getBuildInformation())

で確認できます。

これで無事に感情認識ができるようになりました。やったね