天天看點

視覺目标檢測和識别之過去,現在及可能傳統的目标檢測算法候選窗+深度學習分類的目标檢測方案基于深度學習end-to-end的回歸方法用于目标檢測總結及可能

本文來自AI新媒體量子位(QbitAI)

計算機視覺中目标檢測、跟蹤、識别是最基本的幾個task,尤其又以檢測最為重要和基礎。同時基本上所有的檢測任務都需要在給出物體的bounding box之後,給出物體的類别(也就是給識别物體),是以文章中不區分檢測和識别任務。

筆者從事計算機視覺中目标檢測相關的工作還比較多,将自己看到的,學到的,以及相關的一些了解總結如下。幫助自己進行梳理,也希望對後來者有幫助。我大緻将目前學術及和工業界出現的目标檢測算法分成3類:

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

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

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

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

視覺目标檢測和識别之過去,現在及可能傳統的目标檢測算法候選窗+深度學習分類的目标檢測方案基于深度學習end-to-end的回歸方法用于目标檢測總結及可能

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

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

視覺目标檢測和識别之過去,現在及可能傳統的目标檢測算法候選窗+深度學習分類的目标檢測方案基于深度學習end-to-end的回歸方法用于目标檢測總結及可能

△ 以上資料摘自研究論文

下面對上面的3類目标檢測的算法進行說明——

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

使用不同尺度的滑動視窗標明圖像的某一區域為候選區域;

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

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

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

假設我們現在已經擷取了一個圖像區域,我們要判斷這個區域是不是人臉,應該怎麼做呢?那我們首先從這個區域提取特征,然後将特征送給分類器進行分類。

特征呢?在viola的方案中主要使用的是harr特征,描述兩個圖像block之間的明暗對比;而分類器呢,最好是又快又好,viola提出的方法是Adaboost,通過弱分類器的組合和級聯完成分類任務;假如一個640*480大小的圖檔,滑窗時每次移動3個像素的話,總體上也有10w量級的滑窗,再加上由于目标尺寸的變化,需要對圖檔進行縮放或者擴大,總體滑窗的數量又會上升,是以對分類器的效率要求非常高。

是以,級聯的cascade方法很好的解決了這個問題,在初期使用很少的計算量過濾掉大部分的候選視窗,對于越難進行分類的樣本就計算更多的特征來進行判斷,直到所有的候選視窗的分類完畢。後續會針對檢測的結果進行重疊視窗以及不同尺度圖像上視窗的融合。

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

視覺目标檢測和識别之過去,現在及可能傳統的目标檢測算法候選窗+深度學習分類的目标檢測方案基于深度學習end-to-end的回歸方法用于目标檢測總結及可能

基本上可以看到,以上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特征本身含有一定的位置特性,正好可以描述人體如頭部,四肢等不同的部位。方法的流程如下:

視覺目标檢測和識别之過去,現在及可能傳統的目标檢測算法候選窗+深度學習分類的目标檢測方案基于深度學習end-to-end的回歸方法用于目标檢測總結及可能

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

視覺目标檢測和識别之過去,現在及可能傳統的目标檢測算法候選窗+深度學習分類的目标檢測方案基于深度學習end-to-end的回歸方法用于目标檢測總結及可能

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

物體都是由不同的part組成的,由于各種variations導緻物體整體的視覺效果不一樣,但是有些part的變化實際上不大,是以可以訓練針對不同part的檢測子產品;

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

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

整體流程參考:

視覺目标檢測和識别之過去,現在及可能傳統的目标檢測算法候選窗+深度學習分類的目标檢測方案基于深度學習end-to-end的回歸方法用于目标檢測總結及可能

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

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

視覺目标檢測和識别之過去,現在及可能傳統的目标檢測算法候選窗+深度學習分類的目标檢測方案基于深度學習end-to-end的回歸方法用于目标檢測總結及可能

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

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

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

先介紹rgbd大神的系列工作rcnn -> fast rcnn -> faster rcnn;以上工作非常有連續性,建議讀者讀原論文研讀。

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

視覺目标檢測和識别之過去,現在及可能傳統的目标檢測算法候選窗+深度學習分類的目标檢測方案基于深度學習end-to-end的回歸方法用于目标檢測總結及可能

通過selective search的方式從圖檔中提取可能的目标的候選視窗,将視窗warp到同一個尺寸,通過卷積網絡從warp之後的候選視窗提取特征,将特征送給分類器進行分類,最後在加上bounding box regression等操作得到更準确的目标位置。

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

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

