はじめに
2019年に発表された顔認識モデル「CenterFace」を使うと、Python初心者でも簡単に高性能な顔認識のプログラムを書くことが出来るのでおすすめです。
OpenCVの検出器(よく使われているのは「haarcascade_frontalface_default.xml」など)を用いた顔認識はお手軽ですが、なかなか思うような精度が出ません。SOTAモデルに匹敵するような機械学習のモデルで初心者でも簡単に扱えるものはないかと探したところ、こちらを見つけました。
精度が高く、ソースコードが公開されているものを一通りチェックしましたが、「CenterFace」が圧倒的にシンプルで使いやすかったので、今回はこちらについて解説していきたいと思います。
認識精度は?
「Papers With Code」によると、「WIDER Face (Hard)」のデータセットを用いたベンチマークは下記の結果になっています。
ランク | モデル | AP(精度) |
---|---|---|
1 | TinaFace | 0.924 |
2 | RetinaFace | 0.914 |
3 | AInnoFace | 0.912 |
… | … | … |
10 | CenterFace | 0.873 |
WIDER Face (Hard) Benchmark (Face Detection) | Papers With Code.
https://paperswithcode.com/sota/face-detection-on-wider-face-hard
(参照:2021/05/01)
上記の結果を見ると、トップと比べてあまりいい精度には見えませんが、「WIDER Face」のデータセットには認識が難しそうなデータもかなり含まれているので、十分実用的だと思います。(記事上部の画像もWIDER Faceのデータセットに含まれていた画像を顔認識させた結果です。)CenterFaceのgithub上にも認識した結果が記載されていますが、驚異的な認識率です。
より精度を追求するなら「RetinaFace」をおすすめしますが、トレーニング済のモデルが配布されているところが見つからなかったので、おそらく自力でトレーニングする必要があります。
実行方法は?
実行方法ですが、CenterFaceのgithub上からソースコード等をダウンロードする必要があります。今回はPythonで実行するので、必要なのは「prj-python」フォルダと「models/onnx」フォルダ配下です(めんどくさかったら全部ダウンロードしちゃってください)。下記のようなフォルダ構成になっていたらOKです。
├─models
│ └─onnx
│ centerface.onnx
│
└─prj-python
000388.jpg
centerface.py
demo.py
あとは、「prj-python」のパスから「demo.py」を実行するとテスト用画像の画像認識結果が表示されます。他の画像で試したい場合は「demo.py」の29行目で任意の画像ファイル名を指定するだけです。とてもお手軽です。使われているライブラリもOpenCVとnumpy、scipyぐらいでとってもシンプル…!
注意点ですが、landmark(顔の部位とか)の認識をしたくない場合、素直に「demo.py」31行目のパラメータをFalseにするとエラーになります。「centerface.py」12行目の「../models/onnx/cface.1k.onnx」は非公開となっているモデルのため入手できません。「demo.py」の41行目~のif分岐をコメントアウトして対応するしかなさそうです。
使ってみた感想は?
推論のスピードは結構速いと思います。8年使ってる古いノートPC(Core i5-3230M(第3世代)、GPU無し)で平均0.6秒くらい。なにより、コードがとてもシンプルで扱いやすいのがグッドです。Webアプリに組み込んで遊んでみましたが、レスポンスはストレスにならないレベルです。
高速化して推論スピードがFPS90越えちゃっている例もあります。下記参考です。
最後に
「ATフィールド自動展開アプリ」の認識精度を上げるために使えそうなものを探してましたが、いいものが見つかってよかったです。手元のPCは貧弱ですし、Google Colaboratoryでモデルのトレーニングをするのも大変なので、すごくありがたかったです。