OpenCV Tracking API について

この記事はOpenCV Advent Calendar 2015の21日目の記事です。

fps計測の環境が異なったため、再実験して修正しました。(2015.12.22)

再実験してKCFのオリジナルコードを追加しました。(2015.12.26)

概要

  • OpenCV Tracking APIの導入方法、使い方、パフォーマンス評価のまとめ
  • OpenCV Tracking APIに入っている追跡アルゴリズムのうち、KCF*1はstate-of-the-artと言えるアルゴリズムで、速度・精度共に高パフォーマンスなので有用そう

はじめに

OpenCV 3.0 になって、opencv_contribというリポジトリが追加された。 Tracking APIはその中に入っているモジュールの1つ。物体追跡を行うモジュールで、Trackerという共通インタフェースを経由して様々な物体追跡アルゴリズムを使うことができる。OpenCVのTracking APIの存在は知っていても使ったことがなかったので簡単に調査してみた。

OpenCV Tracking APIで出来ること

OpenCV Tracking APIでは、物体追跡の中でもOnline Single Object Tracking (SOT, 一つの物体のみを対象に追跡) という問題設定に対応するアルゴリズムが実装されている。初期値として矩形領域(bounding box)を指定すると、その矩形領域の物体を逐次的に追跡してくれる。OpenCV Tracking APIでは複数物体を追跡するAPIも用意されているが、SOTの組み合わせで、対象となるそれぞれの物体へ個別にSOTが適用される。

下記はOpenCV Tracking API で用意されている5つのアルゴリズムを適用した追跡結果である。

導入方法

opencv_contribに書いてあるとおりである。<opencv_contrib>opencv_contribのルートディレクトリだとすると、OpenCVをcmakeを使って通常通りビルドする際に、OPENCV_EXTRA_MODULES_PATH<opencv_contrib>/modulesを設定してビルドするだけでよい。opencv_contribの他のモジュールの中には依存ライブラリが面倒なものもあるので、不要なモジュールはビルドから除外したほうがいいかも。

OpenCV Tracking API の使い方

先ほど説明したとおり、物体追跡を行うインタフェースには、一つの物体を追跡するTrackerと複数物体を追跡するMultiTrackerがある。

[Trackerを使う場合]

次のようなステップで物体追跡を行う。

  1. Trackerインスタンスを生成(入力:アルゴリズム名)
    Tracker::create(const cv::String& trackerType)
  2. Trackerインスタンスの初期化(入力:追跡を開始するフレームと物体領域)
    Tracker::init(const cv::Mat& image, const cv::Rect2d& boundingBox)
  3. 更新(入力:次時刻のフレーム、出力:推定された物体領域)
    Tracker::update(const cv::Mat& image, cv::Rect2d& boundingBox)
  4. 3を繰り返す

...たったこれだけ。

サンプルはこちら

[複数物体追跡用のMultiTrackerを使う場合]

  1. MultiTrackerインスタンスを生成
    cv::MultiTracker(const cv::String& trackerType)
  2. 追跡対象物体を登録
    cv::MultiTracker::add(const cv::Mat& image, std::vector<cv::Rect2d> boundingBox)
  3. 更新
    cv::MultiTracker::update(const cv::Mat& image, std::vector<cv::Rect2d> & boundingBox)
  4. 3を繰り返す

サンプルはこちら

現在使える追跡アルゴリズム

なお、KCF はコードは入っているものの、まだ公式Referenceに記載がない。

→OpenCV3.1リリースで、KCFとTLDopencv_contribが入ったという情報が出ましたね (公式Rreferenceには相変わらず記載がないですが)。 OpenCV - ChangeLog - OpenCV DevZone

パフォーマンス評価

評価方法

Visual Tracker Benchmark*6の51個のシーケンスを用いて評価を行った。追跡結果は初期の矩形領域に依存するため、 Visual Tracker Benchmarkの評価方法に従い、51個のシーケンスに対してそれぞれ追跡開始時刻を変えた20個のサブシーケンスを生成し、51×20=1020個のシーケンスを用いて300,000フレーム以上の追跡を行った。

