庖丁解牛TLD(三)——算法初始化
上一講我提到對(duì)于算法的初始化工作主要是在tldInit這個(gè)函數(shù)里實(shí)現(xiàn)的。主要分為如下幾大步驟,1)初始化Detector。2)初始化Trajectory。3)訓(xùn)練Detector
1)初始化Detector
其中bb_scan為掃描grid區(qū)域,該函數(shù)輸入為boundingBox,輸出為一系列的RectBox,是根據(jù)boundingBox的大小參數(shù)對(duì)待搜素區(qū)域選擇一系列的box作為備選的跟蹤區(qū)域,box的位置和尺度都有變化,和RectBox相應(yīng)的尺度。但RectBox有6個(gè)參數(shù),前4個(gè)分別為Rect的左上角坐標(biāo)(x1,y1)和右下角坐標(biāo)(x2,y2)。后兩個(gè)參數(shù)求大神解釋(PS:后來(lái)在fern函數(shù)里找到了解釋,分別為指向?qū)?yīng)尺度特征的指針位置、每一行box的數(shù)量——用在搜索鄰近box)!對(duì)于這個(gè)函數(shù)內(nèi)部我還有一個(gè)疑惑,就是對(duì)ntuples函數(shù)功能的使用,哎,怎奈Matlab語(yǔ)法都不熟悉,只能慢慢啃了,感覺(jué)作者這里就是把RectBox的左上角的所有可能的坐標(biāo)值傳入該函數(shù),得到左上角坐標(biāo)位置的全部組合(不知道理解對(duì)了沒(méi))。
接下來(lái)的工作時(shí)特征的初始化,是在tldGenerateFeature函數(shù)里實(shí)現(xiàn)的。這個(gè)函數(shù)相對(duì)獨(dú)立,作者這里為了產(chǎn)生效果較好的隨機(jī)特征真是煞費(fèi)苦心,輸入的參數(shù)有兩個(gè),一個(gè)是nTREE = 10,一個(gè)是nFEATURE = 13。輸出為nTREE組特征,每組特征為nFEATURE個(gè)點(diǎn)對(duì),每一個(gè)點(diǎn)對(duì)有4個(gè)參數(shù),分別兩點(diǎn)坐標(biāo)(x1,y1),(x2,y2),取值范圍為(0~1)其中第一個(gè)點(diǎn)的分辨率為0.1,還不太明白這樣設(shè)計(jì)的原因,待進(jìn)一步分析代碼,有高人指點(diǎn)一下更好。值得注意的是產(chǎn)生的點(diǎn)對(duì)不是橫坐標(biāo)相同x1 = x2,就是縱坐標(biāo)相同y1 = y2。這里用圖片顯示一組特征,線段的兩個(gè)端點(diǎn)
下一步工作為初始化detector。這個(gè)功能是用強(qiáng)大的fern函數(shù)寫(xiě)的,該函數(shù)有多個(gè)功能,根據(jù)傳入?yún)?shù)的標(biāo)志分別可以實(shí)現(xiàn)clear操作、init操作、update操作、evaluate操作、detect操作、get pattern操作。fern函數(shù)是用c寫(xiě)的,混合編程沒(méi)有弄的太明白,還沒(méi)能調(diào)試一下看看,只能看代碼猜。在初始化detector的工作里,用到的是init操作。
2)初始化Trajectory
這部分沒(méi)有什么要說(shuō)明的,都是些零碎的初始化工作,matlab里面對(duì)一些必要的變量開(kāi)辟一些空間和定義一些變量的值。具體分析Trajectory的工作的時(shí)候可以具體再分析
3)訓(xùn)練Detector
首先得到Target,作者注釋說(shuō)該Target只是用來(lái)顯示,有待我后續(xù)驗(yàn)證。得到Target要調(diào)用函數(shù)img_patch,img_patch函數(shù)是獲得一幅圖像中目標(biāo)區(qū)域box的像素信息patch。
接下來(lái)產(chǎn)生正樣本數(shù)據(jù)集,調(diào)用tldGeneratePositiveData。其中第二個(gè)參數(shù)為RectBox和box的重復(fù)區(qū)域比例信息,保存在overlap參數(shù)中,由函數(shù)bb_overlap得到。tldGeneratePositiveData函數(shù)首先根據(jù)overlap的比例信息選出重復(fù)區(qū)域比例大于60%并且前num_closet ?= 10個(gè)的最接近box的RectBox,相當(dāng)于對(duì)RectBox進(jìn)行篩選。并通過(guò)bb_hull函數(shù)得到這些RectBox的最大邊界。接下來(lái)的工作比較重要,要得到Pattern,調(diào)用的函數(shù)為tldGetPattern。初始化的工作就是對(duì)最接近box的RectBox區(qū)域得到其patch,然后調(diào)用tldPatch2Pattern將像素信息轉(zhuǎn)換為Pattern,具體的說(shuō)就是歸一化RectBox對(duì)應(yīng)的patch的size(放縮至patch_size = 15*15),將2維的矩陣變成一維的向量信息,然后將向量信息均值設(shè)為0,調(diào)整為zero mean and unit variance(ZMUV),這個(gè)過(guò)程調(diào)用函數(shù)tldPatch2Pattern實(shí)現(xiàn)。接下來(lái)處理RectBox最大邊界的模糊信息,再次用到img_patch函數(shù),但這次調(diào)用的函數(shù)有很大的不同,還沒(méi)太理解作者要做什么啊,怎么感覺(jué)還有平移旋轉(zhuǎn)矩陣都出來(lái)了,暈啦(求高人指點(diǎn))。該函數(shù)最后返回3個(gè)參數(shù),pX為處理后的RectBox最大邊界處理后的像素信息,pEx最近鄰的RectBox的Pattern,bbP0為最近鄰的RectBox。
然后再產(chǎn)生負(fù)樣本數(shù)據(jù)tldGenerateNegativeData。得到遠(yuǎn)離box(重復(fù)區(qū)域比例小于20%)的num_patches = 100個(gè)Pattern保存到nX中,隨機(jī)選中num_patches = 100個(gè)RectBox得到對(duì)應(yīng)的patch保存到nEx中。這里調(diào)用了fern(5),即該函數(shù)的get pattern操作。
接下來(lái)對(duì)負(fù)樣本進(jìn)行分類,分類到訓(xùn)練集Training Set和驗(yàn)證集Validation Set中去。
接下來(lái)使用Training Set進(jìn)行訓(xùn)練,先調(diào)用fern(2),更新,然后調(diào)用tldTrainNN最近鄰訓(xùn)練數(shù)據(jù)。
接下來(lái)評(píng)估驗(yàn)證集Validation Set的閾值。調(diào)用tldNN驗(yàn)證。
至此,初始化的工作基本完成,限于本人水平有限,只能先對(duì)函數(shù)有個(gè)大概的認(rèn)識(shí),深深覺(jué)得先要靜下心來(lái)把訓(xùn)練的算法搞清楚,再回過(guò)頭來(lái)再看一編代碼。
總結(jié)
以上是生活随笔為你收集整理的庖丁解牛TLD(三)——算法初始化的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 免费的大数据学习资料,这一份就足够
- 下一篇: 中国光谷·“华为杯”第十九届中国研究生数