Video Target Tracking Based on Online Learning—TLD單目標跟蹤算法詳解


  • 視頻目標跟蹤問題分析        

        視頻跟蹤技術的主要目的是從復雜多變的的背景環境中准確提取相關的目標特征,准確地識別出跟蹤目標,並且對目標的位置和姿態等信息精確地定位,為后續目標物體行為分析提供足夠的數據。但是目前的絕大部分目標跟蹤算法或多或少存在不少缺點,如:1)對目標的實時跟蹤時,跟蹤時間過長,目標容易丟失;2)當目標發生形變時(目標偽裝、攝像平台變化導致),無法進行目標跟蹤;3)當視頻中目標消失(遮擋等)以后重新出現時,不能重新跟蹤捕獲目標,或出現混批; 4)有一些給定很少特定目標特征先驗知識時,也不能夠迅速地跟蹤目標。

  • 在線學習視頻目標跟蹤算法TLD

         對於長時間跟蹤而言,一個關鍵的問題是:當目標重新出現在相機視野中時,系統應該能重新檢測到它,並開始重新跟蹤。但是,長時間跟蹤過程中,被跟蹤目標將不可避免的發生形狀變化、光照條件變化、尺度變化、遮擋等情況。傳統的跟蹤算法,前端需要跟檢測模塊相互配合,當檢測到被跟蹤目標之后,就開始進入跟蹤模塊,而此后,檢測模塊就不會介入到跟蹤過程中。但這種方法有一個致命的缺陷:即,當被跟蹤目標存在形狀變化或遮擋時,跟蹤就很容易失敗;因此,對於長時間跟蹤,或者被跟蹤目標存在形狀變化情況下的跟蹤,很多人采用檢測的方法來代替跟蹤。該方法雖然在某些情況下可以改進跟蹤效果,但它需要一個離線的學習過程。即:在檢測之前,需要挑選大量的被跟蹤目標的樣本來進行學習和訓練。這也就意味着,訓練樣本要涵蓋被跟蹤目標可能發生的各種形變和各種尺度、姿態變化和光照變化的情況。換言之,利用檢測的方法來達到長時間跟蹤的目的,對於訓練樣本的選擇至關重要,否則,跟蹤的魯棒性就難以保證。       

        TLD(Tracking-Learning-Detection)是英國薩里大學的一個捷克籍博士生Zdenek Kalal在其攻讀博士學位期間提出的一種新的單目標長時間(long term tracking)跟蹤算法。該算法與傳統跟蹤算法的顯著區別在於將傳統的跟蹤算法和傳統的檢測算法相結合來解決被跟蹤目標在被跟蹤過程中發生的形變、部分遮擋等問題。同時,通過一種改進的在線學習機制不斷更新跟蹤模塊的“顯著特征點”和檢測模塊的目標模型及相關參數,從而使得跟蹤效果更加穩定、魯棒、可靠。

        簡單來說,TLD算法由三部分組成:跟蹤模塊、檢測模塊、學習模塊;如下圖所示

TLD算法機理

        上圖中TLD 算法由跟蹤、檢測和學習三大模塊構成。首先跟蹤模塊對視頻序列中要跟蹤的目標采用跟蹤器跟蹤,判斷物體目標在下一幀中的位置, 若目標消失在視頻或大量被遮擋,則跟蹤失敗;其次檢測部分主要由分類器構成,分類器通過對視頻序列中大量的特征值進行檢測歸類,找出其中最有可能出現跟蹤物體目標的區域,然后綜合跟蹤部分共同輸出決定下一幀中物體目標的方位,如果前面跟蹤部分失敗,檢測成功,則檢測部分就會重新初始化跟蹤部分, 在下一幀的時候,跟蹤模塊重新跟蹤成功目標。最后對於學習部分,跟蹤產生的結果和檢測產生的結果又會動態地影響到學習部分,反過來學習模塊又會訓練改善分類器影響檢測的結果。總之檢測模塊與學習模塊相互作用, 不斷地動態改善相關過程,提高對跟蹤目標的准確性。

  • TLD算法實現框圖及原理分析

        TLD的詳細實現框圖如下圖所示。