視覺目标檢測和識别之過去,現在及可能傳統的目标檢測算法候選窗+深度學習分類的目标檢測方案基于深度學習end-to-end的回歸方法用于目标檢測總結及可能

ROI pooling層邏輯上可以了解成,對于一個任意尺寸的box,都可以通過将這個box分成44,88等同樣數量的網格,然後每個網格通過max, mean等操作計算相應的特征,就可以将不同尺寸的box轉化成相同次元的特征。

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

視覺目标檢測和識别之過去,現在及可能傳統的目标檢測算法候選窗+深度學習分類的目标檢測方案基于深度學習end-to-end的回歸方法用于目标檢測總結及可能

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

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

視覺目标檢測和識别之過去,現在及可能傳統的目标檢測算法候選窗+深度學習分類的目标檢測方案基于深度學習end-to-end的回歸方法用于目标檢測總結及可能

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

視覺目标檢測和識别之過去,現在及可能傳統的目标檢測算法候選窗+深度學習分類的目标檢測方案基于深度學習end-to-end的回歸方法用于目标檢測總結及可能

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

視覺目标檢測和識别之過去,現在及可能傳統的目标檢測算法候選窗+深度學習分類的目标檢測方案基于深度學習end-to-end的回歸方法用于目标檢測總結及可能

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

ROI pooling 操作

Anchor box機制

RPN特征共享

卷積層的空間金字塔

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

視覺目标檢測和識别之過去,現在及可能傳統的目标檢測算法候選窗+深度學習分類的目标檢測方案基于深度學習end-to-end的回歸方法用于目标檢測總結及可能

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的整體流程如下:

視覺目标檢測和識别之過去,現在及可能傳統的目标檢測算法候選窗+深度學習分類的目标檢測方案基于深度學習end-to-end的回歸方法用于目标檢測總結及可能

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

視覺目标檢測和識别之過去,現在及可能傳統的目标檢測算法候選窗+深度學習分類的目标檢測方案基于深度學習end-to-end的回歸方法用于目标檢測總結及可能

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

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

視覺目标檢測和識别之過去,現在及可能傳統的目标檢測算法候選窗+深度學習分類的目标檢測方案基于深度學習end-to-end的回歸方法用于目标檢測總結及可能

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

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

視覺目标檢測和識别之過去,現在及可能傳統的目标檢測算法候選窗+深度學習分類的目标檢測方案基于深度學習end-to-end的回歸方法用于目标檢測總結及可能

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

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

利用目前層進行預測的時候,實際上和他的上一層和下一層的資訊是有關的。

詳細請參考RRC detection論文。

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

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

視覺目标檢測和識别之過去,現在及可能傳統的目标檢測算法候選窗+深度學習分類的目标檢測方案基于深度學習end-to-end的回歸方法用于目标檢測總結及可能

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

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

視覺目标檢測和識别之過去,現在及可能傳統的目标檢測算法候選窗+深度學習分類的目标檢測方案基于深度學習end-to-end的回歸方法用于目标檢測總結及可能

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

感受一些deformable cnn的效果:

視覺目标檢測和識别之過去,現在及可能傳統的目标檢測算法候選窗+深度學習分類的目标檢測方案基于深度學習end-to-end的回歸方法用于目标檢測總結及可能

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

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

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

想辦法從原始圖像、低層的feature map層,以及高層的語義層擷取更多的資訊,進而得到對目标bounding box的更準确的估計;

對bounding box的估計可以結合圖檔的一些coarse-to-fine的分割資訊;

bounding box的估計可能需要更多的局部的content的資訊,需要想辦法引入;

目标檢測資料集的标注難度非常大,如何把其他如classfication領域學習到的知識用于檢測當中,甚至是将classification的資料和檢測資料集做co-training(如YOLO9000)的方式,至少可以從資料層面獲得更多的資訊;

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

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

語意資訊和分割的結合,可能能夠為目标檢測提供更多的有用的資訊;

場景資訊也會為目标檢測提供更多資訊;比如天空不會出現汽車等等。

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

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

如果對文章感興趣,還可移步作者知乎專欄(碧空的cv之旅 )解鎖更多文章

點選左下角“閱讀原文”,可直接檢視

【完】

本文作者:李習華

原文釋出時間:2017-06-28 

繼續閱讀