Object Tracking using OpenCV (C++/Python)　の和訳

[Learn OpenCV のサイトにある Object Tracking using OpenCV (C++/Python)](https://www.learnopencv.com/object-tracking-using-opencv-cpp-python/)の部分の和訳を作成しました。


---

このチュートリアルでは、OpenCV 3.0で導入されたOpenCVトラッキングAPIについて学びます。 OpenCV 3.4.1で利用可能な8つの異なる追跡器 - BOOSTING、MIL、KCF、TLD、MEDIANFLOW、GOTURN、MOSSE、およびCSRT - の使用方法と使用方法を学びます。 また、現代の追跡アルゴリズムの背後にある一般的な理論も学びます。下のこの完璧なリアルタイム顔追跡器に示すように、この問題は私の友人Boris Babenkoによって完全に解決されました！ 冗談はさておき、次の動画は理想的なオブジェクト追跡器に求めているもの - 速度、正確さ、そしてオクルージョンに対する頑健性 - を示しています。

![](https://www.learnopencv.com/wp-content/uploads/2017/02/real-time-face-tracking.gif)


## OpenCV Object Tracker Demo

投稿全体を読む時間がない場合は、このビデオを見て、このセクションの使い方を学んでください。 しかし、もしあなたが本当にオブジェクト追跡について学びたいのなら、読んでください。


https://www.youtube.com/watch?v=61QjSz-oLr8&feature=youtu.be



## What is Object Tracking ?

簡単に言うと、ビデオの連続するフレーム内でオブジェクトを見つけることを追跡と呼びます。定義は簡単に思えますが、コンピュータビジョンと機械学習では、追跡は概念的には似ているが技術的には異なるアイデアを含む非常に広い用語です。 例えば、以下の異なるが関連したアイデアはすべて、一般にオブジェクト追跡の下で研究されています。


高密度オプティカルフロー：これらのアルゴリズムは、ビデオフレーム内のすべてのピクセルの動きベクトルを推定するのに役立ちます。

疎なオプティカルフロー：これらのアルゴリズムは、Kanade-Lucas-Tomashi（KLT）機能追跡器と同様に、画像内のいくつかの特徴点の位置を追跡します。

カルマンフィルタリング：以前の動き情報に基づいて移動物体の位置を予測するために使用される非常に一般的な信号処理アルゴリズム。 このアルゴリズムの初期の応用の1つはミサイル誘導でした！ またここで述べたように、「アポロ11号の月のモジュールの降下を月へ導くオンボードコンピュータはカルマンフィルターを持っていました」。

MeanshiftとCamshift：これらは密度関数の最大値を見つけるためのアルゴリズムです。 それらは追跡にも使用されます。

単一オブジェクト追跡器：このクラスの追跡器では、最初のフレームは、追跡したいオブジェクトの位置を示すために長方形を使用してマークされます。 その後、追跡アルゴリズムを使用して、オブジェクトを後続のフレームで追跡します。 ほとんどの実際の用途では、これらの追跡装置は物体検出器と一緒に使用される。

マルチオブジェクトトラック検出アルゴリズム：高速オブジェクト検出器がある場合、各フレームで複数のオブジェクトを検出してから、あるフレーム内のどの長方形が次のフレーム内の長方形に対応するかを識別するトラック検出アルゴリズムを実行するのが合理的です。

## Tracking vs Detection
OpenCVの顔検出機能を使ったことがあれば、それがリアルタイムで機能することがわかり、すべてのフレームで顔を簡単に検出できます。 それで、なぜあなたはそもそも追跡する必要があるのですか？ 単に検出を繰り返すのではなく、ビデオ内のオブジェクトを追跡したいと思うさまざまな理由を調べてみましょう。


追跡は検出より速い：通常追跡アルゴリズムは検出アルゴリズムより速いです。その理由は簡単です。前のフレームで検出されたオブジェクトを追跡しているときは、そのオブジェクトの外観についてよく知っています。また、前のフレームの位置とその動きの方向と速度もわかります。そのため、次のフレームでは、このすべての情報を使用して次のフレームのオブジェクトの位置を予測し、オブジェクトの正確な位置を特定するためにオブジェクトの予想される位置を中心に小さな検索を実行できます。優れた追跡アルゴリズムでは、その時点までのオブジェクトに関するすべての情報が使用されますが、検出アルゴリズムは常に最初から始まります。したがって、効率的なシステムを設計している間、通常、ｎ番目のフレームごとに物体検出が実行され、その間の追跡アルゴリズムはｎ − １フレームで使用される。最初のフレームで単にオブジェクトを検出してその後追跡するのではないのはなぜですか。追跡はそれが持っている余分な情報から恩恵を受けることは事実ですが、あなたがそれらが長期間障害物の後ろに行くか、追跡アルゴリズムが追いつくことができないほど速く動くならばあなたは物の追跡を失うこともできます。追跡アルゴリズムが誤差を累積することも一般的であり、オブジェクトを追跡するバウンディングボックスは、追跡しているオブジェクトからゆっくりとドリフトする。追跡アルゴリズムに関するこれらの問題を解決するために、検出アルゴリズムが頻繁に実行されます。検出アルゴリズムは、物体の多数の例について訓練されています。したがって、彼らはオブジェクトの一般的なクラスについてより多くの知識を持っています。一方、追跡アルゴリズムは、追跡しているクラスの特定のインスタンスについてより詳しく知っています。

検出に失敗した場合は追跡が役立ちます。ビデオで顔検出器を実行していて、人物の顔が物体によって遮られている場合、顔検出器はおそらく失敗します。 一方、優れた追跡アルゴリズムは、ある程度のオクルージョンを処理します。 下のビデオでは、MIL追跡器の作者であるBoris Babenko博士が、MILトラッカーがオクルージョンの下でどのように機能するかを説明しています。


追跡は同一性を保持します：オブジェクト検出の出力は、オブジェクトを含む長方形の配列です。 ただし、オブジェクトに付加されているIDはありません。 たとえば、以下のビデオでは、赤い点を検出する検出器は、フレーム内で検出したすべての点に対応する長方形を出力します。 次のフレームでは、それは長方形の別の配列を出力します。 最初のフレームでは、特定のドットが配列内の位置10の四角形で、2番目のフレームでは位置17の四角形で表されることがあります。フレームで検出を使用している間は、どの四角形がどのオブジェクトに対応しますか。 一方、トラッキングは文字通りドットをつなぐ方法を提供します。

## BOOSTING Tracker

このトラッカーはAdaBoostのオンライン版 - HAARカスケードベースの顔検出器が内部で使用するアルゴリズムに基づいています。この分類器は、オブジェクトの正と負の例を使用して実行時にトレーニングする必要があります。ユーザによって（または他のオブジェクト検出アルゴリズムによって）供給された最初のバウンディングボックスは、そのオブジェクトに対する好例としてみなされ、バウンディングボックスの外側の多くの画像パッチは背景として扱われる。新しいフレームが与えられると、識別器は前の位置の近傍にあるすべてのピクセルで実行され、識別器のスコアが記録されます。オブジェクトの新しい場所は、スコアが最大になる場所です。そのため、分類子についてもう1つの良い例があります。より多くのフレームが入ってくると、この追加データで分類器が更新されます。
### 長所：
なし。このアルゴリズムは10年前のもので、問題なく動作しますが、特に同様の原則に基づく他の高度なトラッカー（MIL、KCF）が利用可能な場合は、それを使用する正当な理由が見つかりませんでした。
### 短所：
追跡のパフォーマンスは普通です。追跡がいつ失敗したかは確実にはわかりません。


## MIL Tracker

この追跡器は、前述のBOOSTING追跡器と概念が似ています。大きな違いは、オブジェクトの現在位置だけをポジティブな例として考えるのではなく、現在位置の周りの小さな近傍を見ていくつかの潜在的なポジティブな例を生成することです。あなたはそれが悪い考えだと思っているかもしれません。これらの「ポジティブ」な例のほとんどでは、オブジェクトは中心に置かれていないからです。これが、複数インスタンス学習（MIL）が助けになるところです。 MILでは、正と負の例ではなく、正と負の「バッグ」を指定します。ポジティブバッグの中の画像の集まりは、すべてポジティブな例ではありません。代わりに、ポジティブバッグの中の1つの画像だけがポジティブな例である必要があります。この例では、ポジティブバッグには、オブジェクトの現在位置を中心としたパッチが含まれており、その周囲の狭い場所にもパッチが適用されています。追跡対象の現在位置が正確でなくても、現在位置の近傍からのサンプルがポジティブバッグに入れられると、このバッグが少なくとも１つの画像が含まれている可能性が高い。 MILプロジェクトページには、MIL追跡器の内部動作をより深く掘り下げたい人のためのより多くの情報があります。
### 長所：
パフォーマンスはかなり良いです。それはBOOSTING追跡器ほどドリフトすることはなく、部分的オクルージョンの下で合理的な仕事をします。あなたがOpenCV 3.0を使っているなら、これはあなたに利用可能な最高の追跡器かもしれません。しかし、もっと高いバージョンを使っているのなら、KCFを検討してください。
### 短所：
追跡の失敗は確実には報告されません。完全閉塞から回復しません。


## KCF Tracker

KFCはKernelized Correlation Filtersの略です。 この追跡器は、前の2つの追跡器で提示されたアイデアに基づいています。 この追跡器は、MIL追跡器で使用される複数のポジティブサンプルが大きな重複領域を持つという事実を利用しています。 この重なり合うデータは、追跡をより速くそしてより正確にするためにこの追跡器によって利用されるいくつかの良い数学的性質をもたらす。
### 長所：
正確さとスピードはどちらもMILよりも優れており、トラッキングの失敗はBOOSTINGとMILよりも優れていると報告されています。 OpenCV 3.1以上を使用している場合は、ほとんどのアプリケーションでこれを使用することをお勧めします。
### 短所：
完全なオクルージョンから回復しない。 OpenCV 3.0では実装されていません。



## TLD Tracker
TLDはTracking、learning、およびdetectionの略です。その名前が示すように、この追跡器は長期追跡タスクを3つの要素、（短期）追跡、学習、および検出に分解します。著者の論文によると、「追跡器はオブジェクトをフレームごとに追跡します。検出器はこれまでに観察された全ての外観を局所化し、必要ならば追跡装置を修正する。この追跡器のこの出力は少し飛び跳ねる傾向があります。たとえば、歩行者を追跡していて、シーン内に他の歩行者がいる場合、この追跡器は追跡しようとしていた歩行者とは異なる歩行者を一時的に追跡することがあります。ポジティブな面では、このトラックはより大きなスケール、動き、そしてオクルージョンにわたってオブジェクトを追跡するように見えます。オブジェクトが他のオブジェクトの後ろに隠れているビデオシーケンスがある場合は、この追跡器が適しています。
### 長所：
複数のフレームにまたがるオクルージョンの下で最適に機能します。また、スケール変更を超えて最もよく追跡します。
### 短所：
誤検出が多く、それゆえほとんど使用不可能になっています。


## MEDIANFLOW Tracker
内部的には、この追跡器は時間的に前後両方向にオブジェクトを追跡し、これら2つの軌跡間の食い違いを測定します。 このForwardBackwardエラーを最小限に抑えることで、追跡失敗を確実に検出し、ビデオシーケンスで信頼できる軌道を選択できます。私のテストでは、この追跡器は動きが予測可能で小さいときに最もうまくいくことがわかりました。 追跡が明らかに失敗した場合でも進行し続ける他の追跡者とは異なり、この追跡者は追跡がいつ失敗したかを知っている。

### 長所：
追跡エラー報告が優れています。 動きが予測可能でオクルージョンがない場合に非常にうまく機能します。
### 短所：
大きな動きの下で失敗します。


### GOTURN Tracker
trackerクラスのすべての追跡アルゴリズムのうち、これが畳み込みニューラルネットワーク（CNN）に基づく唯一のものです。 OpenCVのドキュメントから、我々はそれが「視点の変化、照明の変化、そして変形に対してロバストである」ことを知っています。 しかし、GOTURN Trackerはオクルージョン(隠蔽)をあまりうまく処理しません。

Notice：CNN(Convolutional Neural Network)ベースの追跡器であるGOTURNは、追跡にCaffeモデルを使用します。 Caffeモデルとproto text ファイルは、コードが存在するディレクトリに存在しなければなりません。 これらのファイルはopencv_extraリポジトリからダウンロードし、連結して使用前に抽出することもできます。

更新：GOTURN物体追跡アルゴリズムはOpenCVに移植されました。 その実装については別のブログ投稿があります。

### MOSSE　Tracker
最小出力二乗誤差の合計（MOSSE）は、オブジェクトトラッキングのための適応相関を使用します。それは、単一フレームを使用して初期化されたときに安定した相関フィルタを生成します。 MOSSE Trackerは、照明、スケール、ポーズ、および非剛体変形の変動に対してロバストです。 また、ピーク対サイドローブの比率に基づいてオクルージョンを検出します。これにより、トラッカーは、オブジェクトが再表示されたときに停止したところから再開することができます。 MOSSE Trackerは、より高いfps（450 fps、さらにそれ以上）でも動作します。 さらに、実装が非常に簡単で、他の複雑なトラッカーと同じくらい正確で、はるかに高速です。 しかし、パフォーマンスの面では、ディープラーニングベースのトラッカーよりも遅れています。

### CSRT Tracker
チャネルおよび空間信頼性を有する識別相関フィルタ（ＤＣＦ − ＣＳＲ）では、空間信頼性マップを使用して、追跡のためにフレームから選択された領域の一部にフィルタサポートを調整します。 これは、選択された領域の拡大および局在化、ならびに非矩形の領域または物体の追跡の改善を確かなものにします。 それは2つの標準的な機能（HoGsとColornames）だけを使います。 また、比較的低いfps（25 fps）で動作しますが、オブジェクトトラッキングの精度が高くなります。