TLD實現框圖

        從此圖中可以看出,首先在視頻序列的初始位置,我們先對要跟蹤的物體進行相關目標標定,然后此目標位置進入跟蹤器中進行跟蹤,跟蹤的結果會反饋到學習模塊中,其次在學習模塊中由於初始視頻序列幀中存在要跟蹤物體特征,就可以作為正樣本,再通過相關方法選取些負樣本訓練檢測器,這樣在初始的時候檢測器和跟蹤器都有了相應的判決標准。接着就可以讓視頻序列流逐幀的通過檢測器和跟蹤器,當檢測器和跟蹤器得到跟蹤結果后,一方面通過綜合模塊輸出顯示在相應位置,另一方面,他們又會作用學習模塊,重新讓學習模塊訓練檢測器,始終保證檢測器中跟蹤目標的特征點在實時進行更新。在此過程中,學習模塊中存在一個在線模型其作用是匹配每次通過跟蹤器或檢測器的圖像片是否確實含有前景目標,其也是動態更新的。

        下面分解講述TLD算法框圖中跟蹤、檢測、學習和綜合模塊的實現原理。

-----------------------------------------------------跟蹤器---------------------------------------------

        TLD使用Median-Flow追蹤算法(光流跟蹤器)。假設一個“好”的追蹤算法應該具有正反向連續性(forward-backward consistency),即無論是按照時間上的正序追蹤還是反序追蹤,產生的軌跡應該是一樣的。作者根據這個性質規定了任意一個追蹤器的FB誤差(forward-backward error):從時間t的初始位置x(t)開始追蹤產生時間t+p的位置x(t+p),再從位置x(t+p)反向追蹤產生時間t的預測位置x`(t),初始位置預測位置之間的歐氏距離就作為追蹤器在t時間的FB誤差。

        在光流法中為了處理三維空間中的目標物體的問題,它先將運動目標從三維空間映射到二維平面上,計算像素運動的瞬時速度,然后根據圖像序列相鄰兩幀中像素點值在時域上的強度變化和相關性來確定圖像中物體目標運動到下一幀情況,最終發現目標運動信息。只需要知道給定若干追蹤點,追蹤器會根據像素的運動情況確定這些追蹤點在下一幀的位置。追蹤點的選擇:作者給出了一種依據FB誤差繪制誤差圖(Error Map)篩選最佳追蹤點的方法,但並不適用於實時追蹤任務,就不詳細介紹了。這里只介紹在TLD中確定追蹤點的方法。首先在上一幀t的物體包圍框里均勻地產生一些點,然后用Lucas-Kanade追蹤器正向追蹤這些點到t+1幀,再反向追蹤到t幀,計算FB誤差,篩選出FB誤差最小的一半點作為最佳追蹤點。最后根據這些點的坐標變化距離的變化計算t+1幀包圍框的位置大小(平移的尺度取中值,縮放的尺度取中值。取中值的光流法,估計這也是名稱Median-Flow的由來吧)。

        還可以用NCC(Normalized Cross Correlation,歸一化互相關)和SSD(Sum-of-Squared Differences,差值平方和)作為篩選追蹤點的衡量標准。作者的代碼中是把FB誤差和NCC結合起來的,所以篩選出的追蹤點比原來一半還要少。

NCC:

SSD:

-----------------------------------------------------學習模塊---------------------------------------------

 TLD使用的機器學習方法是作者提出的P-N學習(P-N Learning)。P-N學習是一種半監督的機器學習算法,它針對檢測器對樣本分類時產生的兩種錯誤提供了兩種“專家”進行糾正:(PN學習可參考http://blog.csdn.net/carson2005/article/details/7647519
                P專家(P-expert):檢出漏檢(false negative,正樣本誤分為負樣本)的正樣本;
                N專家(N-expert):改正誤檢(false positive,負樣本誤分為正樣本)的正樣本。

  樣本的產生:
        用不同尺寸的掃描窗(scanning grid)對圖像進行逐行掃描,每在一個位置就形成一個包圍框(bounding box),包圍框所確定的圖像區域稱為一個圖像元(patch),圖像元進入機器學習的樣本集就成為一個樣本。掃描產生的樣本是未標簽樣本,需要用分類器來分類,確定它的標簽。
        如果算法已經確定物體在t+1幀的位置(實際上是確定了相應包圍框的位置),從檢測器產生的包圍框中篩選出10個與它距離最近的包圍框(兩個包圍框的交的面積除以並的面積大於0.7),對每個包圍框做微小的仿射變換(平移10%、縮放10%、旋轉10°以內),產生20個圖像元,這樣就產生200個正樣本。再選出若干距離較遠的包圍框(交的面積除以並的面積小於0.2),產生負樣本。這樣產生的樣本是已標簽的樣本,把這些樣本放入訓練集,用於更新分類器的參數。下圖中的a圖展示的是掃描窗的例子。

        作者認為,算法的結果應該具有“結構性”:每一幀圖像內物體最多只出現在一個位置;相鄰幀間物體的運動是連續的,連續幀的位置可以構成一條較平滑的軌跡。比如像上圖c圖那樣每幀只有一個正的結果,而且連續幀的結果構成了一條平滑的軌跡,而不是像b圖那樣有很多結果而且無法形成軌跡。還應該注意在整個追蹤過程中,軌跡可能是分段的,因為物體有可能中途消失,之后再度出現。
        P專家的作用是尋找數據在時間上的結構性,它利用追蹤器的結果預測物體在t+1幀的位置。如果這個位置(包圍框)被檢測器分類為負,P專家就把這個位置改為正。也就是說P專家要保證物體在連續幀上出現的位置可以構成連續的軌跡
        N專家的作用是尋找數據在空間上的結構性,它把檢測器產生的和P專家產生的所有正樣本進行比較,選擇出一個最可信的位置,保證物體最多只出現在一個位置上,把這個位置作為TLD算法的追蹤結果。同時這個位置也用來重新初始化追蹤器

        比如在這個例子中,目標車輛是下面的深色車,每一幀中黑色框是檢測器檢測到的正樣本,黃色框是追蹤器產生的正樣本,紅星標記的是每一幀最后的追蹤結果。在第t幀,檢測器沒有發現深色車,但P專家根據追蹤器的結果認為深色車也是正樣本,N專家經過比較,認為深色車的樣本更可信,所以把淺色車輸出為負樣本。第t+1幀的過程與之類似。第t+2幀時,P專家產生了錯誤的結果,但經過N專家的比較,又把這個結果排除了,算法仍然可以追蹤到正確的車輛。

-----------------------------------------------------檢測模塊---------------------------------------------

        檢測模塊使用一個級聯分類器,對從包圍框獲得的樣本進行分類。級聯分類器包含三個級別,如下圖所示:

        圖像元方差分類器(Patch Variance Classifier)。計算圖像元像素灰度值的方差,把方差小於原始圖像元方差一半的樣本標記為負。論文提到在這一步可以排除掉一半以上的樣本。

        集成分類器(Ensemble Classifier)。實際上是一個隨機蕨分類器(Random Ferns Classifier),類似於隨機森林分類器(Random Forest:參考:http://www.cnblogs.com/liuyihai/p/8309019.html),區別在於隨機森林的樹中每層節點判斷准則不同,而隨機蕨的“蕨”中每層只有一種判斷准則。

        如上圖所示,把左面的樹每層節點改成相同的判斷條件,就變成了右面的蕨。所以蕨也不再是樹狀結構,而是線性結構。隨機蕨分類器根據樣本的特征值判斷其分類。從圖像元中任意選取兩點A和B,比較這兩點的亮度值,若A的亮度大於B,則特征值為1,否則為0。每選取一對新位置,就是一個新的特征值。蕨的每個節點就是對一對像素點進行比較。
        比如取5對點,紅色為A,藍色為B,樣本圖像經過含有5個節點的蕨,每個節點的結果按順序排列起來,得到長度為5的二進制序列01011,轉化成十進制數字11。這個11就是該樣本經過這個蕨得到的結果。

 

        同一類的很多個樣本經過同一個蕨,得到了該類結果的分布直方圖。高度代表類的先驗概率p(F|C),F代表蕨的結果(如果蕨有s個節點,則共有1+2^s種結果)。

不同類的樣本經過同一個蕨,得到不同的先驗概率分布。

        以上過程可以視為對分類器的訓練。當有新的未標簽樣本加入時,假設它經過這個蕨的結果為00011(即3),然后從已知的分布中尋找后驗概率最大的一個。由於樣本集固定時,右下角公式的分母是相同的,所以只要找在F=3時高度最大的那一類,就是新樣本的分類。

 

用一個蕨進行分類會有較大的偶然性。另取5個新的特征值就可以構成新的蕨。用很多個蕨對同一樣本分類,投票數最大的類就作為新樣本的分類,這樣在很大程度上提高了分類器的准確度。

  最近鄰分類器(Nearest Neighbor Classifier)。計算新樣本的相對相似度,如大於0.6,則認為是正樣本。相似度規定如下: 圖像元pi和pj的相似度,公式里的N是規范化的相關系數,所以S的取值范圍就在[0,1]之間,

正最近鄰相似度,

負最近鄰相似度,

相對相似度,取值范圍在[0,1]之間,值越大代表相似度越高,

所以,檢測器是追蹤器的監督者,因為檢測器要改正追蹤器的錯誤;而追蹤器是訓練檢測器時的監督者,因為要用追蹤器的結果對檢測器的分類結果進行監督。用另一段程序對訓練過程進行監督,而不是由人來監督,這也是稱P-N學習為“半監督”機器學習的原因。

-----------------------------------------------------綜合模塊---------------------------------------------

        綜合模塊是跟蹤、檢測結果匯總輸出。檢測模塊會影響到跟蹤模塊的最終結果,沒有跟蹤到目標也有可能最終通過檢測模塊得到目標框,跟蹤模塊和檢測模塊共同定位輸出的跟蹤目標框位置。

        上圖 TLD 算法綜合模塊的處理框架。首先, 求得所有通過的檢測模塊(就是成功通過三大分類器后的)的矩形框兩兩之間的重疊度和其相似度, 然后將重疊度和相似度進行聚類[32]得到聚類后的重疊度與相似度,將此結果保存;其次,求出跟蹤模塊的重疊度與相似度,將結果予以保存。最后對兩個結果進行比對,綜合相關條件進行判斷,從而輸出最后定位的目標框位置。

        綜合模塊將跟蹤與檢測模塊的結果予以匯總判斷, 完成定位跟蹤目標的邊界框。按照檢測模塊能否檢測成功,跟蹤模塊是能否跟蹤成功的原則, 兩兩進行組合。會有四種情況, 即就是跟蹤成功檢測成功; 跟蹤成功檢測失敗; 跟蹤失敗檢測成功;跟蹤失敗檢測失敗。 下面分別對四種情況一一分析:
        (1) 跟蹤成功檢測成功
        檢測成功指的是至少有一個滑動窗口通過檢測模塊,所以根據通過通過檢測的滑動窗口數量,分為三種情況考慮。一是,如果通過后只有一個矩形框,不進行聚類,直接計算相關相似度,得到的信息直接進入信息綜合判定處。二是,如果通過后有兩個矩形框,則首先計算兩個矩形框的重疊度,再計算相似度,最后將他們的結果聚類輸出到信息綜合判定處。三是, 如果通過后的矩形框多於兩個,則分別計算窗口兩兩之間的重疊度,按照重疊度與閾值的關系將其分為多個等價類。為了便於理解,特舉一實例。如果此時通過檢測模塊后有七個矩形框,通過計算兩兩間的重疊度並與閾值相比較,發現 1,2,3 是一類計為 A 類, 4,5 是一類計B 類, 6,7 是一類計為 C 類,這個過程就完成了聚類。然后統計出 A 類、 B 類、C 類的相關信息,如坐標信息,高度、寬度,保守相似度等。對於每一種類型信息求其平均值作為最終的參數值保存輸出到信息綜合判定處。另一方面,跟蹤模塊也有通過的矩形框。計算通過檢測模塊的矩形框與通過跟蹤模塊的矩形框的重疊度。如果重疊度很小但是通過檢測模塊矩形框的保守相似度大於通過檢測模塊矩形框的保守相似度,這時候認為尋找成功了一個聚類中心離跟蹤模塊得到的矩形框距離較遠但是比跟蹤模塊更加可信。這時候重新用檢測模塊的那個矩形框的參數重新初始化跟蹤器,並輸出定位目標。如果重疊度很大則將通過檢測模塊的矩形框和通過跟蹤模塊的矩形的信息值按照權位值累加方式
求其平均值,其中跟蹤模塊占據的比重大,檢測模塊占據的比重小,即就是檢測模塊輔助糾正跟蹤模塊定位的矩形框。總之,如果有跟蹤到目標框並檢測到目標框,那么對檢測到的結果聚類得到相關輸出結果,判斷聚類中心與跟蹤器的重疊率和可信度,如果兩者重疊度低且檢測模塊的可信度更高,那么用檢測模塊的結果修正跟蹤模塊的結果,也即用檢測器修正跟蹤器;如果重疊率接近,那么用檢測器和跟蹤器結果加權平均得到結果作為最終輸出結果,其中跟蹤器的權重更大。

        (2) 跟蹤成功檢測失敗
        如果特征矩形框通過模塊跟蹤后,跟蹤成功。但是檢測器分類后沒有矩形框,這時候認為跟蹤成功,直接將跟蹤成功的矩形框輸出作為最終的定位目標框的參數。
        (3) 跟蹤失敗檢測成功
        如果跟蹤模塊跟蹤失敗,但是通過檢測模塊有至少一個矩形框檢測成功。 將檢測模塊的矩形框進行聚類,如果最終聚類的結果只有一個聚類中心,則用此聚類的結果重新初始化跟蹤模塊,並將聚類的結果作為定位輸出結果。如果聚類中心有多個,說明雖然通過了檢測器,但是有多個不同的位置,也認為檢測失敗,
不輸出結果。
        (4)跟蹤失敗檢測失敗
         如果跟蹤和檢測模塊均失敗了,則認為此次檢測之間無效,丟棄。綜上所述,對於綜合模塊,其實就是用跟蹤模塊和檢測模塊的結果進行綜合考慮,前提是檢測器有檢測到目標框的結果,對目標框進行聚類得到聚類結果,然后根據跟蹤器的結果的情況來分析: 如果根據模塊跟蹤的結果存在存在,觀察跟蹤模塊與檢測模塊聚類后的重疊率,如果重疊率低但是檢測模塊的可信度高,用檢測模塊聚類后的結果去修正跟蹤模塊的參數;如果重疊率接近,將跟蹤模塊的結果和檢測模塊聚類后加權平均得到當前幀跟蹤結果的輸出結果,但是跟蹤器權重較大;如果跟蹤模塊沒有跟蹤到目標框,看檢測模塊中聚類結果是否只有一個中心,是則以其為當前幀跟蹤結果,如果不只一個中心則將聚類結果丟棄,當前幀沒有跟蹤到 。

  • TLD算法單目標跟蹤應用實例圖

  • TLD算法單目標跟蹤源代碼匯總

1. 原作者 Zdenek Kalal

 作者主頁: http://info.ee.surrey.ac.uk/Personal/Z.Kalal/

 源代碼頁: https://github.com/zk00006/OpenTLD

 源代碼解釋:http://www.cnblogs.com/liuyihai/p/8320279.html

 編程語言:Matlab + C

 

2. Alan Torres版

 源代碼頁:https://github.com/alantrrs/OpenTLD

實現語言:C++

 

3. arthurv版

 源代碼頁:https://github.com/arthurv/OpenTLD

 實現語言:C++

 注:和上面的沒有發現任何區別

 

4. jmfs版

 源代碼頁:https://github.com/jmfs/OpenTLD

 實現語言:C++

 注:和上面兩個沒有區別,只不過加入了VS2010工程文件,理論上可以直接在Windows下編譯通過。不過opencv檢測不到作者的webcam(!!!),所以他用了另一個VideoInput類來handle攝像頭輸入。

 

5. Georg Nebehay版 

 源代碼頁:http://gnebehay.github.com/OpenTLD/

 注1:這個的好處是提供可執行文件下載(Ubuntu 10.04和Windows)。BUT, as you would expect,基本上到了你的機器上都跑不了。還是自己老老實實build吧。

 注2:這個版本需要安裝Qt。不過好像作者關掉了Qt的選項(相關代碼還在),所以可以編譯,但無法顯示結果

 注3:CSDN下載上有個“openTLD Qt 版“,就是這個版本。不過加了VS的工程文件---在我的機器上還是不能PnP, don't bother

 http://download.csdn.net/download/muzi198783/4111915

  

6. Paul Nader版(又一個Qt 版!)

 QOpenTLD: http://qopentld.sourceforge.net/

 源代碼頁: http://sourceforge.net/projects/qopentld/

 注1:需要OpenCV和Qt。 原系統要求Qt 4.3.7OpenCV 2.2。

 注2:Windows和Linux下都提供了編譯工程或makefile。估計也是唯一一個移植到Android平台下的TLD!

 

7. Ben Pryke版(又一個student project!)

 源代碼頁:https://github.com/Ninjakannon/BPTLD

 注:依然是Matlab+C/C++的混合實現。亮點是有很詳細的Documentation(8頁),介紹了算法的理解和實現細節。可以幫助理解原算法

 

  • TLD算法參考文獻

 

  • TLD視頻目標跟蹤演示視頻

     智能監控--人臉追蹤演示: http://www.miaopai.com/show/-jjAqUFr2mGP5VKdDZtarPtQy2WGFb3ypx-WXA__.htm

 

     動物狀態監視--跟蹤熊貓:http://www.miaopai.com/show/Y0LaonMwB79BBH9w6xUyA2qa1FfHafpEUjzJKg__.htm

 

    無人作戰--跟蹤航拍小車:http://www.miaopai.com/show/Ty1j4VhViUuVDx7R5-JWGbmexh0cr6t-gTtf7A__.htm

 

    能力測試--特定弱小目標跟蹤:http://www.miaopai.com/show/CvDoyN2UFW-VXojMERQyE6MTkOY-0Cpa2vfkfQ__.htm

 

  • TLD算法安裝及運行答疑

      聯系:liuyihai@126.com       liuyihai@aliyun.com

  • 博文預告

 下一篇博文將詳細講述將TLD算法用於視頻多目標跟蹤情形-----歡迎閱讀


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM