HUOXIU

DBFace: モデルサイズわずか7Mの軽量・高精度顔認識手法

2020-04-10 12:47:10

マシンハートレポート

参加者: ラクーンX

この 7 メガバイトの顔認識モデルは、世界最大の自撮り写真に写っているほぼすべての人物を識別しました。

プロジェクト概要

以前、SyncedはCPU上で1000FPSを容易に達成したクロスプラットフォームの顔認識プロジェクトについて報告しました。このプロジェクトも軽量な顔認識プロジェクトです。違いは、少ないパラメータ数を維持しながら、はるかに高い認識精度を実現し、実行に必要なのはOpenCVとPyTorchのみである点です。

DBFaceは、高速な認識速度と高い精度を誇る軽量なリアルタイム顔認識手法です。下の図は、WiderFaceデータセットにおける様々な顔検出手法のテスト結果を示しています。DBFaceモデルは、サイズが最も小さいだけでなく、Easy、Medium、Hardのテストタスク全体で最高の認識精度を達成していることがわかります。

プロジェクトアドレス: https://github.com/dlunion/DBFace

WiderFaceは顔検出のベンチマークデータセットで、32,203枚の画像と393,703人の顔が含まれており、難易度は様々です。データセットには、簡単なものから難しいものまで、様々なタスクが含まれています。下の画像は、このデータセットのサンプルの一部です。ご覧の通り、画像内の顔をすべて正確に識別するのは非常に困難です。DBFaceは、このデータセットの様々なタスクで0.925、0.920、0.847という精度を達成しており、これは非常に印象的です。

WiderFace の詳細については、公式 Web サイトをご覧ください。

http://shuoyang1213.me/WIDERFACE/

効果のデモンストレーション

下の図は、WiderFaceデータセットにおける様々な顔認識手法のPR曲線を示しています。PR曲線は、バイナリ分類器の適合率と再現率を直感的に示します。異なるアルゴリズムを比較する際に、あるバイナリ分類器のPR曲線が別のバイナリ分類器のPR曲線に完全に囲まれている場合、後者の方が前者よりも優れたパフォーマンスを発揮していることを示します。図からわかるように、3つのタスクすべてにおいて、DBFaceに囲まれた領域は比較的広いです。

しきい値を 0.2 に設定すると、この世界最大の自撮り写真に対する DBFace の認識パフォーマンスは次の画像に示されます。

ご覧の通り、DBFaceの認識精度は非常に高いです。画像に写っている顔の多くは、肉眼で拡大しても判別が難しいものですが、DBFaceはそれらを認識できます。さらに、モデルサイズはわずか7MBなので、エッジデバイス上でリアルタイムに動作させるのに十分です。そのため、Syncedは独自のテストも実施しました。

プロジェクト測定

プロジェクトの作者が提供しているコード例には、静的画像認識と、コンピュータのウェブカメラにアクセスするGUIが含まれています。このプロジェクトは依存関係が非常に少なく、PyTorch、NumPy、OpenCVだけで実行できる点も注目に値します。これらはいずれもよく使われるライブラリであるため、オンラインで多数のインストールチュートリアルが公開されています。そのため、ここではインストール手順は省略します。

main.py では、image_demo() と camera_demo() がそれぞれ静的画像認識とカメラ認識に対応しています。静的画像認識のコードは以下のとおりです。

image_demo() を定義します:

dbface = DBFace()

dbface.eval()

HAS_CUDAの場合:

dbface.cuda()

dbface.load("model/dbface.pth")

detect_image(dbface, "datas/selfie.jpg")

上記のコードは、トレーニング済みのモデルを読み取り、画像 datas/selfie.jpg を認識し、結果を detect_result/selfie.draw.jpg に保存します。

認識結果を見てみましょう。

上の画像のように、照明の色や明るさが大きく異なる屋内環境でも、DBFaceは写真に写っているほぼすべての人物を識別できました。点滅する電球を指差しながら虹を描いているヘルメットをかぶった中央の人物もその一人です。しかし、検出閾値が比較的低いため、一部に誤分類が発生しました。人物の手や右上の電球が顔と誤認識されていました。閾値を適切に上げることで、この問題は解消されるでしょう。

コンピューターのウェブカメラ検出を呼び出すコードは次のとおりです。

カメラデモ()を定義します:

dbface = DBFace()

dbface.eval()

HAS_CUDAの場合:

dbface.cuda()

dbface.load("model/dbface.pth")

キャップ = cv2.VideoCapture(0)

cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640)

cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)

OK、frame = cap.read()

大丈夫です:

objs = detect(dbface, フレーム)

obj 内の obj の場合:

common.drawbbox(フレーム, obj)

cv2.imshow("デモDBFace", フレーム)

キー = cv2.waitKey(1) & 0xFF

キー == ord('q') の場合:

壊す

OK、frame = cap.read()

上記のコードを実行すると、カメラを使用してリアルタイムの顔検出を実行する 640x480 GUI インターフェイスが生成されます。

興味があれば、このプロジェクトをローカルマシンにすぐにクローンしてテストしてみてください。



https://www.toutiao.com/i6813939976317698567/