評価指標

  1. Success plot(領域オーバーラップ)
    追跡結果のbounding box を{r_t}、正解のbounding box を{r_a}として、オーバーラップスコア{S}{S = \frac{|r_t \cap r_a |}{|r_t \cup r_a|} }と定義する。ただし、|・|は領域のピクセル数。Success plotは、テストを行った全シーケンスの全フレーム数のうち、オーバーラップスコアがある閾値{\theta} よりも高かった追跡結果の割合({S > \theta})をプロットしたもの。

  2. Precision plot(中心位置誤差)
    領域の中心位置誤差を用いた評価。Precision plotは、追跡bounding boxと正解bounding boxの中心位置誤差が閾値より小さかった割合をプロットしたもの。

  3. 処理速度 (fps)
    Intel Core i7-5820K CPU (3.30 GHz), RAM 32GB のPCで追跡した際の平均fps

OpenCV Tracking APIアルゴリズムのパフォーマンス

追跡精度・処理速度共にKCFが高パフォーマンス。

  • Success plot(領域オーバーラップ)

20151220204437

  • Precision plot(中心位置誤差)

  • 処理速度(fps)

Boosting MIL TLD MedianFlow KCF
27.6763 16.8790 9.7450 134.3183 80.5531

他の実装及び最新アルゴリズムとの比較

OpenCV Tracking APIアルゴリズムと、Boosting, MIL, TLDのオリジナル実装およびStruck, ASLA, CXT, CSKというstate-of-the-artなアルゴリズムとを比較してみた。結果は次の通りである。

  • Success plot(領域オーバーラップ) f:id:Ytra:20151226190453p:plain
  • Precision plot(中心位置誤差) f:id:Ytra:20151226190429p:plain

  • 処理速度 (fps)

Boosting MIL TLD MedianFlow KCF
OpenCV 27.6763 16.8790 9.7450 134.3183 80.5531
Original 3.8218 28.6296 20.9542 42.9633
Struck ASLA CXT CSK
34.0012 1.9253 7.9878 106.8774

※KCFのオリジナルコード(matlab)は今回のテストには入れてないが、少し動かしたところ40fps程度だった。さすがにC++で実装されているOpenCV版の方が速そう。

→KCFのオリジナルコードの結果を追加して再実験しました。(2015.12.26)

OpenCV版とオリジナルを比べると、TLDOpenCV版になって精度がかなり落ちているのがわかる。デフォルトパラメータが異なるのか?

TLDはオリジナル版では矩形領域の大きさを固定しているのに対して、OpenCV版では矩形領域の大きさの変更に対応している。これが仇となって(?)追跡精度が下がってしまったように思う。これは個人的な経験にも合致する結果である。(2015.12.26)

また、OpenCV実装のKCFと他のstate-of-the-artなアルゴリズムとを比べても、KCFは精度・速度共に引けを取らない高パフォーマンスであることがわかる。 なお、KCFは矩形領域の大きさを固定しているため、対象物体のスケールが大きく変わるとオーバーラップスコアが下がる。

映像の属性(スケール変化、低解像度、ブラー、オクルージョンなど)ごとの評価結果は下記を参考にしてください。 https://github.com/yuukicammy/opencv_tracker_performance_test/tree/master/tracker_benchmark_v1.0/figs/overall/ALL

おわりに

(単一の)物体を追跡したくなったら、OpenCVのKCFを使うのが良さそう。さすがCVPR2014にオーラルで採録されているだけある!

本当はTrackerを経由しない個々のアルゴリズムクラスの使い方とか、Tracking APIの内部構造とか、Tracking APIで用意されている探索・推定モジュールを用いて自分で追跡アルゴリズムを実装する方法などのもう少しアドバンスドな内容も書きたかったのですが、今後の課題とさせていただきます。

*1:Martin Danelljan, Fahad Shahbaz Khan, Michael Felsberg, and Joost van de Weijer. Adaptive Color Attributes for Real-Time Visual Tracking. In CVPR, 2014 (Oral).

*2:H Grabner, M Grabner, and H Bischof. Real-time tracking via on-line boosting. In BMVC, 2006.

*3:B Babenko, M-H Yang, and S Belongie. Visual Tracking with Online Multiple Instance Learning. In CVPR, 2009.

*4:Z Kalal, K Mikolajczyk, and J. Matas. Tracking-Learning-Detection. PAMI, 2011.

*5:Z Kalal, K. Mikolajczyk, and J. Matas. Forward-Backward Error: Automatic Detection of Tracking Failures. In ICPR, 2010.

*6:Yi Wu, Jongwoo Lim, and Ming-Hsuan Yang. Online Object Tracking: A Benchmark. In CVPR, 2013.