1.概述
1.1 目標檢測的定義
識別圖片中有哪些物體以及物體的位置(坐標位置)。
其中,需要識別哪些物體是人為設定限制的,僅識別需要檢測的物體;物體的坐標位置由兩種表示方法:極坐標表示(xmin, ymin, xmax, ymax)和中心點坐標表示(x_center, y_center, w, h)。
1.2 目標檢測的發展
1.2.1 傳統的目標檢測算法(候選區域+手工特征提取+分類器)——two stage算法
HOG+SVM、DPM
1.2.2 region proposal+CNN提取分類的目標檢測框架——one stage算法
R-CNN、SPP-NET、Fast R-CNN、Faster R-CNN
1.2.3端到端(end-to-end)的目標檢測框架
YOLO、SSD
1.2 目標檢測算法原理
目標:清晰記住算法的識別流程,解決某些問題用到的算法的關鍵技術點。
1.2.1 目標檢測算法的分類
1) two stage算法
先進行區域推薦,再進行目標分類,典型算法是R-CNN系列算法(R-CNN、SPP-Net、Fast R-CNN、Faster R-CNN);
2) one stage算法(end-to-end)
采用一個網絡一步到位,代表算法是:YOLO、SSD
通常在算法中需要對數值進行處理,一般為歸一化操作,即:
對於輸出的位置信息是4個比較大的像素的值,在回歸的時候不合適。目前統一的做法是,每個位置除以圖片本身的像素大小。假設以中心點坐標方式表示,則:
$x=x/x_{image},y=y/y_{image},w=w/x_{image},h=h/y_{image}$
1.2.2 目標檢測的任務
對於一張圖片中有一個物體時,可以通過如下框架進行物體檢測:將輸入的圖片經過一個CNN網絡得到feature map,然后將feature map分別連接兩個全連接層,一個是物體分類的全連接層(有多少個物體就多少個輸出),另一個是輸出位置信息,如圖1所示:
圖1 圖片分類框架
對於單個物體的檢測,還可以通過圖像金字塔和滑動窗口的方式進行物體檢測,可以參照《基於滑動窗口和全卷積網絡的人臉檢測》一節。
2. R-CNN算法
對於一張圖片中有多個目標,多個類別時,對於圖1所示的算法的無法實現,可能需要輸出N個類別(N不固定),因此網絡模型的輸出是不固定的。因此需要一個能夠輸出多個目標的算法。
2.1 寫在介紹R-CNN算法前面——overfeat模型
overfeat模型如圖2所示:
圖2 overfeat模型
該算法使用不同大小的候選框作為滑動窗口進行物體檢測。這種方式是一種暴力窮舉的方式,計算量巨大,而且不同大小的滑動窗口設置可能導致檢測結果不准確,但確實為物體檢測提供了一種思路。
2.2 R-CNN模型
不使用暴力方法,而是用候選區域方法(region proposal method),創建目標檢測的區域改變了圖像領域實現物體檢測的模型思路,R-CNN是以深度神經網絡為基礎的物體檢測的模型 ,R-CNN在當時以優異的性能令世人矚目,以R-CNN為基點,后續的SPPNet、Fast R-CNN、Faster R-CNN模型都是照着這個物體檢測思路。R-CNN算法框架如圖3所示:
圖3 R-CNN算法模型框架
算法步驟如下(使用Alexnet網絡提取特征,輸入大小需要resize到227×227):
1)找到可能存在物體的候選區域region proposal;
2)圖片大小調整到227×227,為了使用Alexnet網絡的輸入,通過CNN對候選區域提取特征向量,2000個建議框的CNN特征組成2000×4096為矩陣;
3)將2000×4096的特征矩陣和20個SVM組成的權重矩陣4096×20相乘,獲得2000×20的矩陣;得到2000個類別得分矩陣,得分最高的即為候選框中物體的類別;
4)分別對2000×20的矩陣的每一列即每一類進行NMS來剔除重疊的建議框;
5)修正bbox,對bbox進行回歸微調。通過線性回歸實現:特征值是候選區域,目標是對應的GT,建立回歸方程學習參數。
R-CNN中的候選區域的選取,使用的是選擇性搜索(SelectiveSearch, SS),如題4所示,首先將每個像素作為一組。然后,計算每一組的紋理,並將兩個最接近的組結合起來。但是為了避免單個區域吞噬其他區域,我們首先對較小的組進行分組。我們繼續合並區域,直到所有區域都結合在一起。下圖第一行展示了如何使區域增長,第二行中的藍色矩形代表合並過程中所有可能的 ROI。
圖4 選擇性搜索進行候選區域選取
大小統一使用的方法是Crop+Wrap方法。
SVM分類介紹:
假設一張圖片的2000個侯選區域,那么提取出來的就是2000 x 4096這樣的特征向量(R-CNN當中默認CNN層輸出4096特征向量)。那么最后需要對這些特征進行分類,R-CNN選用SVM進行二分類。假設檢測N個類別,那么會提供20個不同類別的SVM分類器,每個分類器都會對2000個候選區域的特征向量分別判斷一次,這樣得出[2000, 20]的得分矩陣,如圖5所示:
圖5 SVM分類器
2.3 R-CNN網絡訓練
R-CNN網絡的訓練過程分為:正負樣本准備、預訓練+fine tuning、訓練SVM、訓練邊框回歸網絡。
1、 正負樣本准備
其中
正樣本:某個region proposal和當前圖像上所有的ground truth重疊面積最大的IOU大於等於0.5,則該region proposal作為這個ground truth類別的正樣本;
負樣本:某個region proposal和當前圖像上所有的ground truth重疊面積最大的IOU小於0.5,則該region proposal作為這個ground truth類別的負樣本。
這樣得到若干個候選區域以及對應的標記結果。
2、 預訓練
別人已經在大數據上訓練好的CNN網絡參數(比如:本方法使用的Alexnet)
3、 微調(fine-tuning)
利用標記好的樣本,輸入到model1中,繼續訓練,得出model2(CNN網絡)
4、 SVM訓練
針對每一個類別訓練一個SVM的二分類器。例如:貓的SVM分類器,輸入維度是2000*4096,目標還是之前第一步標記(正負樣本標記結果)的是否屬於該類別。例如:100個貓樣本,900個非貓樣本。
5、 訓練邊框回歸器
2.4 R-CNN測試過程
如圖6所示,為R-CNN實現的過程。
圖6 R-CNN實現過程
3. SPP-NET
SPP(Spatial Pyramid Pooling,空間金字塔池化)
問題:如圖6所示,R-CNN速度慢在哪里?卷積網絡。每個選擇的候選區域都要進行卷積操作。因此,SPP-Net的出發點就是提升R-CNN的速度。
SPP-NET相比R-CNN,需要從下面的兩點進行改進,如圖7所示。
1、 減少卷積計算(直接將圖片輸入一個卷積網絡,不再是就將每個獲得的候選區域都進行輸入卷積網絡)
2、 防止圖片內容變形(不再使用Crop+Wrap方法)
圖7 R-CNN與SPPNet對比
R-CNN模型 | SPPNet模型 |
---|---|
1、R-CNN是讓每個候選區域經過crop/wrap等操作變換成固定大小的圖像 2、固定大小的圖像塞給CNN 傳給后面的層做訓練回歸分類操作 | 1、SPPNet把全圖塞給CNN得到全圖的feature map 2、讓候選區域(通過SS在原圖篩選)與feature map直接映射,得到候選區域的映射特征向量 3、映射過來的特征向量大小不固定,這些特征向量塞給SPP層(空間金字塔變換層),SPP層接收任何大小的輸入,輸出固定大小的特征向量,再塞給FC層 |
3.1 映射
原始圖片經過CNN變成了feature map,原始圖片通過選擇性搜索(SS)得到了候選區域,現在需要將基於原始圖片的候選區域映射到feature map中的特征向量。映射過程如圖8所示:
圖8 映射過程
整個映射過程有具體的公式,如下
假設(x′,y′)(x′,y′)表示特征圖上的坐標點,坐標點(x,y)表示原輸入圖片上的點,那么它們之間有如下轉換關系,這種映射關心與網絡結構有關:(x,y)=(S∗x′,S∗y′),即:
-
左上角的點:
- x′=[x/S]+1
-
右下角的點:
- x′=[x/S]−1
其中S就是CNN中所有的strides的乘積,包含了池化、卷積的stride。論文中使用S的計算出來為=16。
3.2 SPP(spatial pyramid pooling)
通過spatial pyramid pooling 將任意大小的特征圖轉換成固定大小的特征向量。
假設原圖輸入是224x224,對於conv出來后的輸出是13x13x256的,可以理解成有256個這樣的Filter,每個Filter對應一張13x13的feature map。接着在這個特征圖中找到每一個候選區域映射的區域,spp layer會將每一個候選區域分成1x1,2x2,4x4三張子圖,對每個子圖的每個區域作max pooling,得出的特征再連接到一起,就是(16+4+1)x256的特征向量,接着給全連接層做進一步處理,如圖9所示。
圖9 SPP層
3.3 SPP-NET總結
圖10 SPP-NET總結
- 優點
- SPPNet在R-CNN的基礎上提出了改進,通過候選區域和feature map的映射,配合SPP層的使用,從而達到了CNN層的共享計算,減少了運算時間, 后面的Fast R-CNN等也是受SPPNet的啟發。
- 缺點
- 訓練依然過慢、效率低,特征需要寫入磁盤(因為SVM的存在)。
- 分階段訓練網絡:選取候選區域、訓練CNN、訓練SVM、訓練bbox回歸器, SPP-Net在fine-tuning階段無法使用反向傳播微調SPP-Net前面的Conv層。
4. Fast R-CNN
出發點:解決SPP-NET的網絡之間不統一訓練的問題。
4.1 Fast R-CNN改進
1)提出了ROI Pooling層(類似於SPP層),然后整合模型,將CNN、SPP變換層、分類器、bbox回歸幾個模塊放在一起訓練。是一個end-to-end模型,即輸入端到輸出端直接使用一個網絡相連,整體優化目標函數;
2)SVM替換成了softmax分類;
圖11 Fast R-CNN
步驟
- 首先將整個圖片輸入到一個基礎卷積網絡,得到整張圖的feature map;
- 將region proposal(RoI)映射到feature map中;
- RoI pooling layer提取一個固定長度的特征向量,每個特征會輸入到一系列全連接層,得到一個RoI特征向量(此步驟是對每一個候選區域都會進行同樣的操作);
- 其中一個是傳統softmax層進行分類(不再使用SVM進行分類),輸出類別有K個類別加上”背景”類;
- 另一個是bounding box regressor;
4.2 RoI層和SPP層對比
RoI Pooling相當於簡易版的SPP層,目的是為了減少計算時間並且得出固定長度的向量。和SPP層的對比如圖12所示。
圖12 RoI層和SPP層對比
原來SPP是金字塔型:4×4、2×2、1×1;而RoI Pooling改成了單個塊:K×M(論文中是4×4)
為什么要設計單個尺度呢?這要涉及到single scale與multi scale兩者的優缺點
- single scale(RoI Pooling),直接將image定為某種scale,直接輸入網絡來訓練即可。(Fast R-CNN);
- multi scale(SPP層),也就是要生成一個金字塔,然后對於object,在金字塔上找到一個大小比較接近227x227的投影版本。
后者比前者更加准確些,沒有突更多,但是第一種時間要省很多,所以實際采用的是第一個策略,因此Fast R-CNN要比SPPNet快很多也是因為這里的原因。
接着我們來看為什么后面的整個網絡能進行統一訓練?
特征提取CNN的訓練和SVM分類器的訓練在時間上是先后順序,兩者的訓練方式獨立,因此SVMs的訓練Loss無法更新SPP-Layer之前的卷積層參數,去掉了SVM分類這一過程,所有特征都存儲在內存中,不占用硬盤空間,形成了End-to-End模型(proposal除外,end-to-end在Faster-RCNN中得以完善)
- 使用了softmax分類;
- RoI pooling能進行反向傳播,SPP層不適合;
4.3 總結
Fast R-CNN結構如圖13所示:
如圖13 Fast R-CNN結構
缺點:使用Selective Search提取Region Proposals,沒有實現真正意義上的端對端,操作也十分耗時。
5. Faster R-CNN
R-CNN、Fast R-CNN以及Faster R-CNN的對比如圖14所示:
圖14 R-CNN、Fast R-CNN以及Faster R-CNN的對比
在Fast R-CNN因為還使用Selective Search(選擇性搜索),因此不是一個嚴格意義上的end-to-end模型。同時,要找出所有的候選框,這個也非常耗時。Faster R-CNN提出了一種更加高效的方法來求出這些候選框。Faster R-CNN可以簡單地看成是區域生成網絡+Fast R-CNN的模型,用區域生成網絡(Region Proposal Network,簡稱RPN)來代替Fast R-CNN中的選擇性搜索方法,結構如圖15所示。
圖15 RPN網絡結構
步驟:
1)輸入任意大小的圖片,經過CNN網絡輸出特征圖,特征圖共享於后面兩步;
2)特征圖經過RPN層生成候選區域;
3)候選區域和特征圖共同輸入到RoI Pooling層,經過每個候選區域的特征圖,然后進行softmax分類,bbox預測。
5.1 RPN網絡
RPN網絡的主要作用是得出比較准確的候選區域。整個過程分為如下兩步:
- 用n×n(默認3×3=9)的大小窗口去掃描特征圖,每個滑窗位置映射到一個低維的向量(默認256維),並為每個滑窗位置考慮k種(在論文設計中k=9)可能的參考窗口(論文中稱為anchors)
- 低維特征向量輸入兩個並行連接的1 x 1卷積層然后得出兩個部分:reg窗口回歸層(用於修正位置)和cls窗口分類層(是否為前景或背景概率)
5.1.1 anchors
3*3卷積核的中心點對應原圖上的位置,將該點作為anchor的中心點,在原圖中框出多尺度、多種長寬比的anchors,三種尺度{ 128,256,512 }, 三種長寬比{1:1,1:2,2:1}
例如:
候選區域訓練
- 訓練樣本anchor標記
- 1.每個ground-truth box有着最高的IoU的anchor標記為正樣本
- 2.剩下的anchor/anchors與任何ground-truth box的IoU大於0.7記為正樣本,IoU小於0.3,記為負樣本
- 3.剩下的樣本全部忽略
- 正負樣本比例為1:3
- 訓練損失
- RPN classification (anchor good / bad) ,二分類,是否有物體,是、否
- RPN regression (anchor -> proposal) ,回歸
- 注:這里使用的損失函數和Fast R-CNN內的損失函數原理類似,同時最小化兩種代價
候選區域的訓練是為了讓得出來的正確的候選區域, 並且候選區域經過了回歸微調。
在這基礎之上做Fast RCNN訓練是得到特征向量做分類預測和回歸預測。
5.2 總結
- 優點
- 提出RPN網絡
- 端到端網絡模型
- 缺點
- 訓練參數過大
- 對於真實訓練使用來說還是依然過於耗時(RPN層,候選區域過多)
可以改進的需求:
- RPN(Region Proposal Networks)改進對於小目標選擇利用多尺度特征信息進行RPN;
- 速度提升 如YOLO系列算法,刪去了RPN,直接對proposal進行分類回歸,極大的提升了網絡的速度。
6. YOLO(You only look once)算法
6.1 流程理解
原始圖片resize到448x448,經過前面卷積網絡之后,將圖片輸出成了一個7×7×30的結構。
對於7×7的單元格,每個單元格預測兩個bbox框,然后進行NMS篩選,篩選概率以及IoU。
6.2 單元格(grid)
最后輸出網絡的7×7×30的特征圖怎么理解?
7×7=49個像素值,理解成49個單元格,每個單元格可以代表原圖中的一個方塊。單元格需要做兩件事情:
1)每個單元格負責預測一個物體類別,並且直接預測物體的概率值。
2)每個單元格預測兩個bbox位置,兩個bbox的置信度(confidence):7×7×2=98個bbox。
一個物體類別+兩個bbox位置+兩個confidence:(4+1+4+1+20)=30
其中,4代表位置信息,1為置信度代表一個bbox的結果,20代表20類的預測結果。
6.3 訓練過程
- 預測框對應的目標值標記
- confidence:格子內是否有目標
- 20類概率:標記每個單元格的目標類別
怎么理解這個過程?同樣以分類那種形式來對應,假設以一個單元格的預測值為結果,如下圖
6.4 YOLO總結
優點:速度快
缺點:准確率較低,對於相互靠近的物體(挨在一起且中點落在同一個grid cell時),還有小物體的檢測效果不好,主要是因為一個網格只預測了兩個框。
7. SSD(Single Shot MultiBox Detector)算法
7.1簡介
特點:SSD結合了YOLO的回歸思想以及Faster R-CNN的Anchor機制,使用全圖各個位置的多尺度區域進行 回歸,既保持了YOLO速度快的特征,也保證了窗口預測的跟Faster R-CNN一樣比較准確。
SSD的核心是在不同尺度的特征圖上采用卷積核來預測一系列Detector Bounding Boxes的類別、坐標偏移。
7.2 SSD的結構
7.3 SSD流程
SSD中引入了Defalut Box,實際上與Faster R-CNN的anchor box機制類似,就是預設一些目標預選框,不同的是在不同尺度feature map所有特征點上是使用不同的prior boxes。
7.4 Detector&Classifier
Detector & classifier的三個部分:
-
1.default boxes: 默認候選框
-
2.localization:4個位置偏移
-
3.confidence:21個類別置信度(要區分出背景)
上圖中每個像素生成3個候選框,每個候選框都生成一個localization和confidence。
參考如下代碼理解:
def ssd_multibox_layer(inputs, num_classes, sizes, ratios=[1], normalization=-1, bn_normalization=False): """Construct a multibox layer, return a class and localization predictions. """ net = inputs if normalization > 0: net = layers_utils.l2_normalization(net, scaling=True) # Number of anchors. num_anchors = len(sizes) + len(ratios) # Location. num_loc_pred = num_anchors * 4 loc_pred = slim.conv2d(net, num_loc_pred, [3, 3], activation_fn=None, scope='conv_loc') loc_pred = layers_utils.channel_to_last(loc_pred) loc_pred = tf.reshape(loc_pred, tensor_shape(loc_pred, 4)[:-1]+[num_anchors, 4]) # Class prediction. num_cls_pred = num_anchors * num_classes cls_pred = slim.conv2d(net, num_cls_pred, [3, 3], activation_fn=None, scope='conv_cls') cls_pred = layers_utils.channel_to_last(cls_pred) cls_pred = tf.reshape(cls_pred, tensor_shape(cls_pred, 4)[:-1]+[num_anchors, num_classes]) return cls_pred, loc_pred
假設如上圖的5×5×256的feature map。每個像素點對應3個default box。因此通過兩個3×3的卷積,分別輸出位置(3×4=12)和置信度(3×21(類別+背景)=63)。
如上圖所示,feature map上的每個像素生成3個bbox,一共有5*5*3=75個Default Box,類似Faster R-CNN的Anchor;其次,通過卷積得到5*5*12的feature map(12代表3*4,即3個Default Box的位置偏差);最后是通過卷積得到5*5*63的feature map(63=3*21,即3個Default Box的類別概率,一個21個類別,包括20個類別+1個背景)
總的輸出是5*5*(3+12+63)=5*5*78的feature map。
7.5 Default Box
default boxex類似於RPN當中的滑動窗口生成的候選框,SSD中也是對特征圖中的每一個像素生成若干個框。
7.6 localization與confidence
這兩者的意義如下,主要作用用來過濾,訓練
經過這一次過濾操作,會將候選框篩選出數量較少的prior boxes。
關於三種boxes的解釋區別:
- gournd truth boxes:訓練集中,標注好的待檢測類別的的位置,即真實的位置,目標的左下角和右上角坐標;
- default boxes:在feature map上每一個點上生成的某一類別圖片的位置。feature map每個點生成4或6個box(數量是事先指定的),格式為轉換過后的(x, y, w, h);
- prior boxes:經過置信度閾值篩選后,剩下的可能性高的boxes。這個box才是會被真正去做回歸;
SSD中的多個Detector & classifier有什么作用
SSD的核心是在不同尺度的特征圖上來進行Detector & classifier 容易使得SSD觀察到更小的物體
7.7 訓練
7.7.1 訓練流程
如下圖所示:
輸入->輸出->結果與ground truth標記樣本回歸損失計算->反向傳播, 更新權值
1)樣本標記
利用anchor與對應的ground truth進行標記正負樣本,每次並不訓練8732張計算好的default boxes, 先進行置信度篩選,並且訓練指定的正樣本和負樣本, 如下規則:
-
正樣本
- 1.與GT重合最高的boxes, 其輸出對應label設為對應物體;
- 2.物體GT與anchor iou滿足大於0.5;
-
負樣本:其它的樣本標記為負樣本
在訓練時, default boxes按照正負樣本控制positive:negative=1:3
2)損失
網絡輸出預測的predict box與ground truth回歸變換之間的損失計算, 置信度是采用 Softmax Loss(Faster R-CNN是log loss),位置回歸則是采用 Smooth L1 loss (與Faster R-CNN一樣)
7.7.1 測試流程
輸入->輸出->nms->輸出
8. 總結
物體檢測項目在另一篇文章中介紹。