[水文]基於語義的物體檢測筆記

版權聲明:本文爲博主原創文章,未經博主允許不得轉載

很早之前寫的個人筆記,主要是對這個工程不理解的地方的註釋“from rigid templates to grammars : object detection with structured models“。不是一篇介紹性的文章。論文作者的工程在http://people.cs.uchicago.edu/~rbg/latent/

1. 語法

1.1 bag grammar

這裏寫圖片描述

1.2 更正式的定義

這裏寫圖片描述

1.3 位置

加上位置後,對於物體檢測,一幅圖片的位置可以用(x,y,l)來表示,x代表橫座標,y代表縱座標,l代表圖像金字塔的層數
這裏寫圖片描述

1.4 物體分解

根據以上的定義,我們可以講一個物體分解成以下形式,其中subtype舉個例子來說就是人有站着,坐着,躺着各個不同的模型,Y是代表不同的parts,人可以分解成臉,軀幹,手腳等。其中人就是一個non-teminla symbol,臉也是,因爲可以分解成了眼睛等,手腳可以當成一個Terminal symbols.
這裏寫圖片描述

這裏寫圖片描述

1.5 濾波器

評價一個Terminal symbols,我們可以用一個濾波器,A是teminal symbol.
這裏寫圖片描述
所以對評價一個普通語法,只要把所有的Terminal symbols的分數相加。alpha是一個bias,可以理解成先驗,這條規則的代價
這裏寫圖片描述

1.6 變形語法 isolated deformation grammars.

打個比方,每個人眼睛相對於臉的位置大概位置是差不多,但畢竟都不是一樣。當我們的partfilter找到眼睛,但是連臉比較遠,我們就得給一個懲罰,否則就會有falsepostive.
首先定義一個操作
這裏寫圖片描述
上面的語法第一條就是structural rule,下面的就是一個deformation rule
這裏寫圖片描述
一個derivation tree 實例
這裏寫圖片描述

1.7 detection with grammar models[5]

int(T)代表樹的中間節點,leaf代表葉子節點,score就是對應濾波器的分
z不是特別懂,可以理解成各個T,NT的的位置信息的變量
這裏寫圖片描述
beta的含義,omega程序中取的是[0.01 0 0.01 0]
這裏寫圖片描述
這個問題可以用動態規劃來計算。
① 先對數的NT進行後序遍歷
② 從前面的節點也就是從數的最小面的NT計算分。迭代算到root node就完事。
計算以上的一般把變形限制在4個HOG cell中(cascade程序中有更快的算法)

2 物體檢測的HOG特徵

2.1 Hog 參數

爲了訓練濾波器,採用HOG[6]特徵,cell 爲8*8,一個block 4個cell

2.2 直方圖統計

對於每個cell,360°(20°一個區間,總共10個區間)統計之內的每個像素梯度的幅值,方向。每個像素的幅值對所處的周圍4個CELL雙線性插值,程序中的block代表cell
這裏寫圖片描述

2.3 歸一化

採用4個block同時歸一化
一個cell帶有32維的向量 前18個對應歸一化的18個方向,接着9個是把對角的方向直接相加再歸一化,然後4個是18個方向全部相加分別用其中的一個block歸一。最後一維是備用的,爲了處理image boundarytruncation features 還沒理解透,以後再寫
這裏寫圖片描述

這裏寫圖片描述
有一部分用到非極大值抑制,但沒邊緣檢測那麼煩,其實就是取最大值,而忽略其他的邊緣檢測非極大值抑制http://bbs.csdn.net/topics/370004267

3 SVM-LSVM-WLSVM

3.1 普通的SVM

網上有很多介紹,比如http://blog.csdn.net/v_july_v/article/details/7624837

3.2 SSVM

3.2.1 問題描述[1]

這裏寫圖片描述

3.2.2問題轉化

通過經驗損失函數來度量[2]

這裏寫圖片描述

加入鬆弛因子

這裏寫圖片描述

由於我們的損失誤差典型的都是非凸,不連續的函數,再次轉換[3]

這裏寫圖片描述

3.3 LSVM

直接給結論了,具體的推導忘了的話再看論文[3]
這裏寫圖片描述

3.4 WLSVM[5]

定義如下。Lmargin程序中採的值樣本正確就爲0,否則爲1.Loutput的檢測框與實際框重疊率大於0.7則爲0,否則爲無窮。重疊率定義爲(A∩B)/(A∪B)。它的意義論文討論了一些,但不是很理解,最不能理解的是Loutput的位置爲什麼在那。怎麼從平均風險推到這個式子,等以後基礎再好點再來推推.
這裏寫圖片描述

4 訓練

(4.1) 檢測框大小選擇

