1. 程式人生 > >目標檢測(Object Detection)原理與實現

目標檢測(Object Detection)原理與實現

基於形變部件模型(Deformable Part Models)的目標檢測

        上節說了基於cascade的目標檢測,cascade的級聯思想可以快速拋棄沒有目標的平滑窗(sliding window),因而大大提高了檢測效率,但也不是沒缺點,缺點就是它僅僅是個很弱的特徵,用它做分類的檢測器也是弱分類器,僅僅比隨機猜的要好一些,它的精度靠的是多個弱分類器來實行一票否決式推舉(就是大家都檢測是對的)來提高命中率,確定分類器的個數也是經驗問題。這節就來說說改進的特徵,儘量使得改進的特徵可以檢測任何物體,當然Deep Learning學習特徵很有效,但今天還是按論文發表順序來說下其他方法,(伺服器還沒配置好,現在還不能大批跑Deep Learning ^.^),在第四節說了ASM並且簡單的提了下AAM,這兩個模型其實就是形變模型(deform model),說到基於形變模型檢測物體的大牛,就不得說說芝加哥大學教授Pedro F. Felzenszwalb,Pedro發表很多有關基於形變部件來做目標檢測的論文,並靠這個獲得了VOC組委會授予的終身成就獎,另外它早期發表的《Belief propagation for early vision》也很出名,雖然比不上Science那樣的開闢新領域的Paper,但在不犧牲精度的情況下大大提高了BP演算法的執行效率,這個BP演算法不是神經網路的BP演算法,而是概率圖模型裡的推理求解方法(最大後驗概率),它也被用在了後面要說基於霍夫推理的目標檢測。貌似Pedro很擅長做這種事情,他的另外一篇論文《Cascade Object Detection with Deformable Part Models》也是不犧牲精度的情況下把基於形變部件做目標檢測的效率提高了20倍,今天就來學習一下這種基於形變部件的目標檢測。

        基於形變部件的目標檢測是現在除了深度學習之外的還相對不錯的目標檢測方法,先來看下為什麼要使用形變部件,在(圖一)中,同一個人的不同姿態,試問用前面幾節中的什麼方法可以檢測到這些不同姿態的人?閾值不行,廣義霍夫變換行嗎?人的姿態是變換無窮的,需要太多的模板。霍夫森林投票?貌似可以,但是霍夫森立的特徵是影象塊,只適用於一些形變不大的物體,當影象塊內的形變很大時同樣不太適用。那麼ASM可以嗎?想想也是和廣義霍夫變換一樣,需要太多的均值模板。歸根結底就是我們沒有很好的形狀描述方法,沒有好的特徵。而Pedro幾乎每發表一篇論文就改進一下形狀描述的方法,最終由簡單的表示方法到語法形式的表示方法,其演化過程可以在參考文獻[4]中看出,參考文獻[4]是Pedro的博士論文。


(圖一)

        既然上節中的幾種方法都不能解決大形變目標的檢測問題,那基於形變部件的目標檢測也該上場了。Pedro的五篇關於目標檢測的頂級paper,小生就不一一說了,挑參考文獻中的三篇學習一下。參考文獻[1]、[2]、[3]分別講述瞭如何利用形變模型描述物體(特徵階段)、如何利用形變部件來做檢測(特徵處理+分類階段)、如何加速檢測。首先來說下文獻[1]的形變部件。在Deformable Part Model中,通過描述每一部分和部分間的位置關係來表示物體(part+deformable configuration)。其實早在1973年,Part Model就已經在 “Therepresentation and matching of pictorial structures” 這篇文章中被提出了。

(圖二)

         Part Model中,我們通過描述a collection of parts以及connection between parts來表示物體。(圖二)表示經典的彈簧模型,物體的每一部分通過彈簧連線。我們定義一個energy function,該函式度量了兩部分之和:每一部分的匹配程度,部分間連線的變化程度(可以想象為彈簧的形變數)。與模型匹配最好的影象就是能使這個energy function最小的圖片。形式化表示中,我們可以用一無向圖 G=(V,E) 來表示物體的模型,V={v1,…,vn} 代表n個部分,邊 (vi,vj)∈E 代表兩部分間的連線。物體的某個例項的configuration可以表示為 L=(l1,…,ln),li 表示為 vi 的位置(可以簡單的將圖片的configuration理解為各部分的位置佈局,實際configuration可以包含part的其他屬性)。給定一幅影象,用 mi(li) 來度量vi 被放置圖片中的 li 位置時,與模板的不匹配程度;用 dij(li,lj) 度量 vi,vj 被分別放置在圖片中的 li,lj位置時,模型的變化程度。因此,一副影象相對於模型的最優configuration,就是既能使每一部分匹配的好,又能使部分間的相對關係與模型儘可能的相符的那一個。同樣的,模型也自然要描述這兩部分。可以通過下面的(公式一)描述最優configuration:

(公式一) 

        優化(公式一)其實就是馬爾科夫隨機場中的經典問題求解,可以用上面說的BP演算法求解。說的理論些就是最大化後驗概率(MAP),因為從隨機場中很容易轉換到概率測度中(gibbs measure),在這就不說那麼複雜了,想系統的學習相關理論可以學習概率圖模型(probabilistic graphical model)。識別的時候採用就是採用部件匹配,並且使得能量最小,這有點類似於ASM,但是ASM沒有使用部件之間的關係,只是單純的讓各匹配點之間的代價和最小。匹配結果如(圖三)所示:

