作者介紹:satya mallick,擅長領域為計算機視覺,機器學習,人工智能。

在本教程中,我們将了解opencv 3.0中引入的opencv跟蹤api。 我們将學習如何以及何時使用opencv 3.2中提供的6種不同的跟蹤器- boosting,mil,kcf,tld,medianflow和goturn。 我們還将學習現代跟蹤算法背後的基本理論。
簡單地說,在視訊的連續幀中定位對象被稱為跟蹤。
定義聽起來很直接,但在計算機視覺和機器學習中,跟蹤是一個非常寬泛的術語,涵蓋概念上類似但技術上不同的理念。 例如,通常在對象跟蹤下研究所有以下不同但相關的理念:
1.密集光流:這些算法有助于估計視訊幀中每個像素的運動矢量。
2.稀疏光流:這些算法跟蹤圖像中幾個特征點的位置,如kanade-lucas-tomashi(klt)特征跟蹤器。
3.卡爾曼濾波:用于非常流行的基于先前運動資訊來預測運動對象的位置的信号處理算法。 這種算法的早期應用之一是飛彈指導! 正如這裡所提到的,“引導阿波羅11月球子產品下降到月球的車載計算機具有卡爾曼濾波器”。
4.meanshift算法和camshift定位:這是一個密度函數的最大值的算法。它們也用于跟蹤。
5.單個對象跟蹤器:在此類跟蹤器中,第一幀使用矩形标記,以訓示要跟蹤的對象的位置。 然後使用跟蹤算法在随後的幀中跟蹤對象。 在大多數現實生活應用中,這些跟蹤器與對象檢測器結合使用。
6.多目标跟蹤算法:在我們有一個快速目标探測器的情況下,有意義的是檢測每個幀中的多個目标,然後運作軌迹找到算法,識别一個幀中的哪個矩形對應于下一個幀中的矩形。
如果你曾經使用過opencv的臉部檢測,你知道它是實時工作,你可以很容易地檢測到每一幀的臉。 那麼,為什麼需要跟蹤在第一個地方? 讓我們來探索你可能要跟蹤的視訊中的對象的不同原因,而不僅僅是重複檢測。
1.跟蹤速度比檢測快:通常跟蹤算法比檢測算法快。原因很簡單。當你跟蹤在上一幀中檢測到的對象時,你會非常了解對象的外觀。你也知道在前一幀中的位置和它的運動的方向和速度。是以,在下一幀中,您可以使用所有這些資訊來預測下一幀中對象的位置,并對對象的預期位置進行小型搜尋,以準确定位對象。良好的跟蹤算法将使用其關于對象的所有資訊直到那一點,而檢測算法總是從頭開始。是以,在設計有效系統時,通常在每n幀上運作對象檢測,而在其間的n-1幀中采用跟蹤算法。為什麼我們不是簡單地檢測第一幀中的對象并跟蹤?實際上,跟蹤從附加資訊中獲益,但是當它們在一個障礙物後面延長一段時間或者它們移動得如此之快以緻跟蹤算法不能趕上時,也可能失去對物體的跟蹤。跟蹤算法累積誤差也是常見的,并且跟蹤對象的邊界框慢慢地偏離它跟蹤的對象。為了解決跟蹤算法中的這些問題,檢測算法每隔一段時間運作一次。在對象的大量示例上訓練檢測算法。是以,它們對對象的一般類有更多的了解。另一方面,跟蹤算法更多地了解它們正在跟蹤的類的特定執行個體。
2.當檢測失敗時跟蹤可以起到幫助作用:如果你正在一個視訊上運作一個面部檢測器,人的面部被一個對象遮擋,面部檢測器很可能失敗。 另一方面,良好的跟蹤算法将處理某種程度的遮擋。
3.跟蹤保留身份:對象檢測的輸出是包含對象的矩形數組。 但是,沒有辨別附加到對象。 例如,檢測紅點的檢測器将輸出與其在幀中檢測到的所有點相對應的矩形。 在下一幀中,它将輸出另一個矩形數組。 在第一幀中,特定點可以由矩陣在陣列中的位置10處表示,并且在第二幀中,其可以在位置17.當在幀上使用檢測時,我們不知道哪個矩形對應于哪個對象。 另一方面,跟蹤提供了一種方式來連接配接點。
opencv 3提供了一個新的跟蹤api,包含許多單個對象跟蹤算法的實作。 opencv 3.2 - boosting,mil,kcf,tld,medianflow和goturn有6種不同的跟蹤器。
注意:opencv 3.1具有這5個跟蹤器的實作--boosting,mil,kcf,tld,medianflow。 opencv 3.0具有以下4個跟蹤器的實作:boosting,mil,tld,medianflow。
在我們提供算法的簡要描述之前,讓我們看看設定和用法。 在下面的注釋代碼中,我們首先通過選擇跟蹤器類型(boosting,mil,kcf,tld,medianflow或goturn)設定跟蹤器。 然後我們打開一個視訊,抓住一個架構。 我們定義一個包含第一幀對象的邊界框,并用第一個架構和邊界框初始化跟蹤器。 最後,我們從視訊中讀取幀,并且隻是在循環中更新跟蹤器以獲得目前幀的新的邊界框。 随後顯示結果。
在本節中,我們将挖掘一些不同的跟蹤算法。我們的目标不是對每一個跟蹤器有深刻的理論了解,而是從實際的角度來了解它們。
首先先解釋一下跟蹤的一些基本原理。在跟蹤中,我們的目标是在目前幀中找到一個對象,因為我們已經在所有(或幾乎所有)先前幀中成功跟蹤了對象。
由于我們已經跟蹤對象直到目前幀,我們知道它是如何移動的。 換句話說,我們知道運動模型的參數。 運動模型指你知道的對象在之前的幀中的位置和速度(速度+運動方向)。 如果你對對象沒有其他了解,你可以根據目前的運動模型預測新位置,并且你将非常接近對象的新位置。
但是我們有更多關于對象運動的資訊。 我們知道對象在每個先前幀中的外觀。 換句話說,我們可以建構一個外觀模型來編碼對象的外觀。 該外觀模型可以用于在由運動模型預測的位置的小鄰域中搜尋,以更精确地預測對象的位置。
運動模型預測對象的大緻位置。 外觀模型微調這個估計以基于外觀提供更準确的估計。
如果對象很簡單,沒有改變它的外觀很多,我們可以使用一個簡單的模闆作為外觀模型,并尋找那個模闆。 然而,現實生活不是那麼簡單。 對象的外觀可能會發生巨大變化。 為了解決這個問題,在許多現代跟蹤器中,該外觀模型是以線上方式訓練的分類器。
分類器的工作是将圖像的矩形區域分類為對象或背景。 分類器接受圖像更新檔作為輸入,并傳回0和1之間的分數,以訓示圖像更新檔包含對象的機率。 當絕對确定圖像更新檔是背景時,分數為0,當絕對确定更新檔是對象時,分數為1。
在機器學習中,我們使用“線上”這個詞來指代在運作時在運作中訓練的算法。 離線分類器可能需要數千個示例來訓練分類器,但是在運作時通常使用非常少的示例訓練線上分類器。
分類器通過饋送正(對象)和負(背景)示例來訓練。 如果你想建立一個分類器來檢測貓,你訓練它與成千上萬包含貓的圖像和數千不包含貓的圖像。 這樣分類器學習區分什麼是貓和什麼不是貓。 你可以在這裡了解有關圖像分類的更多資訊。 在建立線上分類器時,我們沒有成千上萬的正和負的例子。
讓我們來看看不同的跟蹤算法如何處理這個線上訓練問題。
此跟蹤器基于adaboost的線上版本 - 基于haar級聯的面部檢測器在内部使用的算法。 這個分類器需要在運作時用對象的正和負例子訓練。 由使用者提供的初始邊界框(或由另一個對象檢測算法)作為對象的正例,并且邊界框外部的許多圖像補片被當作背景。 給定新幀,對先前位置的鄰域中的每個像素運作分類器,并記錄分類器的得分。 對象的新位置是得分最大的位置。 是以現在我們有一個更積極的例子為分類器。 随着更多的幀進入,分類器用該附加資料更新。
優點:無。 這個算法是十年前并且可以運用,但我找不到一個很好的理由使用它,特别是當其他進階跟蹤器(mil,kcf)基于類似的原理可用。
缺點:跟蹤性能平庸。
此跟蹤器在概念上類似于上述的boosting跟蹤器。 最大的差別在于,代替僅考慮對象的目前位置作為積極示例,它在目前位置周圍的小鄰域中查找以生成若幹潛在的正例子。 你可能認為這是一個壞主意,因為在大多數這些“積極”的例子中,對象不是中心。
在mil中,你沒有指定正和負例子,但是有正和負“包”。 正包中的圖像集合并不都是積極的例子。 相反,隻有一個圖像在積極的包裡需要一個積極的例子。在我們的示例中,正包包含以對象的目前位置為中心的更新檔,以及在其周圍的小鄰域中的更新檔。 即使被跟蹤對象的目前位置不準确,當來自目前位置的鄰域的樣本被放入正包中時,很有可能這個包包含至少一個圖像,其中對象被良好地置于居中。
優點:性能相當不錯。 它不像boosting跟蹤器那樣漂移,它在部分遮擋下合理地工作。如果你使用opencv 3.0,這可能是你可用的最好的跟蹤。 但是如果你使用更高版本,考慮kcf。
缺點:跟蹤失敗報告不可靠。不能從完全閉塞恢複。
kfc代表核心化相關濾波器。 這個跟蹤器建立在前兩個跟蹤器提出的想法。 該跟蹤器利用了這樣的事實,即在mil跟蹤器中使用的多個正樣本具有大的重疊區域。 這種重疊的資料導緻一些良好的數學特性,利用這個跟蹤器,使跟蹤更快,同時更準确。
優點:準确度和速度都比mil更好,它報告跟蹤失敗比boosting和mil更好。 如果您使用opencv 3.1和更高版本,我建議對于大多數應用程式使用這個。
缺點:不能從完全閉塞恢複。 未在opencv 3.0中實作。
bug警告:在opencv 3.1(僅限python)中有一個錯誤,因為傳回了不正确的邊界框。 參見錯誤報告。
tld代表跟蹤,學習和檢測。 顧名思義,該跟蹤器将長期跟蹤任務分解為三個元件 - (短期)跟蹤,學習和檢測。 從作者的論文,“跟蹤器跟蹤對象從一幀到幀。 檢測器定位到目前為止觀察到的所有外觀,并在必要時校正跟蹤器。 學習估計檢測器的錯誤并更新它以避免未來的這些錯誤。“這個跟蹤器的輸出往往會跳一下。 例如,如果你正在跟蹤行人,并且場景中還有其他行人,則該跟蹤器有時可以臨時跟蹤與您要跟蹤的行人不同的行人。 在積極的一面,這條軌道似乎在更大的規模,運動和遮擋下跟蹤物體。 如果你有一個視訊序列,其中的對象隐藏在另一個對象後面,這個跟蹤器可能是一個不錯的選擇。
優點:在多個幀的遮擋下工作最好。 此外,跟蹤最佳的規模變化。
缺點:很多誤報,使它幾乎不可用。
在内部,該跟蹤器在時間上向前和向後方向上跟蹤對象,并且測量這兩個軌迹之間的差異。 最小化該forwardbackward錯誤使它們能夠可靠地檢測跟蹤失敗并在視訊序列中選擇可靠的軌迹。
在我的測試中,我發現這個跟蹤器在運動是可預測和小規模的時候效果最好。 與其他跟蹤器不同,即使跟蹤明顯失敗,該跟蹤器知道跟蹤失敗的時間。
優點:優秀的跟蹤失敗報告。 當運動是可預測的并且沒有遮擋時工作得很好。
缺點:在大規模運動下失敗。
在跟蹤器類中的所有跟蹤算法中,這是基于卷積神經網絡(cnn)的唯一一種。 它也是唯一一個使用離線訓練模型,因為它比其他跟蹤器更快。 從opencv文檔,我們知道它“對視點變化,照明變化和變形是強大的”。 但它不能很好地處理遮擋。
bug警告:不幸的是,在寫這篇文章的時候,在使用goturn時有一個錯誤在opencv 3.2實作使程式崩潰。
<a href="https://promotion.aliyun.com/ntms/act/ambassador/sharetouser.html?usercode=lwju78qa&utm_source=lwju78qa">數十款阿裡雲産品限時折扣中,趕緊點選領劵開始雲上實踐吧!</a>
以上為譯文
<b>文章原标題《</b>object tracking using opencv (c++/python)<b>》,作者:</b><b>satya mallick</b><b>,譯者:tiamo_zn</b>