はじめに#
深層畳み込みニューラルネットワークに基づく顔検出アルゴリズムでは、顔枠に大きな揺れが一般的に存在し、一部のアプリケーションではこの揺れが大きな影響をもたらすことがあります。この記事では、顔枠の安定化についていくつかの処理方法を共有します。
本文#
現在、モバイルデバイスではほとんどの場合、mtcnn を使用して顔検出を行っています。私もこのネットワーク構造を基にしています。実際、SSD や yolo など他の方法を使用しても顔検出は可能であり、顔枠に mtcnn の Onet からの顔の 5 つの特徴点を追加するだけです。
具体的なアイデアは非常にシンプルです。Onet は顔の 5 つの特徴点を出力し、鼻の座標を取得し、N フレームの平均を取ります。次に、鼻の座標を基に固定の幅と高さの顔枠を取得し、現在のフレームと前のフレームの顔枠の IOU を計算し、結果が IOUrate よりも大きい場合、前のフレームの顔枠座標を現在のフレームの顔枠座標として使用します。そして、顔枠座標に対して N フレームの平均を取ります。これにより、最終的に得られる顔枠はほとんど揺れず、顔が移動しても枠は滑らかに移動します。
説明しますと、IOU は枠のわずかな揺れを効果的に抑制することができますが、顔が移動すると、IOU によって枠が大きく移動することがあります。そのため、後ろに N フレームの平均を追加し、枠を滑らかに移動させることができます。最初に鼻の座標に対して N フレームの平均を取る理由は、IOU による大きな移動を引き起こす可能性をできるだけ低くするためです。
caffe + gpu + python の組み合わせでは、このアルゴリズムの速度は普通です。私の 1080Ti でも 1 フレームあたり 100ms かかります。
C++、ncnn、cpu の組み合わせでは、速度がはるかに速くなります。1 フレームあたり約 10ms です。cpu は Intel® Xeon (R) CPU E5-2673 v3 です。
C++ + ncnn および python + caffe のコードの場所: GitHub - HansRen1024/Face-Tracking-Using-
CNN-and-Optical-Flow: C++ implementation for paper: A Real-Time and Long-Term
Face Tracking Method using Convolutional Neural Network and Optical Flow
Python + pytorch のコードの場所: https://github.com/HansRen1024/C-OF