Introduction
OpenCVSharpにPull Requestを投げました。
内容は、OpenCVの拡張モジュールに含まれる、Trackingと呼ばれる物体追跡用モジュールのOpenCVSharp対応です。
そんな物体追跡をC++で試してみたメモになります。
What is Tracking?
詳しい理論などは、
がわかりやすいです。
ともかく
- 画像上の任意矩形を初期位置を設定
- 矩形内の特徴を学習
- 矩形周辺を探索し移動量推定
- 2.から繰り返し
という流れです。
物体追跡を使えば、現実世界において、通過する車両の数を計算したり出来そうですね。
How to use?
Trackingの使い方は非常にシンプルです。
- インスタンスの生成
- cv::Ptr Tracker::create(const cv::String& trackerType)
- インスタンスの初期化
- bool Tracker::init(const cv::Mat& image, const cv::Rect2d& boundingBox)
- 更新
- bool Tracker::update(const cv::Mat& image, cv::Rect2d& boundingBox)
- 3を繰り返す
以上です。
Algorithm
物体追跡にはいくつかのアルゴリズムが用意されており、先述のインスタンスの生成の際に、文字列としてアルゴリズムを指定します。
OpenCV3.2で利用できるアルゴリズムは
- MIL
- TLD
- BOOSTING
- KCF
- MEDIANFLOW
- GOTURN
の6つになります。
ただし、GOTURN は、Caffeを利用しており、入力として、goturn.prototxt とgoturn.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箇所になります。
- Train you own GOTURN model using
- 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
下記がサンプルです。
1 |
|
これを動かすと、次のようになります。
サンプルとして、ニンテンドー3DS「ポチと! ヨッシー ウールワールドポチと! ヨッシー ウールワールド」 の任天堂Youtube公式チャンネルからポチと! ヨッシー ウールワールド ゲームで見られるアニメ 「かけっこ編」を使っています。
映像中の青ヨッシーを追跡します。
5fpsで録画した上、かなりフレーム数を間引いてGIFアニメにしていますが、アルゴリズム毎の性能はわかると思います。
評価としては、下記の感じです。
- MIL
- やや安定。途中で緑ヨッシーにつられてしまっている。
- TLD
- なんかランダムみたいな感じ
- BOOSTING
- そこそこ安定。ただし、一度青ヨッシーが枠から外れたため、途中で緑ヨッシーを追跡している。
- KCF
- 一番安定。ただし、枠外に外れてしまうと追跡できなくなる
- MEDIANFLOW
- まったく動いていない
画像を縮小して高速化も試しています。
まだまだ工夫の余地はあると思いますが、それなりに目的は達成できています。
Conclusion
いくつか問題はありますが、物体追跡は色々楽しめそうな技術ですね。
画像全体の探索はコストがかかりますが、一度見つかった物体の探索は、物体追跡が一番低コストかもしれません。