hans

hans

【顔検出】光流法とCNNを基にした超リアルタイム顔追跡アルゴリズム


2018.12.20 更新

  1. 追跡効果に影響を与えないすべてのコンテンツを削除しました。初期化操作など、時間のかかる操作も含まれます。

  2. opencv3 をサポートしました。

  3. 現在、私の PC 上での追跡には約 3ms しかかかりません。

  4. init 関数を削除したため、detNumToTack パラメータも使用されず、削除されました。

はじめに#

opencv に付属のトラッカーの効果は非常に悪いですが、github でオープンソースの光流法トラッキングを見つけました。これに基づいて不要なコンテンツを削除し、一部のパラメータを調整し、効果に影響を与えずにアルゴリズムの速度を向上させました。私の PC (Intel®
Xeon (R) CPU E5-2673 v3 @ 2.40GHz × 48) で、320*240 の画像を実行する時間は:16ms (MTCNN、ncnn)、30ms (初期化)、10ms (光流追跡) です。

このアルゴリズムの利点は次のとおりです:

  1. 顔の追跡が安定しており、枠が揺れることはほとんどありません。また、github の examples の中で枠が点滅する問題も最適化されており、もう発生しません。

  2. 顔の追跡時には深層学習を必要とせず、速度が速いです。

  3. 他の依存関係はなく、ncnn と opencv のみを使用します (必要なバージョン:2.4.x)。

本文#

主に void Impl::Detect () 関数のいくつかの論理的な事項について説明します。

1.
detNumToTack パラメータの意味について、顔の前に何かが交互に隠れたり、ある状況で顔があったりなかったりする場合。detNumToTack パラメータを追加しない場合、アルゴリズムは一度の検出の後にすぐに初期化を実行します。私はこれが少し時間の浪費だと考えているため、detNumToTack パラメータを追加し、detNumToTack 回後に初期化し、その後追跡します。

  1. RNet の役割は、各追跡結果に対して判断を行い、結果が閾値未満の場合に再度検出を行うことです。これは、他のものを追跡することを防ぐためです。最初は RNet を追加しなかったため、手がゆっくりと前を通り過ぎると、枠が手に従って移動しました。

  2. 追跡する枠の幅と高さを固定しました。processFrame 関数を実行した後、枠は初期化時の幅と高さにリセットされます。

  3. 顔検出部分は自由に置き換えることができ、RNet 部分も PCN-2 ネットワークに置き換えることができます。

GitHub のリンク: https://github.com/HansRen1024/Face-Tracking-Using-Optical-Flow-and-CNN

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。