由用戶指定model的個數n,人有站着,躺着,訓練數據庫中是把一幅圖片中的人用框畫出來,所以對於不同的模型他們的長寬比有 區別的 。所以按照比例的大小排列分成n份。對其中的每一份訓練一個filter.爲了濾波器與訓練集的框重疊率比較高,選的是從小到20%處的大小。

(4.2)數據準備等

(4.2.1)讀入數據

爲每個正樣本創建一個左右翻轉的圖片。如果正樣本有232,則加上翻轉的464

(4.2.2)正樣本扣圖

假設濾波器大小爲fsize7*11,則將圖像中正樣本的圖扣出,並用雙先線性插值縮放爲(fsize+2)*sbin.(sbin 默認爲8*8,一個cell的大小)。+2是求HOG特徵歸一化所要用的 warpos.m

(4.2.3) 對扣的圖求HOG特徵 feature.cc
(4.2.4)左右視圖聚類 Kmeans聚類,每次只處理一個樣本。lrspilt.m

處理完後爲了防止局部最優解進行一個內循環,交換一個視圖和相應的翻轉圖看是否目標值降低

(4.2.5) 訓練前準備 內存準備,模型準備等。train.m及fv_cache中的c++文件

一個rootfilter現在包括7*11*32+1+3維的元素,其中的1是offset也就是bias,3是location(x,y,l).但是location是不用學習,所以學習的參數是2464+1。C是0.001

(4.2.6) 正樣本包裝-train.m->poswarp 把太小的正樣本剔除,並加入一個不可信的entry。特徵值爲空.兩者組成一個正樣本。關鍵的標籤是。loss就是los_margin.

很重要的一點,以前沒注意到的就是在這裏把bias加入到了feature中,
feat = [model.features.bias;feat(:)];%train.m 480行初始值爲10
第一個
is_belief = 1;
is_mined = 0;
loss = 0;
第二個
loss = 1;
is_mined = 0;
is_belief = 0;

(4.2.7)負樣本挖掘 train.m->negrandom

按照內存的限制和樣本個數的數據,在沒有圖片中取負樣本。同上,需要加入一個空項。由於我們的目標對於負樣本w*f應該是越低越好,所有空項是可信的
帶特徵的:
is_belief = 0;
is_mined = 1;
loss = 1;
空特徵的
loss = 0;
is_mined = 1;
is_belief = 1;

(4.2.8) CCCP轉化爲slave problem
(4.2.9) LBFGS擬牛頓法求解slave problem minConf_TMP.m

梯度法收斂速度慢,又由於變量非常多,所以使用
步驟爲先求目標函數的梯度,然後利用LBFGS求方向,最後利用線性搜索確定步距,完成一次迭代。具體參考lbfgsUpdate.m,lbfgs.m, http://en.wikipedia.org/wiki/L-BFGS

(4.2.10) 上一步求解slave problem還有一個比較重要的問題就是w的歸一化。在迭代期間怎麼使其訓練出來的w*f具有可比性,就需要歸一化。實驗表明採用softmax(公式有點類似於邏輯迴歸)效果比較好。在obj.cc gradient函數中
(4.2.11) 設置這個樣本的閾值。w訓練好後,可以求每個正樣本的score,取從小到大5%處的值爲閾值modle_thresh.
(4.2.12) 由於在初始化root_filter不做hard_negtive mining,先不介紹。
(4.2.13) 由於存在左右視圖,加入一個flipped root_filter.

4.3 爲root_filter進行全局訓練。

外循環
—這次訓練有一些不同。除了CCCP的最後一步每次迭代的負樣本採用很少的200.每次跌代(默認4次)

※1 求正樣本的損失

  pos_vals = info.scores(F);
  hinge = max(0, 1-pos_vals);
  pos_loss(t,1) = C*sum(hinge);

※2增加新的正樣本train.m->poslatent

(1)剔除小的樣本
(2)把帶有正樣本整個讀入
(3)扣圖,但這次是將圖中帶框的正樣本作爲一個整體取出,並pad一個比較大的邊界(所有框最大的長的一半和最大寬的一半,不一定是同一個框的)
(4)爲gdetect_pos.m做一些事先的處理在gdetect_pos_prepare.m
(4.1)特徵金字塔
分爲兩個部分,前5層和後五層。1-5層的圖片的大小爲原來的大小2^[(i-1)/5]。每層的特徵在對變小的圖片取HOG特徵,Cell變成原來的一半。6-10層與1-5層相應的圖片大小一直,但HOG的CELL大小與原來的8保持一致。並在這裏利用了HOG預留的第32維的信息,爲特徵加了一個檢測框大小邊界,如果是邊界並在32標識了1,讓機器去自動學習參數

       td =model.features.truncation_dim;%32
               for i = 1:pyra.num_levels
                 % wide border around thefeature map
                pyra.feat{i} =padarray(pyra.feat{i}, [pady+1 padx+1 0], 0);
                % write boundary occlusionfeature
                pyra.feat{i}(1:pady+1, :, td) =1;
                pyra.feat{i}(end-pady:end, :,td) = 1;
                pyra.feat{i}(:, 1:padx+1, td) =1;
                pyra.feat{i}(:, end-padx:end,td) = 1;
               end

