一、目標檢測常見算法
object detection,就是在給定的圖片中精確找到物體所在位置,並標註出物體的類別。
- 物體的尺寸變化範圍很大
- 擺放物體的角度,姿態不定
- 可以出現在圖片的任何地方
- 物體還可以是多個類別
目前學術和工業界出現的目標檢測算法分成3類
-
- 傳統的目標檢測算法:Cascade + HOG/DPM + Haar/SVM以及上述方法的諸多改進、優化;
p.s.DPM可以看做是HOG(Histogrrams of Oriented Gradients)的擴展,大體思路與HOG一致。先計算梯度方向直方圖,然後用SVM(Surpport Vector Machine )訓練得到物體的梯度模型(Model)。有了這樣的模板就可以直接用來分類了,簡單理解就是模型和目標匹配。DPM只是在模型上做了很多改進工作。
-
- 候選區域/框 + 深度學習分類:通過提取候選區域,並對相應區域進行以深度學習方法爲主的分類的方案,如:
R-CNN(Selective Search + CNN + SVM)
SPP-net(ROI Pooling)
Fast R-CNN(Selective Search + CNN + ROI)
Faster R-CNN(RPN + CNN + ROI)
R-FCN
等系列方法;
-
- 基於深度學習的迴歸方法:YOLO/SSD/DenseBox 等方法;以及最近出現的結合RNN算法的RRC detection;結合DPM的Deformable CNN等
二、傳統的目標檢測算法
傳統目標檢測流程:
1)區域選擇(窮舉策略:採用滑動窗口,且設置不同的大小,不同的長寬比對圖像進行遍歷,時間複雜度高)
2)特徵提取(SIFT、HOG等;形態多樣性、光照變化多樣性、背景多樣性使得特徵魯棒性差)
3)分類器分類(主要有SVM、Adaboost等)
圖像識別任務:
①把圖中的物體識別出來—classification
輸入:圖片
輸出:物體的類別
評估方法:準確率
②用方框框出它的位置—localization
輸入:圖片
輸出:方框在圖片中的位置(x,y,w,h)
評估方法:檢測評價函數intersection-over-union(IOU交併比:目標檢測中使用的測量在特定數據集中檢測相應物體準確度的一個標準,是產生的候選框candidate bound與原標記框ground truth bound的交疊率,即它們的交集與並集的比值。最理想情況是完全重疊,即比值爲1)
- 卷積神經網絡CNN已經幫我們完成了圖像識別(判定是貓還是狗)的任務了
根據定位的問題的不同解決思路——
思路一:看做迴歸問題
預測出(x,y,w,h)四個參數的值
步驟1:
先解決簡單問題, 搭一個識別圖像的神經網絡
在AlexNet VGG GoogleLenet上fine-tuning(在實踐中,由於數據集不夠大,很少有人從頭開始訓練網絡。常見的做法是使用預訓練的網絡來重新fine-tuning也叫微調,或者當做特徵提取器)一下
步驟2:
在上述神經網絡的尾部展開(也就說CNN前面保持不變,我們對CNN的結尾處作出改進:加了兩個頭:“分類頭”和“迴歸頭”)
成爲classification + regression模式
步驟3:
*Regression那個部分用歐氏距離損失
*使用SGD訓練
步驟4:
*預測階段
把2個頭部拼上完成不同的功能
這裏需要進行兩次fine-tuning
第一次在ALexNet上做,第二次將頭部改成regression head,前面不變,做一次fine-tuning
- Regression的部分加在哪?
有兩種處理方法:
•加在最後一個卷積層後面(如VGG)
•加在最後一個全連接層後面(如R-CNN)
- regression太難做了,應想方設法轉換爲classification問題。
regression的訓練參數收斂的時間要長得多,所以上面的網絡採取了用classification的網絡來計算出網絡共同部分的連接權值。
思路二:取圖像窗口
•還是剛纔的classification + regression思路
•取不同大小的“框”——輸入
•讓框出現在不同位置,得出這個框的判定得分
•取得分最高的那個框
- 根據得分的高低,我們選擇了右下角的黑框作爲目標位置的預測。
注:有的時候也會選擇得分最高的兩個框,然後取兩框的交集作爲最終的位置預測
對一張圖片,用各種大小的框(遍歷整張圖片)將圖片截取出來,輸入到CNN,然後CNN會輸出這個框的得分(classification)以及這個框圖片對應的x,y,h,w(regression)——這方法實在太耗時間了,做個優化。
原來網絡是這樣的:
把全連接層改爲卷積層,這樣可以提提速。
當圖像有很多物體怎麼辦
任務就變成了:多物體識別+定位多個物體
看成分類問題有何不妥?
•你需要找很多位置, 給很多個不同大小的框
•你還需要對框內的圖像分類
傳統目標檢測的主要問題是:
1)基於滑動窗口的區域選擇策略沒有針對性,時間複雜度高,窗口冗餘
2)手工設計的特徵對於多樣性的變化沒有很好的魯棒性
三、候選區域/窗 + 深度學習分類
3.1 R-CNN橫空出世
- 預先找出圖中目標可能出現的位置,即候選區域(Region Proposal)。利用圖像中的紋理、邊緣、顏色等信息,可以保證在選取較少窗口(幾千甚至幾百)的情況下保持較高的召回率(Recall)。
- 問題就轉變成找出可能含有物體的區域/框(也就是候選區域/框,比如選2000個候選框),這些框之間是可以互相重疊互相包含的,這樣我們就可以避免暴力枚舉所有框了。
- 有了候選區域,剩下的工作實際就是對候選區域進行圖像分類的工作(特徵提取+分類)。
- R-CNN的簡要步驟如下:
(1) 輸入測試圖像
(2) 利用選擇性搜索Selective Search算法在圖像中從下到上提取2000個左右的可能包含物體的候選區域Region Proposal
(3) 因爲取出的區域大小各自不同,所以需要將每個Region Proposal縮放(warp)成統一的227x227的大小並輸入到CNN,將CNN的fc7層的輸出作爲特徵
(4) 將每個Region Proposal提取到的CNN特徵輸入到SVM進行分類
- 具體步驟則如下:
步驟一:訓練(或者下載)一個分類模型(比如AlexNet)
步驟二:對該模型做fine-tuning
•將分類數從1000改爲21,比如20個物體類別 + 1個背景
•去掉最後一個全連接層
步驟三:特徵提取
•提取圖像的所有候選框(選擇性搜索Selective Search)
•對於每一個區域:修正區域大小以適合CNN的輸入,做一次前向運算,將第五個池化層的輸出(就是對候選框提取到的特徵)存到硬盤
步驟四:訓練一個SVM分類器(二分類)來判斷這個候選框裏物體的類別
每個類別對應一個SVM,判斷是不是屬於這個類別,是就是positive,反之nagative
比如下圖,就是狗分類的SVM:
步驟五:使用迴歸器精細修正候選框位置:對於每一個類,訓練一個線性迴歸模型去判定這個框是否框得完美。
- R-CNN雖然不再像傳統方法那樣窮舉,但R-CNN流程的第一步中對原始圖片通過Selective Search提取的候選框region
proposal多達2000個左右,而這2000個候選框每個框都需要進行CNN提特徵+SVM分類,計算量很大,導致R-CNN檢測速度很慢,一張圖都需要47s。
- 有沒有方法提速呢?答案是有的,這2000個region
proposal不都是圖像的一部分嗎,那麼我們完全可以對圖像提一次卷積層特徵,然後只需要將region proposal在原圖的位置映射到卷積層特徵圖上,這樣對於一張圖像我們只需要提一次卷積層特徵,然後將每個region proposal的卷積層特徵輸入到全連接層做後續操作。
但現在的問題是每個region proposal的尺度不一樣,而全連接層輸入必須是固定的長度,所以直接這樣輸入全連接層肯定是不行的。SPP Net恰好可以解決這個問題。
3.2 SPP Net
SPP:Spatial Pyramid Pooling(空間金字塔池化)
SPP-Net是出自2015年發表在IEEE上的論文-《Spatial Pyramid Pooling in Deep ConvolutionalNetworks for Visual Recognition》。
衆所周知,CNN一般都含有卷積部分和全連接部分,其中,卷積層不需要固定尺寸的圖像,而全連接層需要固定大小的輸入。
所以當全連接層面對各種尺寸的輸入數據時,就需要對輸入數據進行crop(crop就是從一個大圖扣出網絡輸入大小的patch,比如227×227),或warp(把一個邊界框bounding box的內容resize成227×227)等一系列操作以統一圖片的尺寸大小,比如224224(ImageNet)、3232(LenNet)、96*96等。
- 但warp/crop這種預處理,導致的問題要麼被拉伸變形、要麼物體不全,限制了識別精確度。
- SPP Net的作者Kaiming He等人逆向思考,既然由於全連接FC層的存在,普通的CNN需要通過固定輸入圖片的大小來使得全連接層的輸入固定。那借鑑卷積層可以適應任何尺寸,爲何不能在卷積層的最後加入某種結構,使得後面全連接層得到的輸入變成固定的呢?
- 這個“化腐朽爲神奇”的結構就是spatial pyramid pooling layer。
下圖便是R-CNN和SPP Net檢測流程的比較:
它的特點有兩個:
-
結合空間金字塔方法實現CNNs的多尺度輸入。
SPP Net的第一個貢獻就是在最後一個卷積層後,接入了金字塔池化層,保證傳到下一層全連接層的輸入固定。
普通的CNN機構中,輸入圖像的尺寸往往是固定的(比如224*224像素),輸出則是一個固定維數的向量。SPP Net在普通的CNN結構中加入了ROI池化層(ROI Pooling),使得網絡的輸入圖像可以是任意尺寸的,輸出則不變,同樣是一個固定維數的向量。
ROI池化層一般跟在卷積層後面,此時網絡的輸入可以是任意尺度的,在SPP layer中每一個pooling的filter會根據輸入調整大小,而SPP的輸出則是固定維數的向量,然後給到全連接FC層。
-
只對原圖提取一次卷積特徵
只對原圖進行一次卷積計算,便得到整張圖的卷積特徵feature map,然後找到每個候選框在feature map上的映射patch,將此patch作爲每個候選框的卷積特徵輸入到SPP layer和之後的層,完成特徵提取工作。
3.3 Fast R-CNN
R-CNN的進階版Fast R-CNN就是在R-CNN的基礎上採納了SPP Net方法,對R-CNN作了改進,使得性能進一步提高。
R-CNN仍會有嚴重的速度瓶頸,原因也很明顯,就是計算機對所有region進行特徵提取時會有重複計算,Fast-RCNN正是爲了解決這個問題誕生的。