-->

2020年12月17日木曜日

マスクをした顔を認識する(OpenCV)

 Ogaki Mini Maker Faire 2020で顔認識を使用した作品を展示しました。昨今のコロナ状況下で顔認識するためには、マスクをした人の顔を認識する必要があるのですが、ここではどのようにそれを実現したのかを記載しておきます。

使用するシステムはRaspberryPi3B+で、ネットワークなしのローカルで完結する構成にしました。持ち運びや設置などの取り回しが容易になるからです。その代わりRaspberryPiではPCなどに比べ処理性能が制限されます。また、フリーで使用できるライブラリということで顔認識にはOpenCVを使用することにしました。

同様にフリーで使用できる顔認識がdlibというものに含まれており、こちらは68点のランドマークを使用した高性能な顔認識が使用できます。しかし、残念ながらマスクなしが前提となっており、今回は候補から外れます。

OpenCVには"haarcascade"というかの有名なHaar-like特徴量を使用した認識モデルが実装されています。同時に学習済みのデータも含まれているのですぐに認識機能を使用することができます。これら学習済みのデータの種類についてはこちらが参考になります。

この学習済みデータには正面の顔を認識するものがあるのですが、これはマスクをしていない顔を学習したデータなので、マスクをした顔を認識しようとすると性能が低下します。ということで今回は両目の認識をすることで顔認識の代替とすることにしました(マスクをしていても両目は見えるので)。目を認識する際に使用できる学習データは「右目」と「左目」があるのですが、正直目を個別に認識をすると統合処理が面倒なのでどうしたものかと思っていましたが、こちらに"haarcascade"に対応した「両目」の学習済みデータがありました。どうやらこれらの学習済みデータはもうすでに不要と判断されOpenCV本体からは削除されているようです(他にも口や鼻がパーツとして認識できるものもあります)。

OMMF2020(屋内)で両目の認識("haarcascade_mcs_eyepair_big.xml"を使用)を動作させてみた雑感を以下に記載しておきます。

  • 認識しやすい人と認識しにくい人に分かれる
    認識しやすい人は顔の向きに関係なく安定して認識するが、認識しにくい人ははっきり正面を向いた顔を映さないと認識できない傾向がある
  • メガネをしている人が認識しにくい
    おそらく目の部分が隠れるからだと思われる
  • 誤認識が発生する
    遠方に全身が映っている複数の人の足元に誤認識が発生した

"haarcascade"で学習済みデータを使用する場合、手軽に認識機能を実現できるのは良いのですが、精度や誤認識が問題となったときに柔軟な対応ができないということがあります。認識の尤度の閾値設定ができず、設定ができるのは結果の重複数閾値と最小サイズぐらいです。あとは認識結果サイズによる誤認識の切り捨てぐらいしかできません。今回の展示は認識できれば良い程度のものであったため、認識しにくいことや誤認識に関しては特に問題とはなりませんでしたが。