視覺目標檢測和識別之過去,現在及可能

計算機視覺中目標檢測、跟蹤、識別是最基本的幾個task,尤其又以檢測最為重要和基礎。同時基本上所有的檢測任務都需要在給出物體的bounding box之後,給出物體的類別(也就是給識別物體),所以文章中不區分檢測和識別任務。筆者從事計算機視覺中目標檢測相關的工作還比較多,將自己看到的,學到的,以及相關的一些理解總結如下。幫助自己進行梳理,也希望對後來者有幫助。大致將目前學術及和工業界出現的目標檢測演算法分成3類:

1. 傳統的目標檢測演算法:Cascade + Harr / SVM + HOG / DPM 以及上述的諸多改進、優化;

2. 候選窗+深度學習分類:通過提取候選區域,並對相應區域進行以深度學習方法為主的分類的方案,如:RCNN / Fast-RCNN / Faster-RCNN / SPP-net / R-FCN 等系列方法;

3. 基於深度學習的回歸方法:YOLO / SSD / DenseBox 等方法;以及最近出現的結合RNN演算法的RRC detection;結合DPM的Deformable CNN等

對於檢測的目標,早期工業界關注的主要是人臉,人,車這些對監控、交通等領域非常重要的目標,到現在為止,計算機需要更全面的理解場景,檢測的類別擴展到了生活的方方面面。

文章會針對上述的方法進行簡單的介紹,以及表達一些筆者認為這種演進趨勢背後的原因。總結起來,實際上所有的方法都可以概括成:候選窗口 + 分類or回歸;邏輯上滑窗也是提取候選窗口的一種方式。

基於深度學習的方案的計算效率和進度大致對比如下:

註:以上數據摘自論文

下面對上面的3類目標檢測的演算法進行說明:

傳統的目標檢測演算法:

傳統的做目標檢測的演算法基本流程如下:

1. 使用不同尺度的滑動窗口選定圖像的某一區域為候選區域;

2. 從對應的候選區域提取如Harr HOG LBP LTP等一類或者多類特徵;

3. 使用Adaboost SVM 等分類演算法對對應的候選區域進行分類,判斷是否屬於待檢測的目標。

2001年viola的cascade+harr進行人臉檢測的方案取得了很好的正面人臉的檢測效果;其實這之前通過普通的顏色特徵,形狀特徵也可以處理一些基本的目標檢測問題,並且這類方法至今在工業檢測的場景仍然在使用;下面我們對viola的cascade+harr人臉檢測的方案進行詳細的介紹,並為後續的方法埋下伏筆。

假設我們現在已經獲取了一個圖像區域,我們要判斷這個區域是不是人臉,應該怎麼做呢?那我們首先從這個區域提取特徵,然後將特徵送給分類器進行分類。特徵呢?在viola的方案中主要使用的是harr特徵,描述兩個圖像block之間的明暗對比;而分類器呢,最好是又快又好,viola提出的方法是Adaboost,通過弱分類器的組合和級聯完成分類任務;假如一個640*480大小的圖片,滑窗時每次移動3個像素的話,總體上也有10w量級的滑窗,再加上由於目標尺寸的變化,需要對圖片進行縮放或者擴大,總體滑窗的數量又會上升,因此對分類器的效率要求非常高。所以級聯的cascade方法很好的解決了這個問題,在初期使用很少的計算量過濾掉大部分的候選窗口,對於越難進行分類的樣本就計算更多的特徵來進行判斷,直到所有的候選窗口的分類完畢。後續會針對檢測的結果進行重疊窗口以及不同尺度圖像上窗口的融合。

viola最早提出來的harr特徵主要是水平方向和豎直方向,後續又出現了非常多的變化;adaboost方法在後續也出現了非常多的變種,這裡將harr特徵的變化以及adaboost的變種進行一個羅列:

基本上可以看到,以上harr的變種都是改變明暗對比的計算方法。還有一些改進:如將harr特徵進行組合的joint harr feature,如利用pixel明暗對比進行組合的joint pixel harr feature;基本邏輯就是獲得更為全面的特徵描述能力,以及提高計算速度。

這對adaboost也有非常多的改進,以及training方法的改進也很多,這裡對adaboost的改進進行羅列,感興趣的朋友可以查看:

vector boosting

output code to boost multiclass learning

multiple instance boosting(MIL等)

multi-class boosting

floatboost learning

multi-class adaboost

textonboost

等等

改進非常多,不過基本邏輯依舊是提升模型的表達能力;traning的改進在此不做羅列,總結起來基本上是:難分負樣本的處理,trainning效率等。

使用SVM+HOG的方法進行行人檢測方法和上述方案基本一致,不過針對行人檢測的場景,harr通過區域的明暗對比計算的特徵顯然不能夠太好的描述;而HOG特徵本身含有一定的位置特性,正好可以描述人體如頭部,四肢等不同的部位。方法的流程如下:

HOG特徵能夠很好的描述人體的輪廓特性,大致可以有個直觀的感受參考這個圖:

