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