
はじめに
表情分析は、画像や動画などのデータから人の感情や心理状態を推定するための技術です。その応用範囲は広く、顧客サービスから心理学研究まで様々な分野で利用されています。
本記事では、プロトタイプの開発にあたり実施したPy-Feat機能検証結果および、アプリケーション開発への活用の展望についてご紹介します。
目次
Py-Feat とは
Py-Feat は Python で書かれたオープンソースの表情分析ツールです。
顔の特徴抽出や感情分類などの機能を提供し、表情データの解析を行うことができます。
Py-Featでは主に以下6つの機能が提供されています。
これらはモデル学習済の機能として提供されており、各機能においてモデルを選択することも可能です。
【顔検出(Face detection)】
画像やビデオ内の顔を検出する技術です。画像やビデオ内の顔の位置や領域を特定することができます。
【顔のランドマーク検出(Facial Landmark Detection)】
顔の特定のポイントや、目の位置、鼻の先、口の端などのランドマークを検出する技術です。顔の形状を認識するために使用され、顔の特定の部位の位置を特定することができます。
【感情分析(Emotion Detection)】
人間の顔から感情や表情を推定する技術です。
Py-Featでは検出した顔について、以下7種類の感情に分類し評価することができます。
- anger (怒り)
- disgust (嫌悪)
- fear (恐れ)
- happiness (幸せ)
- sadness (悲しみ)
- surprise (驚き)
- neutral(中立・無表情)
【AUモデルの評価(Action Unit(AU))】
Action Unit(以降AU)は個々の筋肉または筋肉群の基本的な行動の行動単位を指します。AUを要素に顔面動作を包括的かつ客観的に記述することができます。
AU1は眉の内側を上げる、AU27は口を大きく開く、AU42は薄目など顔の動きを定義しています。
これらのAUモデルを組み合わせることで、驚きの表情は AU1+AU2+AU5+AU26 という形でコード化し表現することができます。
【顔の姿勢検知(Facial Pose Estimation)】
画像やビデオ内の人の顔の位置、向き、姿勢などを推定する技術です。
顔の画像内で特定のランドマークや特徴点を検出し、それらを使用して、顔の位置、向き、姿勢などを推定します。
これらの推定には、一般的な顔の形状や姿勢を表すモデルを使用して、検出された特徴点から顔の姿勢を推定が行われます。
【顔検証と認識(Identity detection)】
人の顔をもとに、顔認識、検証、およびクラスタリングを行う技術です。提示された他の画像に対する類似度の計測などを行うことができます。
機能の検証
アプリケーションの開発にあたり、Py-Feat の基本的な機能の検証を行いました。
基本機能の検証:顔検出など基本的な機能には問題なし。
1人が映った静止画をインポートし、顔検出、顔ランドマークをもとにした線、顔の姿勢の結果を画像にプロットしました。
また、テキストデータとして上記3つの情報と、AUモデル、検出された感情の値も出力しています。
(図1:検証結果)
#detector.detect_image("/content/sample_data/single_persone.png")実行結果を整形して表示
*********
FaceRectX FaceRectY FaceRectWidth FaceRectHeight FaceScore
0 144.359972 79.519393 115.364806 149.545427 0.999709
*********
AU01 AU02 AU04 AU05 AU06 AU07 AU09 AU10 AU11 AU12 AU14 AU15 \
0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0 0.0
AU17 AU20 AU23 AU24 AU25 AU26 AU28 AU43
0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0
*********
anger disgust fear happiness sadness surprise neutral
0 0.001558 0.000392 0.000157 0.831065 0.002536 0.000876 0.163416
*********
Pitch Roll Yaw
0 -3.600864 6.010648 -6.686094
*********
顔の位置を正しく特定し、目、鼻、口といった要素も正しく取得することができているようでした。
複数人が映った画像のインポートとその出力も行いました。
(図2:検証結果)
# detector.detect_image("/content/sample_data/multiple_people.png")の実行結果を整形して表示
********
FaceRectX FaceRectY FaceRectWidth FaceRectHeight FaceScore
0 634.581200 317.219857 65.557512 86.221052 0.999233
1 169.306551 315.908460 66.989123 84.017286 0.998125
2 1074.781266 376.384208 71.840014 86.893409 0.996744
3 416.022599 230.647841 73.936800 99.516348 0.996727
4 840.495851 232.866262 76.583669 93.945456 0.994253
*********
AU01 AU02 AU04 AU05 AU06 AU07 AU09 AU10 AU11 AU12 AU14 AU15 \
0 1.0 0.0 0.0 0.0 1.0 1.0 0.0 1.0 1.0 1.0 1.0 0.0
1 0.0 0.0 0.0 0.0 1.0 1.0 0.0 1.0 1.0 1.0 1.0 0.0
2 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 0.0 1.0 1.0 0.0
3 0.0 0.0 0.0 0.0 1.0 1.0 0.0 0.0 1.0 1.0 1.0 0.0
4 0.0 0.0 0.0 0.0 1.0 1.0 0.0 1.0 1.0 1.0 1.0 0.0
AU17 AU20 AU23 AU24 AU25 AU26 AU28 AU43
0 0.0 1.0 0.0 0.0 1.0 1.0 0.0 0.0
1 0.0 1.0 0.0 0.0 1.0 0.0 0.0 0.0
2 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
3 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0
4 0.0 1.0 0.0 0.0 1.0 0.0 0.0 0.0
*********
anger disgust fear happiness sadness surprise neutral
0 0.000037 0.000010 0.000055 0.999028 0.000308 0.000425 0.000137
1 0.000076 0.000352 0.000016 0.998592 0.000299 0.000087 0.000577
2 0.000026 0.000017 0.000004 0.998929 0.000669 0.000031 0.000325
3 0.000311 0.004219 0.001661 0.987952 0.002773 0.000346 0.002738
4 0.000017 0.000012 0.000022 0.999884 0.000023 0.000038 0.000004
*********
Pitch Roll Yaw
0 1.737725 -3.159160 1.135254
1 0.716876 0.615392 -7.928871
2 5.461404 -14.069299 -8.962029
3 -6.092765 -12.362930 21.384658
4 2.657561 -3.232884 10.044941
```
複数人の場合でも、顔が小さいため描画がつぶれてしまっていますが、おおかた正しく取得することができているようでした。
アプリケーションの開発に向けた検証
お客様へのより関心の高い情報の提供を目的とし、社内プロトタイプの開発として、表情分析を活用した興味・関心の可視化アプリケーションの開発取り組んでいます。
開発にあたり、必要なデータはPy-Featで取得することができるのか、機能の詳細な検証を行いました。
アプリケーション実装に必要な要件は主に下記としました。
記事の都合上、要件は一部省略しています。
- 表情
- Neutral(中立≒無表情)の検知
- 顔の動きの検知:
- まゆを顰める(AU4 Brow lowererの検出)
- 瞬き(AU45 Blinkの検出)
- 眼球が頻繁に動いている
- 姿勢の検知:
- 姿勢の変化が少ない
- 頷き
詳細な検証:顔要素の細かい検出は苦手だが、姿勢検出の精度は◎
ウェブカメラを使用してリアルタイムに顔の検出を行い、機能の検証を行いました。
検証の結果、筆者が注目したPy-Featの特徴4点をまとめました。
感情分析は日本的なコミュニケーションにおいては不向き
無表情が検出されることが多く、次いで幸せ、驚き といった口の動きに特徴ある感情が頻繁に検出される傾向が見受けられました。
その他の感情を検出させるには、いわゆる日本的なコミュニケーションでの表情と比べると、目元、眉、口角に 大げさ、な動きが必要でした。
今回実装するアプリケーションには直接影響はないものの、会話中など日常的なシチュエーションでの活用はあまり現実的ではないように感じました。
検出できるAUモデルは22種類
AUモデルの取得が可能、とありますが実際に取得することができるのは34種類中20種類でした。
目、瞼の動きはAUモデルとして出力することができないため、それらを計測する場合はランドマークなどを活用し独自に検出ロジックを組んでいく必要があることがわかりました。
(図3:AUモデルの一覧。検出可能なAUモデルを青で着色)
眼球の動きは取得不可
眼球の動きを計測するため、顔ランドマークのデータをもとに黒目(くろめ)回りの4点の位置を取得しその動きの検知を試みました。

(図4:顔lamdmarkサンプル)
A Comparison of Face Verification with Facial Landmarks and Deep Features - Scientific Figure on ResearchGate. Available from: https://www.researchgate.net/figure/68-facial-landmarks_fig1_338048224 [accessed 22 Mar, 2024]
顔ランドマークの検出について
landmark38,39,41,42、landmark44,45,47,48 は黒目の周り4点を検知しているように見えていましたが、実際は目の縁、もしくは瞼の位置をとっているような動きをしていました。
目の位置はとることはできますが、顔ランドマークのデータから眼球の動きを取得することは難しいようでした。
(図5:landmarkのプロット)
姿勢の検出の精度が高い
姿勢の検出では、かすかな動きでもその角度の違いを検出することができました。
下記ではサンプルとしてPitch(首を縦に振る動き) Roll(首をかしげる動き) Yow(首を左右に回す動き)のうち、Yowの角度をプロットしています。(図X)
検出された姿勢は、Pitch Roll Yowそれぞれの角度が出力されるため、データとしても非常に扱いやすいと感じました。
(図X)
(図6:検証結果)
まとめ
今回は、表情分析OSS Py-Featの機能の検証を行いました。
検証の結果、Py-Featについて機能には一部制約もありますが、開発に活用することができる性能をもつことがわかりました。もともと、感情分析のOSSとしてPy-Featに注目しましたが、顔の姿勢(視線)の推測にも強みがあるという点は意外でした。興味、関心の計測において視線の推定は重要な情報となるため、姿勢の検知は積極的に活用していきたいと考えています。
これらの結果をもとに、視線と表情を活用した興味・関心の可視化を実現するアプリケーションのプロトタイプを作成しお客様へのより関心の高い情報の提供に貢献してくことができるよう、取り組んでまいります。
最後までご覧いただきありがとうございました。
※本記事の内容は執筆者個人の見解であり、所属する組織の見解を代表するものではありません。