この記事はOpenCV Advent Calendar 2015の21日目の記事です。
概要
- 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を使う場合]
次のようなステップで物体追跡を行う。
- Trackerインスタンスを生成(入力:アルゴリズム名)
Tracker::create(const cv::String& trackerType)
- Trackerインスタンスの初期化(入力:追跡を開始するフレームと物体領域)
Tracker::init(const cv::Mat& image, const cv::Rect2d& boundingBox)
- 更新(入力:次時刻のフレーム、出力:推定された物体領域)
Tracker::update(const cv::Mat& image, cv::Rect2d& boundingBox)
- 3を繰り返す
...たったこれだけ。
[複数物体追跡用のMultiTrackerを使う場合]
- MultiTrackerインスタンスを生成
cv::MultiTracker(const cv::String& trackerType)
- 追跡対象物体を登録
cv::MultiTracker::add(const cv::Mat& image, std::vector<cv::Rect2d> boundingBox)
- 更新
cv::MultiTracker::aupdate(const cv::Mat& image, std::vector<cv::Rect2d> & boundingBox)
- 3を繰り返す
現在使える追跡アルゴリズム
なお、KCF はコードは入っているものの、まだ公式Referenceに記載がない。
パフォーマンス評価
評価方法
Visual Tracker Benchmark*6の51個のシーケンスを用いて評価を行った。追跡結果は初期の矩形領域に依存するため、 Visual Tracker Benchmarkの評価方法に従い、51個のシーケンスに対してそれぞれ追跡開始時刻を変えた20個のサブシーケンスを生成し、51×20=1020個のシーケンスを用いて310,000フレーム以上の追跡を行った。
評価指標
Success plot(領域オーバーラップ) 追跡結果のbounding box を、正解のbounding box をとして、オーバーラップスコアをと定義する。ただし、|・|は領域のピクセル数。Success plotは、テストを行った全シーケンスの全フレーム数のうち、オーバーラップスコアがある閾値 よりも高かった追跡結果の割合()をプロットしたもの。
Precision plot(中心位置誤差) 領域の中心位置誤差を用いた評価。Precision plotは、追跡bounding boxと正解bounding boxの中心位置誤差が閾値より小さかった割合をプロットしたもの。
処理速度 (fps) Intel i7-5820K CPU (3.30 GHz), RAM 32GB のPCで追跡した際の平均fps。
OpenCV Tracking API 各アルゴリズムのパフォーマンス
追跡精度・処理速度共にKCFが高パフォーマンス。
- Success plot(領域オーバーラップ)
処理速度(fps)
Boosting | MIL | TLD | MedianFlow | KCF |
---|---|---|---|---|
27.6763 | 16.8790 | 9.7450 | 134.3183 | 80.5531 |
他の実装及び最新アルゴリズムとの比較
OpenCV Tracking API 各アルゴリズムと、Boosting, MIL, TLDのオリジナル実装およびStruck SCM, ASLA, CXTというstate-of-the-artなアルゴリズムとを比較してみた。結果は次の通りである。
処理速度 (fps)
Boosting | MIL | TLD | MedianFlow | KCF | |
---|---|---|---|---|---|
OpenCV | 27.6763 | 16.8790 | 9.7450 | 134.3183 | 80.5531 |
Original | 3.8218 | 28.6296 | 18.0030 |
Struck | SCM | ASLA | CXT |
---|---|---|---|
9.5245 | 0.4109 | 6.0161 | 6.9816 |
※KCFのオリジナルコード(matlab)は今回のテストには入れてないが、少し動かしたところ40fps程度だった。さすがにC++で実装されているOpenCV版の方が速そう。
OpenCV版とオリジナルを比べると、TLDはOpenCV版になって精度がかなり落ちているのがわかる。デフォルトパラメータが異なるのか?
また、OpenCV実装のKCFと他のstate-of-the-artなアルゴリズムとを比べても、KCFは精度・速度共に引けを取らない高パフォーマンスであることがわかる。
おわりに
(単一の)物体を追跡したくなったら、OpenCVのKCFを使うのが良さそう。さすが昨年(2014)にCVPRでオーラルで採録されているだけある!
本当は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.