追跡アルゴリズム (C++/python)情報へのリンク

追跡アルゴリズム (C++/python)情報へのリンク情報です。

## OpenCVのドキュメント
なんと言っても本家のドキュメント
追跡の部分も近年のアルゴリズムの進展で、OpenCVの中で使える追跡アルゴリズムが増えています。OpeCV 4.0.0.preでは８種の追跡アルゴリズムが用意されています。

- 3.4.1
    - https://docs.opencv.org/3.4.1/d2/d0a/tutorial_introduction_to_tracker.html
    - https://docs.opencv.org/3.4.1/d0/d0a/classcv_1_1Tracker.html
    - https://docs.opencv.org/3.4.1/db/dc1/group__datasets__track.html
        Trackingという枠組みは、追跡を評価するための枠組みになっていて、[VOT2015 Dataset](http://www.votchallenge.net/vot2015/dataset.html)に対してすぐに評価できるよう準備されています。
- 4.0.0.pre 
    - https://docs.opencv.org/master/d2/d0a/tutorial_introduction_to_tracker.html
    - https://docs.opencv.org/master/d0/d0a/classcv_1_1Tracker.html
    - https://docs.opencv.org/master/db/dc1/group__datasets__track.html

複数の対象物を追跡するときには
cv::MultiTracker クラスが用意されています。

- https://docs.opencv.org/3.3.0/d8/d77/classcv_1_1MultiTracker.html

help(cv2.MultiTracker_create)
Help on built-in function MultiTracker_create:

MultiTracker_create(...)
    MultiTracker_create() -> retval
    .   * \brief Returns a pointer to a new instance of MultiTracker



~~本家のドキュメントにはPythonバインディングについてのドキュメントは、この記事を書いている時点では見つかりませんでした。~~

以下の場所にMultiTrackerのPythonバインディングを利用するサンプルスクリプトがありました。

https://github.com/opencv/opencv_contrib/blob/master/modules/tracking/samples/multitracker.py


OpenCVでは評価用のデータベースが入手しやすい状況が作られています。

https://docs.opencv.org/master/db/dc1/group__datasets__track.html


### OpenCVにある追跡関係のコードを読もうとしたときのメモです。
[OpenCV にある追跡関係を調査中](https://qiita.com/nonbiri15/items/80f2407d7d28cc6f63ce)


### 論文を参照しよう

利用するアルゴリズムを選択する際には、ベンチマークが必要です。著者が新規のアルゴリズムを発表する場合には、従来のアルゴリズムに比べて、どのように優れているのかを比較しています。有名な学会で採択されているような論文では、新規のアルゴリズムを学べるだけではなく、そのような人が既存のアルゴリズムをどのように評価しているのかがわかります。トップ　カンファレンスでは、採択されるまえに十分なレビューが入るので、そのような点でもぜひ読むべきでしょう。

http://openaccess.thecvf.com/content_cvpr_2017/papers/Yun_Action-Decision_Networks_for_CVPR_2017_paper.pdf

![table1.png](https://qiita-image-store.s3.amazonaws.com/0/83761/0f4c3dd8-38c2-f799-7c7c-417866224778.png)

その論文中の
Table 1: Summary of experiments on OTB-50
では、いくつかの手法の比較のされています。non-realtimeとrealtimeとしてアルゴリズムが分類されています。



では、自分の用途にどのアルゴリズムを選択すべきなのか。
次の論文は組み込みのための追跡についての視点で述べている。

https://www.researchgate.net/publication/317803149_Evaluation_of_Visual_Tracking_Algorithms_for_Embedded_Devices

上記の中に次のグラフがある。　Fig. 1. Box plot illustrating averages and distributions of frame rates. Four (4) outliers
above 50 FPS between Median Flow and KCF are missing to make the y axis scale
better.
![fig4.png](https://qiita-image-store.s3.amazonaws.com/0/83761/3b7da3c9-1de4-9bf8-e650-74cbb5d3bf9c.png)


Youtube [OpenCV Visual Tracking - BOOSTING, KCF, MEDIANFLOW, MIL, TLD](https://www.youtube.com/watch?v=RKZ3Wmax38c)


Youtube [OpenCV 3.0 Tracking API Results](https://www.youtube.com/watch?v=pj-QuE6pdEQ)



---

- 解説記事 OpenCV [動く人・物を追跡する(1) - OpenCVによるトラッキング](http://news.mynavi.jp/series/cv_future/027/)

- OpenCV C++  [こんなに簡単!? トラッキング](https://qiita.com/hmichu/items/3615ddcc93851ad59abe)
 複数のアルゴリズムの違いを表示しています。
最初の枠は以下のようにマウスで与えています。

```
    cv::Rect2d roi = cv::selectROI("tracker", frame); // マウスで中心を選択してドラッグ
```

- OpenCV C++ 複数のアルゴリズムの比較のコードがあります。　[開発メモ その65 OpenCV 3.2 with ContribモジュールでTrackingを使用する ](https://taktak.jp/2017/05/13/2280)



- OpenCV C++  [OpenCV Tracking API について ](http://irohalog.hatenablog.com/entry/opencv_tracking_api)
- OpenCV C++  アルゴリズムの解説記事 [KCFコードリーディング](http://d.hatena.ne.jp/takmin/20161222/1482384125)

- [テンプレートマッチングによって，動画ファイルの中の物体を追跡する方法．](http://freeplanets.ship.jp/Programing/OpenCV/TemplateMatching/TemplateMatching-OpenCV.html)

```
        //template matching
        cv::matchTemplate(frame, frame_template, matching_res, CV_TM_CCOEFF_NORMED);       テンプレートマッチングの計算

        cv::Point max_pt;
        double maxVal;
        cv::minMaxLoc( matching_res, NULL, &maxVal, NULL, &max_pt);    テンプレートがもっとも元画像に良く重なる位置を求める．
```

追跡アルゴリズムの利用の初期からあるのがテンプレートマッチングです。



- OpenCV C++  [OpenCV3.1のTracking APIでトラッキングを試す](https://mementoo.info/archives/2425)



- OpenCV C++ [OpenCVで物体追跡し、対象にモザイクをかけ続ける(動画)](https://qiita.com/h-adachi/items/6ccb0b06517bdd5ebcb4)
 
windowsでのOpenCV contrib を含めたインストールから、入力動画の最初でマウスで追跡開始枠を入力して追跡を実施するサンプルです。



- OpenCV C++ 顔検出のプログラムとマウスでの顔枠入力後のトラッキングのプログラム　[OpenCV トラッキングAPIで顔面追尾](https://qiita.com/AkihiroTakai/items/af0670207535b7cd145f)


- OpenCV Python [OpenCV3とPython3を使った物体追跡（マウスで指定した特徴点をLucas-Kanade法で追跡する）](https://qiita.com/hitomatagi/items/3d8973f855e963c9d999)

- OpenCV Python [Object Tracking using OpenCV (C++/Python)](https://www.learnopencv.com/object-tracking-using-opencv-cpp-python/)
アルゴリズムの違いについて説明がある。


### 追跡アルゴリズムの選択時のポイント

- 被写体の見え方の大きさが変化することに対応しているか？
    - 大きさが変わらないことを前提としたテンプレートマッチングもある。
- 被写体の明るさが変化することに対応しているか？
    - 輝度ベースのアルゴリズムによっては、屋内と屋外のように輝度値が変動してしまうところで追跡できないのがある。
- 検出それ自体と比べて、追跡アルゴリズムが十分に軽いアルゴリズム・実装になっているか？
    - 追跡アルゴリズムが遅ければ、全フレーム検出した方がよくなる。
- 対象物の変形がどの程度あるのか、変形で追跡が破綻するのを考慮する。
- 追跡を行うフレーム間隔は短いほど、追跡が簡単になる。 
- 対象物特化型の追跡ライブラリ
    - [FaceTracker](http://facetracker.net/) 
    >  FaceTracker is a C++ library for real-time non-rigid face tracking using OpenCV 2, and is free for non-commercial use. For commercial use, please request a quote.
- 追記：　検出の欠損がフレームによって生じた時に、追跡IDの継続ができるアルゴリズムかどうか。
- 追記：　複数の対象物に対して追跡を可能にするものであるかどうか。

### 検出処理と追跡処理とすり合わせ
- 追跡を開始させる条件（既存の追跡と同一のオブジェクトでないと判定する条件）
- 既存の追跡と判定されたときに、検出の結果をどのように追跡のパラメータに反映させるか


github python opencv track などのキーワード検索してみましょう。


dlib 自体にも追跡が実装されています。

[【Ubuntu】【Python】dlibを用いた物体追跡](https://qiita.com/Kazuhito/items/1778cc5727d237fb50e1)


github [multi-object-tracker](https://github.com/eveningglow/multi-object-tracker)


SlideShareに、アルゴリズムの解説記事を探してみます。

SlideShare [単一物体追跡論文のサーベイ](https://www.slideshare.net/hitoshinishimura75/ss-75287241) 

SlideShare [Lucas kanade法について](https://www.slideshare.net/hitoshinishimura75/lucas-kanade?qid=a4603244-f548-4b13-98c8-f7db9b15236b&v=&b=&from_search=7)

SlideShare [Cv20160205](https://www.slideshare.net/takanoriogata1121/cv20160205-57945518) 

github https://github.com/abhineet123/Deep-Learning-for-Tracking-and-Detection

- 各種アルゴリズムのリンク集


---
以下の例は、物理的にカメラを移動させる話。画像内で追跡する話ではない。

- [[メモ](らずぱい)Pan-Tilt HATとカメラで、顔追跡(Face Tracking)](https://qiita.com/mt08/items/97d89a09e5129e10f88c)
- [Raspberry Pi サーボモーターとOpen CVで顔追跡カメラ（Haar-like）](https://qiita.com/PonDad/items/b2769641350aee6085c6)

-----

[4dface: Real-time 3D face tracking and reconstruction from 2D video](https://github.com/patrikhuber/4dface)

[OpenFace – a state-of-the art tool intended for facial landmark detection, head pose estimation, facial action unit recognition, and eye-gaze estimation. ]
https://github.com/TadasBaltrusaitis/OpenFace



|algorithm   | paper   |   |
|---|----|---|
|Boosting   | [Real-time tracking via on-line boosting.](http://grabner.family/helmut/papers/Grabner2006RealTimeTracking.pdf)   |   |
|MIL   | [Visual Tracking with Online Multiple Instance Learning](http://faculty.ucmerced.edu/mhyang/papers/cvpr09a.pdf)   |   |
|TLD   |[Tracking-Learning-Detection](http://epubs.surrey.ac.uk/713800/1/Kalal-PAMI-2011%281%29.pdf)    |   |
|MedianFlow   | [Forward-backward error: Automatic detection of tracking failures](http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.231.4285&rep=rep1&type=pdf)   |   |
|KCF   | [High-Speed Tracking with Kernelized Correlation Filters](http://www.robots.ox.ac.uk/~joao/publications/henriques_tpami2015.pdf)  |   |
|   |    |   |
|   |    |   |


### 2022年時点の追記
DeepSort という追跡アルゴリズムが着目されている。そのようなアルゴリズムも候補に上げ検討してほしい。

[DeepSort とYolov4の組み合わせの実装を調査中](
https://qiita.com/nonbiri15/items/54949e179302353deea5)