但上面的方案有個問題,實際上人的正面和側面從視覺輪廓上來看,差異非常大;比如車輛也一樣,從正面看,主要是擋風玻璃和前臉部分,從側面看則是車門和輪廓部分;所以出現了後來非常出名的dpm演算法。dpm演算法的思想如下:

1. 物體都是由不同的part組成的,由於各種variations導致物體整體的視覺效果不一樣,但是有些part的變化實際上不大,因此可以訓練針對不同part的檢測模塊;

2. 一個物體,不同的part之間實際上是存在天然的拓撲結構的關係,比如人體頭大部分情況都位於軀幹的上面,車大部分情況輪子的部分都在地面上等等。也就是說這些不同的part之間的距離和位置關係符合一個標準的分布,某種位置關係非常多,而有些位置關係存在但很少,有些則根本不存在;

3. 有了各個部件,有了位置關係,就可以將不同的位置關係對目標物體的貢獻看待成一個權重,最後由權重求和得到是否是需要檢測的目標。

整體流程參考:

root filter 和 n個part filter進行最終的加權,得到檢測目標。

dpm演算法本身的進步roadmap可以參考這個:

傳統的目標檢測方法介紹到這裡,而實際上後續的基於深度學習的目標檢測方案多多少少參考了前面的工作,以及在深度學習目標檢測的框架中也在結合以上方法中的思想,後面一一介紹。

候選窗+深度學習分類的目標檢測方案:

滑窗有一個問題,就是產生的候選窗口數量巨大,所以有各種region proposal的方案出來,最根本的需求就是在減少可能窗口的miss的情況下找到更少的候選窗口;從這個角度講,金字塔+滑動窗口的方案實際上是一個100%召回的方案。

使用深度學習方法進行分類能夠更好的提取特徵,以及模型能夠具備更強大的描述能力;所以基本上對深度學習的使用也慢慢的從當成特徵提取進步到特徵提取與分類、回歸等問題結合起來的end-to-end的方式。

先介紹rgbd大神的系列工作rcnn -> fast rcnn -> faster rcnn;以上工作非常有連續性,建議讀者讀原論文研讀。這個鏈接有一些說明:

RCNN, Fast-RCNN, Faster-RCNN的一些事

rcnn目標檢測的基本流程如下:

通過selective search的方式從圖片中提取可能的目標的候選窗口,將窗口warp到同一個尺寸,通過卷積網路從warp之後的候選窗口提取特徵,將特徵送給分類器進行分類,最後在加上bounding box regression等操作得到更準確的目標位置。

以上方案有幾個問題:1. selective search方式提取候選窗口非常耗時,同時會miss掉一些窗口;2. 從warp之後的候選窗口提取dnn特徵的時候,重疊部分的卷積操作重複計算了;3. 提取特徵之後再丟給SVM進行分類,邏輯上每一步都是分開訓練,不利於全局最優。

rgbd大神在fast rcnn中提出了ROI pooling層來解決重複的卷積計算的問題,框架如下:

ROI pooling層邏輯上可以理解成,對於一個任意尺寸的box,都可以通過將這個box分成4*4,8*8等同樣數量的網格,然後每個網格通過max, mean等操作計算相應的特徵,就可以將不同尺寸的box轉化成相同維度的特徵。

還不夠,是否可以簡化掉最費時的selective search 提取候選窗口呢?顯然可以。rgbd大神在faster rcnn中引入region proposal network替代selective search,同時引入anchor box應對目標形狀的變化問題。

在結合end-to-end的training,faster rcnn基本做到的實時。

SPP-net的主要思想是去掉原始圖像上的crop/warp操作,通過在卷積特徵層上的空間金字塔池化來達成;二者的差異可以參考這個圖:

Spatial pyramid pooling的示意圖如下,是一個非常重要的將尺寸不一致的圖像pooling到相同的特徵緯度的方法:

R-FCN方案也使用region proposal network提取候選窗口,同時使用和RPN同享的特徵進行分類和回歸,流程如下,請讀者參考論文詳情:

以上方案可以看到明顯的進步,並且每一個進步都有重要的背後的邏輯。幾個值得關注的點重申如下:

ROI pooling 操作

Anchor box機制

RPN特徵共享

卷積層的空間金字塔

等等

基於深度學習end-to-end的回歸方法用於目標檢測:

YOLO可以認為是這類方法的開篇之作,速度很快,詳細介紹如下。有人說yolo的方案去除了候選窗口或者滑窗的思想,但實際上並沒有,只是yolo使用對輸出的圖像進行網格劃分來提取候選窗口而已。

YOLO方案的輸入是比如448*448的圖片,輸入是一個7*7的網格,每個網格的信息包含:1. 存在某個類別的物體的概率,比如有20類目標需要檢測,那就是20類+1類(backgroud);2. 對應物體的bounding box參數,使用4個數字描述;3. 對應目標的概率。

這個問題就被format成一個回歸問題,448*448*3作為輸入;7*7*(b*5+c)作為回歸的參數,然後進行end-to-end的學習。

