はじめに
前回の記事PythonでMediaPipeを使って顔のランドマーク検出をやってみたでMediaPipeを使ってみたのですが、マスクをしている人がどのような判定をされるか気になったので調べてみました。
マスクをした画像で分析
マスクをした画像とマスクをしていない画像をAIで生成し、分析を行いました。
使用画像
AIで生成した以下の顔画像を使用しました。
実行環境および使用コード
前回の記事を参照してください。
分析結果
出力画像
ランドマークを描画した結果画像は以下の通りです。
マスク部分にもランドマークが描画されていることから、隠れている部分も推論されているのがわかります。
ブレンドシェイプの比較
マスクあり・なしで特にスコアが異なる箇所を確認するためにブレンドシェイプの比較をしました。
以下に、スコア上位10個を示します。
| 順位 | マスクあり | スコア | マスクなし | スコア |
|---|---|---|---|---|
| 1 | eyeSquintRight | 0.5485 | mouthSmileLeft | 0.8560 |
| 2 | eyeSquintLeft | 0.5127 | mouthSmileRight | 0.8516 |
| 3 | eyeLookUpRight | 0.3166 | eyeSquintRight | 0.6345 |
| 4 | eyeLookUpLeft | 0.3056 | eyeSquintLeft | 0.6338 |
| 5 | mouthShrugLower | 0.2115 | eyeBlinkLeft | 0.2865 |
| 6 | eyeBlinkLeft | 0.1868 | eyeLookUpRight | 0.2275 |
| 7 | eyeLookInRight | 0.1432 | eyeLookUpLeft | 0.2116 |
| 8 | eyeLookOutLeft | 0.1330 | eyeBlinkRight | 0.2049 |
| 9 | eyeBlinkRight | 0.1329 | eyeLookOutLeft | 0.1274 |
| 10 | mouthFrownRight | 0.0732 | eyeLookInRight | 0.1127 |
ブレンドシェイプの結果を見ると、マスクをしていない画像では高い値が出ているmouthSmileLeft/Rightが、マスクをしていると上位に来ておらず、値が低く推論されています。
mouthSmileLeft/Rightは口角が上がっていると高くなるため、マスクで隠れている部分は特徴が少ない状態として推論されているようです。
min_face_presence_confidenceについて
MediaPipeにはmin_face_presence_confidenceという顔が存在するかの信頼度スコアの閾値(最小値)を設定するパラメータが用意されています。マスクをした顔は信頼度が低くなるのではないかと考え、除外できるかを確かめるために、このパラメータを調整してみました。しかし、実際には信頼度が高いようで、数値を変更しても除外することはできませんでした。
まとめ
MediaPipeのランドマーク検出モデルでは、マスクをしているかどうかにかかわらず判定を行うことがわかりました。隠れている部分を勝手に推論することは使い方によって良し悪しが分かれると思います。もし、マスク顔を推論してほしくないのであれば、パラメータで設定することはできないため、MediaPipeを使用する前にマスク顔の判定処理を入れるのが良いと思いました。
番外編:どこまで隠したら顔と判定しなくなるのか
どこまで隠すと顔と判定されなくなるのかが気になったので、AIで生成した画像を加工して実験してみました。
画像の下半分を隠した場合
目が隠れるまで顔として判定されました。
画像の上半分を隠した場合
鼻が半分ほど隠れるまで顔として判定されました。
画像の左半分を隠した場合
鼻が隠れるまで顔として判定されました。