(4.2)爲了方便計算先判斷每一層上是否有與檢測框overlap大於0.7的位置。因爲對於WLLSVM問題損失函數Loutput不大於0.7則爲無窮,所以達不到這個要求的肯定就不是一個候選解
(4.3)計算動態規劃表。如果在第二步中的其中一層達不到上述要求就可以直接跳過了。gdetect_dp.m
a 先計算特徵金字塔在當前兩個root_filter下的所處不同位置下的值(卷積)fconvsse.cc.這樣我們就得到兩個二維表對應於兩個root_filter在相應位置所得到的分數,當然,兩個表要設置成同樣大小

b 後續遍歷推導樹的NT節點。從底層算到根節點。對於一個NT有structural_rule和deformation rule.它的分數包括rule的分數,它字節點NT的分數,還有它子節點T關聯的濾波器的分數。

c 變形規則,rootfilter無效,只對partfilter有效,先提下,後面在patrfilter就直接套用這個了。 插一個知識點。爲了檢測小物體,雖然HOG做了歸一化,對於不同大小的cell的分數有一定的可比性,但實驗表示小物體的整體分數整體偏低。所以加入一個locationfeature function ,參看博士論文2.3.3
score{i} = score{i} + bias +loc_scores(i);
爲了減少計算量,我們把變形限定在特徵圖像中的正負4個CELL中,也就是9*9個CELL範圍。bounded_dt.cc.對應於每一層score表,每一個位置存的是當前點如果變形,那麼在9*9範圍內評分最高的分,並用X,Y維當前點對應最高點的位置信息。變形的損失是[0.01 0 0.01 0】*[x’^2 x’ y’^2 y’].x’,y’表示最高分點與當前點的距離。 至此,我們得到一個變形的score表

d 結構規則 (對於下取樣還沒怎麼懂在gdetect_dp.m70行),右邊的score包括structuralrule 右邊所有節點的分
score{i} = score{i} + bias +loc_scores(i);

e 因此我們就可以自底向上得到所有NT的score表

f 爲了是overlaps表與score保持一直,再計算一次overlap compute_overlaps.m

(4.4)Compute belief and loss adjusted detections for a foreground example gdetect_pos.m
a 將語法起點的所有規則的score表中,只要當前位置overlap<0.7,則分數設爲負無窮apply_l_output,並把起點的第一條規則的分數取成所有規則的最高分。

b gdetect_parse.m Compute the set of detections from the dynamic programming tables stored
從所有層中選擇一個最大的(爲了提高計算速度,先可以用一個低的閾值濾到大多數的負無窮點),然後解析語法樹get_detection_trees.cc(Compute detection windows, filter bounding boxes, and derivation trees.找到最高分rule,並找到變形的各個濾波器位置ds存放的是NT的x1,y1,x2,y2,rule,節點的score。bs是全局的位置和變形物體的位置,rule,score

(4.5)內循環迭代3次 hardnegtive
除了最後一次,在200幅圖片中檢測負樣本中閾值>-1的hardnegtive用當前的正樣本和負樣本使用LBFGS求解w。收斂或者超出迭代推出

(4.6)備註:每次外迭代都會將之前的正樣本清空,負樣本使用的都是都是前面的200幅圖像,外循環3次,內循環4次

4.4 模型合併

將上一步訓練的躺着的模型,站的這模型合併成一個模型。參看model_merge.m.像上面一樣外循環1次,內循環5次,但這個不再是侷限與200張負圖片,而是面向所有的max張負圖片

4.5 partfilter訓練

初始化 一個partfilet是6*6個cell大小的濾波器,並帶有位置信息(x,y,scale).由於已經得到了root_filter.因此在root_filter中找n個(默認是6個parfilter)能量最高的地放,初始化濾波器。更新就是將他的參數合併到root_filter的濾波器的參數中,並重新訓練。partfilter由於是個NT,它帶有一個變形語法。同上面用動態規劃訓練。

5檢測

其實原理和訓練的部分相同。看懂了訓練,也就知道了檢測

參考

[1] Structured Support VectorMachines Sebastian Nowozin andChristoph H. Lampert
[2]http://bubblexc.com/y2011/503/
[3] learing structural SVMswith Latent Varialbles
[4] object detection grammars
[5] from rigd templates togrammars:object detection with structured models.
[6] histograms of orientedgradients for human detection

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章