A certain engineer "COMPLEX"

開発メモ その65 OpenCV 3.2 with ContribモジュールでTrackingを使用する

Introduction


OpenCVSharpにPull Requestを投げました。
内容は、OpenCVの拡張モジュールに含まれる、Trackingと呼ばれる物体追跡用モジュールのOpenCVSharp対応です。

Add elementary functions for Tracking class and unit test class.

そんな物体追跡をC++で試してみたメモになります。

What is Tracking?

詳しい理論などは、

がわかりやすいです。

ともかく

  1. 画像上の任意矩形を初期位置を設定
  2. 矩形内の特徴を学習
  3. 矩形周辺を探索し移動量推定
  4. 2.から繰り返し

という流れです。

物体追跡を使えば、現実世界において、通過する車両の数を計算したり出来そうですね。

How to use?

Trackingの使い方は非常にシンプルです。

  1. インスタンスの生成
    • cv::Ptr Tracker::create(const cv::String& trackerType)
  2. インスタンスの初期化
    • bool Tracker::init(const cv::Mat& image, const cv::Rect2d& boundingBox)
  3. 更新
    • bool Tracker::update(const cv::Mat& image, cv::Rect2d& boundingBox)
  4. 3を繰り返す

以上です。

Algorithm

物体追跡にはいくつかのアルゴリズムが用意されており、先述のインスタンスの生成の際に、文字列としてアルゴリズムを指定します。
OpenCV3.2で利用できるアルゴリズムは

の6つになります。
ただし、GOTURNは、Caffeを利用しており、入力として、goturn.prototxtgoturn.caffemodelを実行フォルダに展開する必要があります。
さもなくば、

OpenCV Error: Unspecified error (FAILED: fs.is_open(). Can't open "goturn.prototxt") in cv::dnn::ReadProtoFromTextFile, file D:\Works\Lib\OpenCV\src\opencv_contrib-3.2.0\modules\dnn\src\caffe\caffe_io.cpp, line 1077
D:\Works\Lib\OpenCV\src\opencv_contrib-3.2.0\modules\dnn\src\caffe\caffe_io.cpp:1077: error: (-2) FAILED: fs.is_open(). Can't open "goturn.prototxt" in function cv::dnn::ReadProtoFromTextFile

OpenCV Error: Unspecified error (FAILED: fs.is_open(). Can't open "goturn.caffemodel") in cv::dnn::ReadProtoFromBinaryFile, file D:\Works\Lib\OpenCV\src\opencv_contrib-3.2.0\modules\dnn\src\caffe\caffe_io.cpp, line 1086
D:\Works\Lib\OpenCV\src\opencv_contrib-3.2.0\modules\dnn\src\caffe\caffe_io.cpp:1086: error: (-2) FAILED: fs.is_open(). Can't open "goturn.caffemodel" in function cv::dnn::ReadProtoFromBinaryFile

というエラーが発生します。

入手先は下記の2箇所になります。

  1. Train you own GOTURN model using
  2. Download pretrained caffemodel

ただ、上記2つを見てもそれらしいのはありませんし、protoxtxtやcaffemodelの名前を変更して実行してもエラーになったりして試すことが出来ませんでした。

OpenCV Error: Requested object was not found (Requested blob ".data1" not found) in cv::dnn::Net::setBlob, file D:\Works\Lib\OpenCV\src\opencv_contrib-.2.0\modules\dnn\src\dnn.cpp, line 516

とりあえず、今回は、GOTURN以外を試しました。

Source

下記がサンプルです。

これを動かすと、次のようになります。
サンプルとして、ニンテンドー3DS「ポチと! ヨッシー ウールワールドポチと! ヨッシー ウールワールド」の任天堂Youtube公式チャンネルからポチと! ヨッシー ウールワールド ゲームで見られるアニメ 「かけっこ編」を使っています。
映像中の青ヨッシーを追跡します。
5fpsで録画した上、かなりフレーム数を間引いてGIFアニメにしていますが、アルゴリズム毎の性能はわかると思います。

評価としては、下記の感じです。

  • MIL
    • やや安定。途中で緑ヨッシーにつられてしまっている。
  • TLD
    • なんかランダムみたいな感じ
  • BOOSTING
    • そこそこ安定。ただし、一度青ヨッシーが枠から外れたため、途中で緑ヨッシーを追跡している。
  • KCF
    • 一番安定。ただし、枠外に外れてしまうと追跡できなくなる
  • MEDIANFLOW
    • まったく動いていない

画像を縮小して高速化も試しています。
まだまだ工夫の余地はあると思いますが、それなりに目的は達成できています。

Conclusion


いくつか問題はありますが、物体追跡は色々楽しめそうな技術ですね。
画像全体の探索はコストがかかりますが、一度見つかった物体の探索は、物体追跡が一番低コストかもしれません。

コメントを残す

メールアドレスが公開されることはありません。

%d人のブロガーが「いいね」をつけました。