CMTトラッキングアルゴリズム学習ノート(一)


最近,ターゲット追跡アルゴリズムを学習する過程で,CMTアルゴリズムのコード実測効果は非常に良好であることが分かった.以前に学習したSCMのような疎表現に基づく追跡アルゴリズムと比較すると,CMTのロバスト性は必ずしもそれ以上ではないが,疎表現の方法は一般的に時間がかかり,実際のエンジニアリングプロジェクトに応用できないため,CMTはリアルタイム性とロバスト性を両立させることができる.
資料を調べたところ、CMT対応の論文が2014年のwacv会議の最優秀論文賞を受賞したことが分かった.著者らはその後、このアルゴリズムをさらに改善し、CVPR 2015に関連論文を発表したことから、CMTアルゴリズムは確かに研究に値する.著者らは,論文のホームページに完全なアルゴリズムソースコードを公開したことは称賛に値する.http://www.gnebehay.com/cmt/C++とPythonのすべてのコードが含まれています.Pythonが分からないので、ここ数日C++ソースコードをよく読んでみると、作者のコードスタイルは非常に規範的で、注釈も非常に詳しく書かれていて、読み心地がいいと言わざるを得ません.また、このサイトのホームページには著者本人のプロフィールもありますが、openTLDコードの著者であることから、プログラミングの基礎が深いことがわかります.
ちなみに、以前サイトからダウンロードしたC++ソースコードは、コンパイルできないかもしれませんが、M_PI未宣言とint S[2*N-1]のNは定数などのエラーではありません.現在、著者はGitHub上のソースコードのこれらの小さなエラーを修正しました.皆さんは最新版のソースコードをダウンロードすればいいです.また,著者らはコードエンジニアリングに非常に友好的なコマンドラインパラメータ解析コードを加え,webcamやvideoやsequenceを用いてテストする方法については,ソースフォルダに詳細な説明があり,ここでは省略する.
論文を結びつけて、CMTのソースコードを理解するのはまだあまり難しくなくて、作者はコードの中でいくつかの工事の上の処理をして、主に肝心な点の2回の整合と融合に体現して、簡単に見えますがとても有効です.次に、CMTアルゴリズムの核心思想と具体的な実現方法をより明確に理解するために、Visioでアルゴリズム全体のフローチャートを描いた.
void CMT::processFrame(Mat im_gray)関数の処理フロー
ソースコードまとめ
CMTアルゴリズム全体のすべての関数は、4つのコンポーネントを含むCMTクラスで実現され、それぞれ4つのクラスにカプセル化されている:Tracker、Matcher、Consensus、Fusion.さらにCMTクラスにはFAST detectorとBRISK descriptorも含まれている
Tracker–ピラミッドLK光流法を使用
tracker.track(im_prev, im_gray, points_active, points_tracked, status);

t-1フレーム目の有効キーpoints_が既知Activeは、順方向光ストリーム(t−1フレーム目からtフレーム目)と後方向光ストリーム(t−1フレーム目からt−1フレーム目)を計算し、2回比較して得られた対応するキー間の距離を、しきい値より大きい距離のキーペアから除外し、残りのキーを追跡したキーとする.
Matcher–「BruteForce-Hamming」タイプのフィーチャー記述マッチングを採用
  • Matcher初期化
  • matcher.initialize(points_normalized, descs_fg, classes_fg, descs_bg, center);

    最初のフレームのすべての前景キーとバックグラウンドキーのフィーチャー記述をフィーチャー記述ライブラリdatabaseとして構築します.ここでは背景キーの特徴をdesc_に説明するbgは前に格納され、後にdatabaseを構築する.potentialの場合、前景キーインデックスindices_を格納potentialの場合はバックグラウンドキーの合計数num_を追加する必要がありますbg_points.
  • キーグローバルマッチング
  • matcher.matchGlobal(keypoints, descriptors, points_matched_global, classes_matched_global);

    現在のフレームの検出器で得られたすべてのキーの特徴記述をdatabaseとknnMatchマッチング(k=2)し、各特徴記述子はdatabaseで最適な2つのマッチング結果を探し、以下の条件の1つに合致するマッチングキーを除外する:1.バックグラウンドキーにマッチします.2.最適マッチングのマッチング距離が閾値0.25より大きい;3.最適マッチングと最適マッチングのマッチング距離の比が閾値0.8より大きい(比率が小さいほど、最適マッチングが最適マッチングより優れている)
  • キーローカルマッチング
  • matcher.matchLocal(keypoints, descriptors, center, scale, rotation,points_matched_local,
        classes_matched_local);

    1.現在のフレームで検出された各キーと第1のフレームで回転およびスケール変換されたすべての前景キーとの間のオーステナイト距離を比較し、しきい値20より小さい場合、前景キーが一致する可能性があり、これらの可能な前景キーを特徴記述ライブラリdatabase_potential; 2.現在のフレームで検出された各キーの特徴記述とdatabase_potentialはknnMatchマッチングを行い、各特徴記述子はdatabase_にある.potentialは,不安定なキーを排除する戦略がmatchGlobalと類似している最適な2つの整合結果を探した.
    Consensus–ターゲットキーのコンシステンシ制約
  • Consensus初期化
  • consensus.initialize(points_normalized);

    最初のフレームのすべての正規化された前景キーpoints_を計算して保存normalizedとx軸の挟み角(逆切断)angles_pairwiseとキーの2つの距離distances_pairwise.
  • 現在の回転角度およびスケール係数
  • を評価する.
    consensus.estimateScaleRotation(points_fused, classes_fused, scale, rotation);

    matchGlobalマッチング後に融合したキーの挟み角とキーの2つの距離を計算し、対応するpoints_normalizedキーの挟み角を求め,距離を求め,それぞれ平均値をとり,現在のフレームにおけるターゲットのスケール係数scaleと回転角度rotationを評価した.
  • ターゲット位置およびinliersキー
  • を取得
    consensus.findConsensus(points_fused, classes_fused, scale, rotation, center,
        points_inlier, classes_inlier);

    1.matchGlobalマッチング後に融合したキーの投票、すなわち各キーと対応するスケールおよび回転変換後のpoints_を計算するnormalizedキー間で構成されるベクトル;2.2つの投票(1のベクトル)間の距離を計算し、距離の大きさで昇順に並べ替える.3.クラスタリングし、結果の中で最大のクラスを得る.(2つのクラス間の距離がしきい値より小さい場合、この2つのクラスをマージする).このようなすべてのキーをpointsとして使用します.inlier; 5.すべてのpoints_をInlierキーの座標平均値をターゲット中心点centerとします.
    Fusion–2つのキーを重複せずに融合
  • キー初歩融合
  • fusion.preferFirst(points_tracked, classes_tracked, points_matched_global, classes_matched_global,
        points_fused, classes_fused);

    光ストリームが追跡したキーをmatchGlobalに一致したキーと融合させ,得られたキーをターゲットの回転角度とスケールを評価し,ターゲットの中心位置を探す投票に用いた.
  • キー二次融合
  • fusion.preferFirst(points_matched_local, classes_matched_local, points_inlier, classes_inlier,
        points_active, classes_active);

    matchLocalがマッチしたキーをinliersキーと融合させ、最終的に有効なターゲットキーpoints_を得るActive、これらのキーは次のフレームの追跡に使用されます.
    ———————————————————Main関数のコードはアルゴリズム自体とは関係なく、ここではまとめず、ソースコードには詳細な注釈があり、読者の理解を助ける.コードの詳細と論文の理解については、次回書きます.