(圖三)

       上面的方法沒有用到機器學習,另外部件的尋找也不是一件容易的事情,因為首先要大概預估部件的位置,因此這個方法也有缺點,但這個形變部件的思想可以用來作為特徵,接著就來看下Pedro的第二篇文獻[2]如何用它來做目標檢測。

Pedro在文獻[2]中基於形變模型的目標檢測用到了三方面的知識:1.Hog Features 2.Part Model 3. Latent SVM。

1.      作者通過Hog特徵模板來刻畫每一部分,然後進行匹配。並且採用了金字塔,即在不同的解析度上提取Hog特徵。

2.      利用上段提出的Part Model。在進行object detection時,detect window的得分等於part的匹配得分減去模型變化的花費。

3.      在訓練模型時,需要訓練得到每一個part的Hog模板,以及衡量part位置分佈cost的引數。文章中提出了Latent SVM方法,將deformable part model的學習問題轉換為一個分類問題。利用SVM學習,將part的位置分佈作為latent values,模型的引數轉化為SVM的分割超平面。具體實現中,作者採用了迭代計算的方法,不斷地更新模型。

針對上面三條,我們可能有幾個疑問:1、部件從何而來?2、如何用部件做檢測?在基於部件做目標檢測之前,贏得PASCAL VOC 2006年挑戰的Dalal-Triggs的方法是直接用HOG作為特徵,然後直接基於不同尺度的滑動視窗做判別,像一個濾波器,靠這個濾波器贏得短時的榮譽,但不能抗大形變的目標。Pedro改進了Dalal-Triggs的方法,他計算作為一個得分,其中beta是濾波器,phi(x)是特徵向量。通過濾波器找到一個根(root)部件p0,根部件有專門的濾波器,另外還有一系列非根部件(parts)p1…pn,然後把他們組成一個星形結構,此時回顧(圖一)的形變模型思想。每個部件用來表示,其中X,Y是座標,L表示金字塔級別。當這個星形結構的匹配得分減去模型變化的代價得到最終分最高時,就完成了匹配,如(公式二)所示:

(公式二)

        其中F’表示濾波器的向量化表示,b是偏移項,H表示特徵金字塔。現在假設濾波器解決了部件,完成了匹配,解答了第二個疑問,但是濾波器從何而來,簡單的說就是這個濾波器的權重beta是多少?現在不知道部件,也不知道濾波器,沒有濾波器就沒有部件,沒有部件也求不出濾波器的引數,這就是典型的EM演算法要解決的事情,但是作者沒有使用EM演算法,而是使用隱SVM(Latent SVM)的方法,隱變數其實就是類似統計中的因子分析,在這裡就是找到潛在部件。在訓練的時候對部分部件進行打標籤,用他們求beta,然後用beta再來找潛在部件,因此使用coordinatedescent迭代求解,再一次遇到這個求解方法。有了部件和打分,就是尋找根部件和其他部件的結合匹配最優問題,可以使用動態規劃,但很慢,具體請參考文獻[2]。

       在文獻[2]中雖然使用了金字塔來加速搜尋速度,但是對星形結構組合的搜尋匹配計算量也很大,檢測速度稍慢。因此接著來看第三篇文獻[3],文獻[3]就是加速檢測過程,對於星形結構模型採用cascade來判斷,來快速拋去沒有有效資訊的part,其實實際中根部件的位置對匹配起著很大作用,然後依次對其他部件(n+1),有了這種關係,取一些部件子集後我們可以採用cascade來修剪、拋去一些不是好配置的部件組合(官方用語叫配置),這樣一些在弱分類器中評分高的組合進入更一步的判斷,類似於cascade的級聯思想,但是要注意形變模型的每個部件應該是相關的,而不應該像上節那樣harr-like特徵之間獨立,依次判斷在這裡行不通,這裡其實是個子序列匹配問題,文獻[7]提出過一種解決方法,pedro又改進了此方法,在原來n+1個部件的基礎上增加n+1可以快速計算的簡單部件,這樣打亂之後,子序列匹配的代價就小了一些。

下面正式進入檢測流程,看看怎麼來加速的,大概流程如(圖四)所示:

(圖四)

      其中各個notation含義如(圖五)所示(特別注意p不是在上面說的部件,而是表示部件vi的貢獻):

(圖五)

       基於部件檢測的主題思想到此差不多了,但是還有更多的trick沒有說,比如閾值選取、如何計算簡單的部件等

檢測效果如(圖六)所示:

(圖六)

      這是一篇學習筆記式的“流水賬”,難免有說錯的地方,如發現請指出,謝謝。本節所有的文獻程式碼都整合在一起掛在pedro主頁上。

參考文獻:

[1] Pictorial Structures for Object Recognition. Pedro F.Felzenszwalb

[2]Object Detection with Discriminatively Trained Part Based Models.Pedro F. Felzenszwalb

[3]Cascade Object Detection with Deformable Part Models. Pedro F.Felzenszwalb

[4]From RigidTemplates To Grammars: Object Detection With Structured Models. Pedro F.Felzenszwalb

[5]Histogramsof oriented gradients for human detection. N. Dalal and B. Triggs

[7]A computational model for visual selection.Y. Amit and D.Geman