顯然,YOLO的方案有幾個問題:1. 針對小目標的檢測效果會不太好,因為7*7的網格的劃分可能太粗糙了;2. 經過多層卷積和pooling的操作,圖像的邊緣特徵可能丟失較多了,而回歸bounding box參數的只使用了高層的卷積層特徵,會導致bounding box不準確;3. 當兩個目標同時落入7*7的某一個網格中的時候,對應位置只能檢測到一個物體。

SSD方案則是faster rcnn和yolo的結合,使用了yolo end-to-end訓練的思想,同時有結合了anchor box,不同層的卷積特徵的組合等方案。SSD的整體流程如下:

SSD網路和YOLO網路的差異如下:

anchor機制的引入,以及多個卷積層特徵的組合能夠幫助SSD獲得更為準確的對目標bounding box的估計。

KITTI上top 20的目標檢測方案及精度大致如下:

對排名第7的RRC 方案做一個描述,之所以介紹這個方法,是因為他在hard上的得分超過了其他方案非常多,並且在moderate easy上的結果也和最好的結果差異不大,而筆者也認為這個方案背後的思想值得學習。

RRC實際上是把RNN的一些思想融入到了目標檢測當中:

網路結構比較複雜,做如下幾個說明:

1. 我們在做bounding box回歸的時候,一定是需要一些有用的底層的邊緣信息的,但並不是所有的底層信息都有用,那這些信息可以通過一定的方式傳遞的後面的決策層;

2. 利用當前層進行預測的時候,實際上和他的上一層和下一層的信息是有關的。

詳細請參考RRC detection論文。

Deformable CNN方法:是一種把DPM和CNN結合起來的思想。我們一起思考一下,卷積核一般情況下都是一個固定的尺寸或者是性狀,比如3*3,5*5;但實際上在我們進行目標檢測的時候,我們的目標的性狀是千差萬別的。比如人的手掌,實際上就是一個長方形或者有一定弧形的區域。那麼如果我們可以通過某種方式將卷積核變成或者說是訓練成可能的目標的部件的性狀,那麼他計算出來的特徵就越合理。

所以我們是否可以在學習卷積核的時候,也引入一些可學習的卷積核的形狀參數呢?答案是肯定的,這個就是deformable cnn卷積:

通過對卷積核引入offsets來實現。

通過一個直觀的感受來看看學習到的deformable cnn核是什麼樣子?

可以看到,學習到的deformable cnn核會遵循目標的輪廓進行分布;我們可以想見,或許學習到的對人臉特別敏感的核應該是一個橢圓形的等等。

感受一些deformable cnn的效果:

邏輯上:deformable cnn的效果可以通過多個標準的卷積核組合得到,就相當於橢圓可以通過很多個矩形來近似一樣;這種組合似乎有一些inception v3 v4裡面的組合的味道;不過我個人認為這種人造的組合可能上限會比通過參數學習的組合低,筆者認為deformable cnn的方案還是非常值得期待的。

總結、可能:

基本上對於過去和現在的方法總結得差不多了,似乎該展望未來。不過筆者對於未來的判斷一般都沒有準確過,所以不敢使用未來這個字眼。但是對於目標檢測的一些思考和可能也有一些自己的判斷。

基於深度學習方法的幾個可能的方向:

1. 想辦法從原始圖像、低層的feature map層,以及高層的語義層獲取更多的信息,從而得到對目標bounding box的更準確的估計;

2. 對bounding box的估計可以結合圖片的一些coarse-to-fine的分割信息;

3. bounding box的估計可能需要更多的局部的content的信息,需要想辦法引入;

4. 目標檢測數據集的標註難度非常大,如何把其他如classfication領域學習到的知識用於檢測當中,甚至是將classification的數據和檢測數據集做co-training(如YOLO9000)的方式,至少可以從數據層面獲得更多的信息;

5. 更好的啟發式的學習方式,人在識別物體的時候,第一次可能只是知道這是一個單獨的物體,也知道bounding box,但是不知道類別;當人類通過其他渠道學習到類別的時候,下一次就能夠識別了;目標檢測也是如此,我們不可能標註所有的物體的類別,但是如何將這種快速學習的機制引入,也是一個問題;

6. RRC,deformable cnn中卷積和其他的很好的圖片的操作、機器學習的思想的結合未來也有很大的空間;

7. 語意信息和分割的結合,可能能夠為目標檢測提供更多的有用的信息;

8. 場景信息也會為目標檢測提供更多信息;比如天空不會出現汽車等等。

筆者自己一直喜歡非常簡單的框架,比如cascade+harr,比如yolo;這種簡單的框架對工程上的實現以及後續的優化提供了最多的可能性;也信奉一個道理,在工業界應該是simple is beautiful

到這裡基本上已經寫完了,檢測和識別這些基本的task的進步才能夠讓計算機更好的理解世界,共勉!


推薦閱讀:

Mask_RCNN:基於Keras and TensorFlow 的 Mask R-CNN 為 目標檢測和情景分割
目標檢測筆記二:Object Detection API 小白實踐指南
【簡評】FaceBoxes
感覺靈感被掏空?你需要這 9 篇論文來補一補 | PaperDaily #05
YOLO2

TAG:目标检测 | 深度学习DeepLearning |