【概要】Google Colabで動作するInsightFaceのSCRFD 500Mモデルを使用した顔検出プログラムである。スライダーで信頼度閾値とNMS閾値を調整し、パラメータが検出結果に与える影響を確認できる。顔検出技術の実験や検証、パラメータチューニングの学習に活用できる。
Colab のページ(ソースコードと説明): https://colab.research.google.com/drive/1ZGgXf2wHmXmOiO1oIrQqhwJGH0Fqe08r?usp=sharing
【目次】
画像内の顔を自動的に検出し、その位置を特定する用途に使用される。顔検出の閾値パラメータを調整しながら、その効果を確認できるため、セキュリティシステムの開発、顔認証アプリケーションのプロトタイピング、写真管理ソフトウェアの開発、研究・教育など、顔検出技術の実験や検証、パラメータチューニングの学習を必要とする場面で活用される。
画像ファイルのアップロードによる顔検出
パソコンやスマートフォンに保存されている写真を、Google Colabにアップロード(転送)する。プログラムはアップロードされた画像を読み込み、その中に写っている顔を検出する。
顔検出
このプログラムはInsightFaceのSCRFD 500Mモデルを使用し、角度、照明条件、表情が異なる顔を検出する。複数のサイズの顔に対応している。
パラメータ調整機能
スライダーを使って、信頼度閾値とNMS閾値を動的に調整できる。スライダーを動かすと、検出が再実行され、結果が更新される。これにより、パラメータが検出結果に与える影響を確認できる。
検出結果の視覚化(バウンディングボックスとラベル)
プログラムは検出した顔を画像上に表示する。顔の周りに緑色の矩形の枠(バウンディングボックス)を描き、その上に「Face」というラベルと信頼度を表示する。元画像と検出結果を並べて表示するため、どこに顔が検出されたかを比較できる。
検出結果の詳細情報表示(信頼度、検出数)
プログラムは検出した顔について、以下の情報を表示する。
Colab のページ(ソースコードと説明): https://colab.research.google.com/drive/1ZGgXf2wHmXmOiO1oIrQqhwJGH0Fqe08r?usp=sharing
信頼度(Confidence)とは
顔検出の信頼度とは、AIモデルがその領域に顔が存在すると確信している度合いを0~1の数値で表したもの。1に近いほど確信度が高い。
NMS(Non-Maximum Suppression)とは
NMSは、同じ顔に対する重複した検出結果を除去するための手法である。顔検出では、同じ顔に対して複数のバウンディングボックスが生成されることがある。NMSは、これらの重複したボックスから適切なものを選択する。
NMSの動作は以下の手順で行われる:
IoU(Intersection over Union)は、2つのバウンディングボックスの重なり具合を表す指標である:
$$\text{IoU} = \frac{\text{重なり領域の面積}}{\text{結合領域の面積}}$$
IoUの値は0から1の範囲を取る。0は全く重ならない状態、1は完全に一致する状態を表す。例えば、IoUが0.7であれば、2つのボックスの重なりが結合領域の70%を占めることを意味する。
信頼度閾値(Confidence Threshold)
検出結果をフィルタリングする基準となる値。この値より高い信頼度を持つ検出のみが表示される。
NMS閾値(Non-Maximum Suppression Threshold)
重複する検出結果を除去する基準となる値。同じ顔に対して複数の検出があった場合、重なりがこの閾値を超える重複を除去する。
このプログラムは、Google Colab環境でInsightFaceのSCRFD 500Mモデルを使用した顔検出を実行する。ユーザーがアップロードした画像に対して、スライダーで調整可能な閾値パラメータを用いて顔検出を行い、検出結果を視覚化して表示する機能を提供する。教育・研究用途やプロトタイピングに使用され、パラメータの影響を学習できる設計となっている。
InsightFace
顔認識と顔分析のための統合的なPythonライブラリである[1]。顔検出、顔認識、顔属性分析など、様々な顔関連タスクに対応している。このプログラムでは、顔検出機能を使用している。
SCRFD (Sample and Computation Redistribution for Efficient Face Detection)
顔検出アルゴリズムである[2]。このプログラムでは、buffalo_scパッケージに含まれるSCRFD 500Mモデルを使用している。SCRFD 500Mは、500万パラメータを持つモデルである。
ipywidgets
Jupyter NotebookやGoogle Colabでインタラクティブなウィジェット(スライダー、ボタンなど)を提供するライブラリ。このプログラムでは、信頼度閾値とNMS閾値を動的に調整するためのスライダーUIを実装している。
パラメータ調整
ipywidgetsの@interact デコレータを使用し、スライダーによるパラメータ調整機能を実装。スライダーを動かすと検出が再実行され、結果が更新される。
閾値設定
信頼度閾値(det_thresh)とNMS閾値(nms_thresh)の両方を指定可能。ユーザーは0.0から1.0の範囲で調整でき、極端な値での動作も確認できる。
描画設定
画像サイズに基づいて線の太さとフォントサイズを調整。小さな画像でも大きな画像でも、視覚化が可能となる。
比較表示
matplotlibを使用し、元画像と検出結果を並べて表示。検出された顔にはバウンディングボックスとラベル(信頼度)を描画する。
Google Colab環境に特化した実装として、以下の機能を備える:
[1] Deng, J., Guo, J., Ververas, E., Kotsia, I., & Zafeiriou, S. (2020). RetinaFace: Single-shot Multi-level Face Localisation in the Wild. In Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition (pp. 5203-5212).
[2] Guo, J., Deng, J., Lattas, A., & Zafeiriou, S. (2021). Sample and Computation Redistribution for Efficient Face Detection. arXiv preprint arXiv:2105.04714. https://arxiv.org/abs/2105.04714
[3] InsightFace GitHub Repository: https://github.com/deepinsight/insightface
実験や研究を行うには、以下の5つの構成要素を理解する必要がある。
このプログラムでは画像ファイルが実験用データである。顔が写っている画像(集合写真、ポートレート、遠景など)を使用することで、モデルの性能を評価できる。
何を明らかにするために実験を行うのかを定める。
計画例:
実験を実施するためのツールである。このプログラムはInsightFaceのSCRFD 500Mモデルとipywidgetsのinteract関数を使用している。
このプログラムは2つのパラメータで顔検出を制御する。
入力パラメータ:
出力情報:
スライダーの動作:
プログラムの実行結果を観察し、パラメータの影響を考察する。
基本認識:
観察のポイント:
プログラムがエラーで停止する
スライダーが表示されない
モデルのダウンロードに時間がかかる
パラメータを変えても検出数が変化しない
明らかに存在する顔が検出されない
同じ顔に複数の矩形が表示される
誤検出が多すぎる
実験目的:
集合写真内の顔を確実に検出しながら、誤検出を最小化するための最適な信頼度閾値を見つける。
実験計画:
NMS閾値を0.4に固定し、信頼度閾値を変化させて最適値を探す。
実験方法:
プログラムを実行し、スライダーを操作しながら以下の基準で評価する:
実験結果:
| 信頼度閾値 | 検出総数 | 正検出数 | 誤検出数 | 見逃し数 | 総合評価 |
|---|---|---|---|---|---|
| 0.20 | x | x | x | x | x |
| 0.40 | x | x | x | x | x |
| 0.50 | x | x | x | x | x |
| 0.70 | x | x | x | x | x |
考察:
結論:
(例文)本実験の集合写真においては、信頼度閾値0.40~0.50が検出数と誤検出のバランスが取れた設定であった。誤検出を防ぐことよりも顔を見逃さないことを優先する場合は0.40、誤検出を避けたい場合は0.60が適切である。用途(セキュリティカメラでの人数カウント、写真管理アプリでの顔認識など)に応じて閾値を調整する必要性が確認できた。