首先是run_TLD 在其次就是tldExample 最後到了初始化函數tldInit
第一個比較關鍵的函數 bb_scan
將映像網格化,將圖片首先 SCALE = 1.2.^[-10:10];(21 個規格),在每個規格上打網格
這個函數有一個比較重要的方法
ntuples(就是重複) 因為網格上的點很多點有相同的X,或者Y 具體方法大家在matlab中調用一句ntuples([1 2],[1 2,3])看看答案就知道什麼意思了。
這個函數返回一個6*n的矩陣,這個矩陣每個列代表一個視窗。
1,代表視窗左上點X
2,代表視窗左上點y
3,代表視窗右下點X
4,代表視窗右下點Y
5,這種規格的編號
6,相同X的視窗數目
產生特徵點函數tldGenerateFeatures
就是產生一系列的隨機數 大概是(4*特徵個數)*樹的個數
初始化軌跡
記錄連續的圖片
訓練探測器
規格化和目標的相似性bb_overlap
將每個規格化視窗和目標視窗做運算得到相似性
公式:相交的面積/總面積(不相交則返回0.0)
注意矩陣運算返回一個向量,大小就是規格化的數目length(grid)
取出圖片的函數,當參數為4個時會進行變換img_patch
tldGeneratePositiveData產生正樣本資料
主要利用的是相似性來判定正負樣本既bb_overlap>閾值,則認為正樣本,反之亦然。
這裡主要就是有個編碼問題
隨機取出點比較大小進行編碼
for (int i=0; i<nFEAT; i++) {
index<<=1;
int fp0 = img[off[0]+bbox[0]];
int fp1 = img[off[1]+bbox[0]];
if (fp0>fp1) { index |= 1;}
off += 2;
}
(fern.cpp的measure_tree_offset)
這個函數返回一個pX代表編碼後的矩陣,pEx代表最靠近目標視窗的規格化視窗(這個視窗進行了處理可以用於後面的訓練),
最靠近目標視窗的規格化視窗
類似的負樣本情況。
fern(2,......)
開始訓練隨機樹
if (Y[I] == 1) {
if (measure_forest(x) <= thrP)//防止某個特徵占的比重太大
update(x,1,1);
} else {
if (measure_forest(x) >= thrN)
update(x,0,1);
void update(double *x, int C, int N) {
for (int i = 0; i < nTREES; i++) {
int idx = (int) x[i];
(C==1) ? nP[i][idx] += N : nN[i][idx] += N;
if (nP[i][idx]==0) {
WEIGHT[i][idx] = 0;
} else {
WEIGHT[i][idx] = ((double) (nP[i][idx])) / (nP[i][idx] + nN[i][idx]);//正樣本增加相應位置的權重,集後面的信賴度
}
}
}
訓練樣本產生一個正確的特徵集
tldTrainNN(pEx,nEx,tld)
tld.pex = [tld.pex(:,1:isin(2)) x(:,i) tld.pex(:,isin(2)+1:end)]; % 這個代碼就是通過隨機樹種產生比較高的規格化視窗在這些視窗放到正特徵集裡面
以後就可以拿這個和目標最比較來判斷目標視窗的位置