1. detector 檢測器的實現,2. 中值流跟蹤器的實現,3. 綜合器的實現,4. 學習模組的實現,
一、TLD算法簡介
TLD(Tracking-Learning-Detection)是英國薩里大學的一個捷克籍博士生ZdenekKalal在2012年7月提出的一種新的單目標長時間跟蹤算法。該算法與傳統跟蹤算法的顯著區別在於將傳統的跟蹤算法和傳統的檢測算法相結合來解決被跟蹤目標在被跟蹤過程中發生的形變、部分遮擋等問題。同時,通過一種改進的線上學習機制不斷更新跟蹤模組的“顯著特徵點”和檢測模組的目標模型及相關參數,從而使得跟蹤效果更加穩定、魯棒、可靠。
二、TLD framework
TLD是一個用於針對視頻中未知物體長期跟蹤的架構。簡單來說,TLD算法由三部分組成:跟蹤模組、檢測模組、學習模組。跟蹤模組是觀察幀與幀之間的目標的動向。檢測模組是把每張圖看成獨立的,然後去定位。學習模組將根據跟蹤模組的結果對檢測模組的錯誤進行評估,生成訓練樣本來對檢測模組的目標模型進行更新,避免以後出現類似錯誤。
TLD跟蹤系統最大的特點就在於能對鎖定的目標進行不斷的學習,以獲取目標最新的外觀特徵,從而及時完善跟蹤,以達到最佳的狀態。也就是說,開始時只提供一幀靜止的目標圖像,但隨著目標的不斷運動,系統能持續不斷地進行探測,獲知目標在角度、距離、景深等方面的改變,並實時識別,經過一段時間的學習之後,目標就再也無法躲過。
TLD技術採用跟蹤和檢測相結合的策略,是一種自適應的、可靠的跟蹤技術。TLD技術中,跟蹤器和檢測器並行運行,二者所產生的結果都參與學習過程,學習後的模型又反作用於跟蹤器和檢測器,對其進行實時更新,從而保證了即使在目標外觀發生變化的情況下,也能夠被持續跟蹤。
1. detector 檢測器的實現
檢測器包括三個:一是方差檢測器;二是隨機深林;三是最近鄰分類器;
step1 首先,輸入一幅圖,人工指定目標矩形框,然後通過在整幅圖上進行掃面視窗得到一堆圖像patch。
掃描視窗的實現:設定了21個尺度,在選定的目標矩形框大小基礎上,向上梯度10個,向下梯度10個。尺度梯度為1.2,每個梯度下都進行視窗掃描,步進為視窗大小(寬度和高度都是10%)的10%,獲取按照設定的掃描方式掃描得到整幅圖像的patch。當然大小也有限制,最小視窗尺寸為15x15。
step 2 從patch中得到用於訓練和測試的隨機深林和最近鄰分類器的樣本。
選擇的標準是從patch與目標矩形框的重疊度overleap,重疊度越大,越認為是正樣本,重疊度越小就認為是負樣本。具體的正樣本和負樣本見下圖:
對於最近鄰分類器,正樣本只有一個就是best_box,即我們認為選定的或者是TLD輸出的上一幀最好的結果。
step 3 方差分類器
利用平方積分圖IIimage和積分圖Iimage可快速計算任意patch的方差:var(patch) = IIimage(patch)-Iimage(patch)xIimage(patch)。方差小於best_box的方差50%的patch就直接淘汰。只有通過方差分類器的才能進入隨機森林
step 4 隨機深林的訓練和測試
這是隨機深林的訓練過程和測試過程:隨機深林的大小為10棵樹,樹的大小為13個節點,每個節點都是一個基於像素比較的decisionstump。Decisionstump就是一個閾值切割,大於則為1,小於則為0;
Decisionstump的構造是隨機的選取輸入patch中的兩點位置上的像素值進行比較,每棵樹之間的decisionstump選取的點是隨機的,同一顆樹上的decisionstump也是隨機的,所以稱之為隨機深林。但是,在隨機深林初始化後,forest的結構也就固定了,每次通過隨機深林時所對應的node節點上的decision stump是固定的,即每一幀上對應的同一棵樹上的同一個節點所代表的像素比較點的位置是固定的,因此才能進行後驗機率的學習。
首先是將通過方差檢測的圖像patch,分別輸入10棵樹上,樹的每個節點上進行一個特徵的decisionstump切割,最後每棵樹的輸出為一個13位的二進制編碼.
利用採集到的正樣本和負樣本對decisiontree的輸出二進制值的後驗機率進行學習:P(y|X)=pN/(pN+nN),有了這個我們就可以進行決策:10棵樹的P之和與設定的閾值相比較就可以進行決策。而學習的過程就類似一個perception,犯錯了才進P值的調整(犯了漏檢則增加pN,犯了誤檢則增加nN)。
y | 0 | 0 | …… | 0.7 | 1 |
X | 0 | 1 | …… | 2^13-2 | 2^13-1 |
比如,輸入的樣本為(X,1),但是卻小於閾值,被判定為負樣本,則說明對應的P太小,需要提高,因此對P(1|X)進行增大。
測試過程:
利用測試集輸入到訓練好的隨機深林中進行測試,主要是用來調整閾值。測試集都是負樣本,從而統計負樣本在隨機深林上的得分,取得分最高的作為閾值。(這樣所有的負樣本基本上是不可能通過隨機深林的)
step 5 最近鄰分類器的訓練和測試
最近鄰分類器實際上就是線上的模板匹配,將輸入的圖像patch,通過仿射變換轉變為15*15的patch,並進行0均值化,然後與線上的正樣本模板和負樣本模板進行匹配,計算對應的相關相似度和保守相似度。
最近鄰分類器訓練
最近鄰分類器的訓練過程其實就是更新線上模板的過程,如果輸入的patch為正樣本,但與線上的正、負模板pEx、nEx的相關相似度小於閾值,則分類錯誤,就將該輸入的patch放入線上正模板pEx中。如果輸入的patch為負樣本,但與線上的正、負樣本相關相似度大於閾值,則分類錯誤,就將該輸入的patch放入負樣本模板nEx中。效果就是動態地更新了線上模板
最近鄰分類器測試
最近鄰分類器的測試過程實際上跟隨機深林的測試過程一樣,為了調增對應的閾值,測試集全部是負樣本,選取負樣本中得到相關相似度最高的值作為最近鄰分類器的分類閾值。
2. 中值流跟蹤器的實現
TLD算法的跟蹤模組(Tracker),是一種在名為中值流跟蹤(Median-Flow tracker)的跟蹤方法基礎上增加了跟蹤失敗檢測算法的新的跟蹤方法。中值流跟蹤方法利用目標框來表示被跟蹤目標,並在連續的相鄰視頻幀之間估計目標的運動。
在TLD算法中,原作者將10*10的格子中的像素點作為初始特徵點,並利用金字塔LK光流法來在連續的相鄰視頻幀之間估計若干特徵點的運動。
跟蹤模組的跟蹤失敗檢測算法:
中值流跟蹤算法的前提假設是目標是可見的,所以當目標完全被遮擋或者消失於視野,則不可避免地出現跟蹤失敗。為了能夠解決這些問題,我們採用如下策略:
讓di表示其中某一個點的移動位移, dm表示位移中值,則殘差可定義為 |di-dm|。如果殘差大於10個像素,那么就認為跟蹤失敗。這個策略能夠很穩定地就確定出由劇烈移動或者遮擋所造成的跟蹤失敗。
·通過前向L-K金字塔光流法得到當前幀中與上一幀對應的特徵點points2。
·利用points2通過反向L-K金字塔光流法得到上一幀對應的特徵點FB_Points
·計算相似度similarity和錯誤匹配度FB_error
獲取points1和points2的10x10亞像素精度區域,並進行像素匹配,得到匹配度作為相似度的衡量。通過計算points1和FB_points之間的距離,並歸一化,作為錯誤匹配度的衡量。
·經過兩步篩選,得到保留下的特徵點
剔除50%相似度小的和50%錯誤匹配度大的特徵點
3. 綜合器的實現
綜合器(Integrator)把檢測器和跟蹤器得到的目標框予以綜合,並作為TLD最後的輸出。如果跟蹤器或者檢測器都沒有得到目標框,那么就認定當前幀中被跟蹤目標沒有出現的,否則,綜合器將具有最大保守相似度的圖像片作為最終的目標框所在位置。
1)先通過 重疊度 對檢測器檢測到的目標boundingbox進行聚類,每個類的重疊度小於0.5:clusterConf(dbb,dconf, cbb, cconf);
(2)再找到與跟蹤器跟蹤到的box距離比較遠的類(檢測器檢測到的box),而且它的相關相似度比跟蹤器的要大:記錄滿足上述條件,也就是可信度比較高的目標box的個數:if(bbOverlap(tbb, cbb[i])<0.5 && cconf[i]>tconf)confident_detections++;
(3)判斷如果只有一個滿足上述條件的box,那么就用這個目標box來重新初始化跟蹤器(也就是用檢測器的結果去糾正跟蹤器):if(confident_detections==1) bbnext=cbb[didx];
(4)如果滿足上述條件的box不只一個,那么就找到檢測器檢測到的box與跟蹤器預測到的box距離很近(重疊度大於0.7)的所以box,對其坐標和大小進行累加:
if(bbOverlap(tbb,dbb[i])>0.7)cx += dbb[i].x;……
(5)對與跟蹤器預測到的box距離很近的box和跟蹤器本身預測到的box進行坐標與大小的平均作為最終的目標boundingbox,但是跟蹤器的權值較大:
bbnext.x= cvRound((float)(10*tbb.x+cx)/(float)(10+close_detections));……
(6)另外,如果跟蹤器沒有跟蹤到目標,但是檢測器檢測到了一些可能的目標box,那么同樣對其進行聚類,但只是簡單的將聚類的cbb[0]作為新的跟蹤目標box
4. 學習模組的實現
Learning實際上就是重新組織正負樣本對隨機森林和最近鄰分類器進行訓練。訓練的方式跟上面講解的一樣。
什麼時候重新組織訓練呢?實際上只對有跟蹤結果參與的目標輸出進行訓練。
對新得到的當前幀的TLD目標輸出box進行最近鄰的檢測,得到與線上模型的正負模板的相關相似度,如果相關相似度比較小,或者方差比較小,或者已經在線上模型中了,就不用訓練學習了。否則就在該輸出的位置進行類似初始化時候的訓練一樣,隨機深林的後驗機率和最近鄰分類器的線上模板進行更新。當然就沒有了像初始訓練中的將數據集拆分為訓練集和測試集的過程了。