MediaPipe、DeepFaceによる顔検出、感情分析 Colab プログラムによる実験・研究スキルの基礎
【概要】静止画像から人物の顔を検出し、感情を7分類(怒り、嫌悪、恐怖、喜び、悲しみ、驚き、無表情)で自動判定するプログラムの利用ガイドです。MediaPipeとDeepFaceを組み合わせた二段階処理により、顔の位置特定と感情推定を実現します。実験計画の立て方から結果の検証方法まで、研究スキルの基礎を学べます。
Colabのページ(ソースコードと説明): https://colab.research.google.com/drive/11JxfeS_V-xO6ihy38rwNpTWalhQxyysy?usp=sharing
【目次】
プログラム利用ガイド
1. このプログラムの利用シーン
静止画像に写る人物の顔を検出し、その感情状態を自動的に判定するプログラムです。写真に写る人物の表情を客観的に分析したい場合や、複数の人物が写る集合写真で各人の感情状態を比較したい場合に利用できます。
2. 主な機能
- 顔領域の自動検出:画像内の顔を矩形で囲み、位置を特定します。
- 感情の7分類:検出された顔に対して、怒り(angry)、嫌悪(disgust)、恐怖(fear)、喜び(happy)、悲しみ(sad)、驚き(surprise)、無表情(neutral)の7つから感情を判定します。
- 信頼度の表示:顔検出の信頼度スコア(0~1)と感情推定の確率(パーセント表示)を表示します。
- 複数顔の同時分析:1枚の画像に複数の顔が写っている場合、すべての顔を同時に分析します。
- 結果の視覚的比較:元画像と検出結果を並べて表示します。
3. 基本的な使い方
- プログラムの実行
コードセルを実行すると、必要なライブラリ(MediaPipe、DeepFace、OpenCV)が自動的に読み込まれます。
- 公式サンプル画像での動作確認
プログラムはOpenCVの公式サンプル画像をインターネットから取得し、処理結果を表示します。
- 画像のアップロード
「画像ファイルを1つアップロードしてください」というメッセージが表示されたら、表示されるファイル選択ダイアログから分析したい画像を選びます。
- 結果の確認
アップロードした画像の処理が完了すると、元画像(左)と検出結果(右)が並んで表示されます。
Colabのページ(ソースコードと説明): https://colab.research.google.com/drive/11JxfeS_V-xO6ihy38rwNpTWalhQxyysy?usp=sharing
4. 便利な機能
- 検出結果の読み方:各顔に表示される緑色の矩形が検出範囲を示します。「Score」は顔検出の信頼度、「Emotion」は推定された感情とその確率を示します。
- 特徴点の確認:青色の点は目、鼻、口、耳などの顔の特徴点を示し、顔の向きや傾きの判定に利用されます。
- 複数人の分析:集合写真などでは、画像内のすべての顔に対して個別に感情分析が行われます。
- 検出感度の調整:標準設定では信頼度0.7以上の顔を検出します。関数の引数(min_detection_confidence)を変更することで、より多くの顔を検出したり、確実な顔のみを検出したりできます。
プログラムコードの説明
1. 概要
このプログラムは、静止画像から顔領域を検出し、検出された顔の感情を7つのカテゴリ(怒り、嫌悪、恐怖、喜び、悲しみ、驚き、無表情)に分類します。MediaPipeによる顔検出とDeepFaceによる感情分析を組み合わせることで、顔の位置特定と感情推定を実現します。
2. 主要技術
BlazeFace
Google Researchが2019年に開発したモバイルGPU推論向けの顔検出アルゴリズムです[1]。MobileNetV1/V2から着想を得た特徴抽出ネットワークと、Single Shot MultiBox Detector(SSD)を改良したアンカー方式を採用します。MediaPipe Face Detectionの基盤技術として実装されています。
DeepFace
複数の学習済みモデルを統合した顔認識・属性分析フレームワークです[2]。感情認識では畳み込みニューラルネットワーク(CNN)を用いて、顔画像から感情を表す特徴ベクトルを抽出し、7つの感情カテゴリに分類します。
3. 技術的特徴
- 二段階処理による分業
MediaPipeで顔領域を検出後、その領域のみをDeepFaceに渡すことで、感情分析の計算コストを削減します。
- 正規化座標系の使用
MediaPipeは顔の境界ボックスと6つの特徴点(右目、左目、鼻先、口の中心、右耳珠、左耳珠)の座標を0.0~1.0の範囲で正規化し、画像サイズに依存しない処理を可能にします。
- 複数顔の同時処理
画像内の複数の顔を検出し、それぞれに対して独立した感情分析を実行します。
- 信頼度スコアの可視化
MediaPipeの顔検出信頼度とDeepFaceの感情推定確率を画像上に表示します。
4. 実装の特色
Google Colabでの実行を前提とし、以下の機能を備えます。
- 公式サンプル画像の自動ダウンロードと処理
- ユーザーがアップロードした画像の対話的処理
- 元画像と検出結果の並列表示
- 日本語フォントを用いたMatplotlibグラフの生成
5. 参考文献
[1] Bazarevsky, V., Kartynnik, Y., Vakunov, A., Raveendran, K., & Grundmann, M. (2019). BlazeFace: Sub-millisecond Neural Face Detection on Mobile GPUs. arXiv preprint arXiv:1907.05047. https://arxiv.org/abs/1907.05047
[2] Serengil, S. I., & Ozpinar, A. (2024). A Benchmark of Facial Recognition Pipelines and Co-Usability Performances of Modules. Journal of Information Technologies, 17(2), 95-107. https://doi.org/10.17671/gazibtd.1399077
実験・研究スキルの基礎:Google Colabで学ぶ顔検出と感情分析実験
1. 実験・研究のスキル構成要素
実験や研究を行うには、以下の5つの構成要素を理解する必要があります。
1.1 実験用データ
このプログラムでは人物が写っている画像ファイルが実験用データです。
1.2 実験計画
何を明らかにするために実験を行うのかを定めます。
計画例:
- 検出信頼度が顔検出の成功率に与える影響を確認する
- 顔の角度や大きさが検出精度に与える影響を調べる
- 複数人が写る画像での感情分析の精度を検証する
- 照明条件が顔検出と感情分析に与える影響を探る
- 表情の種類によって感情分析の信頼度がどう変化するかを確認する
1.3 プログラム
実験を実施するためのツールです。このプログラムはMediaPipeの顔検出モデルとDeepFaceの感情分析モデルを使用しています。
- プログラムの機能を理解して活用することが基本です
- 基本となるプログラムを出発点として、将来、様々な機能を自分で追加することができます
1.4 プログラムの機能
このプログラムは顔検出と感情分析を二段階で実行します。
入力パラメータ:
- 検出信頼度閾値(min_detection_confidence):顔として認識する最低信頼度(0.0~1.0、デフォルト0.7)
出力情報:
- 元画像(左側)と検出結果画像(右側)の並列表示
- 検出された各顔に対する緑色の矩形
- 顔検出の信頼度スコア(Score)
- 推定された感情とその確率(Emotion)
- 顔の特徴点(青色の点)
処理の流れ:
- MediaPipeが画像内の顔領域を検出する
- 検出された各顔領域に対してDeepFaceが感情を7分類(angry、disgust、fear、happy、sad、surprise、neutral)で推定する
- 結果が画像上に可視化される
1.5 検証(結果の確認と考察)
プログラムの実行結果を観察し、検出精度や感情分析の妥当性を考察します。
基本認識:
- 画像の条件を変えると結果が変わります。その変化を観察することが実験です
- 「正しい結果」は画像の内容や実験の目的によって異なります
観察のポイント:
- すべての顔が検出されているか
- 顔でないものが誤検出されていないか
- 検出された顔の信頼度スコアは妥当か
- 推定された感情は実際の表情と一致しているか
- 感情推定の確率値は高いか低いか
- 特徴点(目、鼻、口、耳)は正しい位置に配置されているか
2. 間違いの原因と対処方法
2.1 プログラムのミス(人為的エラー)
プログラムがエラーで停止する
- 原因:必要なライブラリ(MediaPipe、DeepFace)がインストールされていない、またはインターネット接続の問題
- 対処方法:エラーメッセージを確認し、ランタイムを再起動してから最初のセルから順に実行する
画像が表示されない
- 原因:画像ファイルのアップロードに失敗している、またはファイル形式が対応していない
- 対処方法:JPG、PNG形式の画像ファイルを使用する。ファイルサイズが大きすぎる場合は小さくする
モデルのダウンロードに時間がかかる
- 原因:初回実行時にDeepFaceの学習済みモデルをダウンロードしている
- 対処方法:これは正常な動作です。ダウンロードが完了するまで待つ(数分程度)
2.2 期待と異なる結果が出る場合
明らかに顔が写っているのに検出されない
- 原因:検出信頼度閾値が高すぎる、または顔が横向きや斜めで特徴が捉えにくい
- 対処方法:min_detection_confidenceの値を0.5や0.3に下げて再実行する。それでも検出されない場合は、顔の角度や照明を変えた画像で試す
顔でないものが誤検出される
- 原因:検出信頼度閾値が低すぎる、または背景に顔のような模様がある
- 対処方法:min_detection_confidenceの値を0.7以上に上げる。これは正常な動作であり、閾値の重要性を理解する機会です
感情が実際の表情と異なる
- 原因:微妙な表情や文化的な表現の違い、または顔の一部が隠れている
- 対処方法:これは機械学習モデルの限界です。複数の画像で試し、どのような条件で誤判定が起きやすいかを観察する
感情の確率値が低い
- 原因:表情が曖昧、または複数の感情が混在している
- 対処方法:これは正常な動作です。確率値が低い場合は、モデルが判断に迷っていることを示しています。明確な表情の画像と比較する
3. 実験レポートのサンプル
顔の角度が検出精度と感情分析に与える影響
実験目的:
顔の角度(正面、斜め、横向き)が顔検出の成功率と感情分析の精度に与える影響を調べます。
実験計画:
検出信頼度閾値をxxxxに固定し、同一人物の異なる角度の顔画像を用いて検出結果と感情分析結果を比較します。
実験方法:
プログラムを実行し、以下の基準で評価します。
- 顔検出の成否
- 検出された場合の信頼度スコア
- 感情分析の結果(推定された感情)
- 感情分析の確率値
実験結果:
| 顔の角度 | 検出成否 | 検出信頼度 | 推定感情 | 感情確率 | 備考 |
|---|---|---|---|---|---|
| xxxx | x | x | x | x | x |
| xxxx | x | x | x | x | x |
| xxxx | x | x | x | x | x |
| xxxx | x | x | x | x | x |
考察:
- (例文)正面顔では顔検出の信頼度が高く、感情分析も高い確率で判定され、妥当な結果が得られた
- (例文)斜めxxxx度の角度でも顔検出は成功したが、信頼度は低下し、感情分析の確率も下がった。これは特徴点の配置精度が低下したためと考えられる
- (例文)斜めxxxx度では検出信頼度が閾値に近い値まで低下し、感情推定の結果も変化した。確率値の低下は判断の不確実性を示している
- (例文)横向きxxxx度では顔として検出されなかった。MediaPipeのBlazeFaceモデルは正面向きの顔を対象としているため、この結果は技術的制約として理解できる
- (例文)顔の角度が大きくなるほど検出信頼度と感情分析の精度が低下するという明確な傾向が確認できた
結論:
(例文)本実験により、顔検出と感情分析の精度は顔の角度に強く依存することが確認できた。実用的な用途では正面から斜めxxxx度程度までの範囲で使用することが望ましい。斜めxxxx度を超える角度では感情分析の信頼性が著しく低下するため、結果の解釈には注意が必要である。また、完全な横向きの顔は検出対象外となることを理解した上でシステムを設計する必要がある。