2018.12.20 更新
-
追跡効果に影響を与えないすべてのコンテンツを削除しました。初期化操作など、時間のかかる操作も含まれます。
-
opencv3 をサポートしました。
-
現在、私の PC 上での追跡には約 3ms しかかかりません。
-
init 関数を削除したため、detNumToTack パラメータも使用されず、削除されました。
はじめに#
opencv に付属のトラッカーの効果は非常に悪いですが、github でオープンソースの光流法トラッキングを見つけました。これに基づいて不要なコンテンツを削除し、一部のパラメータを調整し、効果に影響を与えずにアルゴリズムの速度を向上させました。私の PC (Intel®
Xeon (R) CPU E5-2673 v3 @ 2.40GHz × 48) で、320*240 の画像を実行する時間は:16ms (MTCNN、ncnn)、30ms (初期化)、10ms (光流追跡) です。
このアルゴリズムの利点は次のとおりです:
-
顔の追跡が安定しており、枠が揺れることはほとんどありません。また、github の examples の中で枠が点滅する問題も最適化されており、もう発生しません。
-
顔の追跡時には深層学習を必要とせず、速度が速いです。
-
他の依存関係はなく、ncnn と opencv のみを使用します (
必要なバージョン:2.4.x)。
本文#
主に void Impl::Detect () 関数のいくつかの論理的な事項について説明します。
1.
detNumToTack パラメータの意味について、顔の前に何かが交互に隠れたり、ある状況で顔があったりなかったりする場合。detNumToTack パラメータを追加しない場合、アルゴリズムは一度の検出の後にすぐに初期化を実行します。私はこれが少し時間の浪費だと考えているため、detNumToTack パラメータを追加し、detNumToTack 回後に初期化し、その後追跡します。
-
RNet の役割は、各追跡結果に対して判断を行い、結果が閾値未満の場合に再度検出を行うことです。これは、他のものを追跡することを防ぐためです。最初は RNet を追加しなかったため、手がゆっくりと前を通り過ぎると、枠が手に従って移動しました。
-
追跡する枠の幅と高さを固定しました。processFrame 関数を実行した後、枠は初期化時の幅と高さにリセットされます。
-
顔検出部分は自由に置き換えることができ、RNet 部分も PCN-2 ネットワークに置き換えることができます。
GitHub のリンク: https://github.com/HansRen1024/Face-Tracking-Using-Optical-Flow-and-CNN