論文網頁:[https://handong1587.github.io/deep_learning/2015/10/09/object-detection.html]
R-CNN——SPPNet——Fast R-CNN——Faster R-CNN——YOLO——SSD
1. R-CNN
R-CNN流程:
第一階段(生成候選區域):
采用選擇性搜尋算法在所輸入的圖檔上提取出2000個左右最有可能是目标的候選區域。
第二階段(特征提取):
将候選框尺寸調整到227*227後輸入到預先訓練好的卷積神經網絡中進行特征提取。
注:CNN隻充當特征提取器。
第三階段(分類):
将CNN提取到的特征輸入到預先訓練好的SVM分類器中,得到各類别的評分,将一些分數較低的候選區域直接去掉,剩下的候選框會出現相交的情況,采用非極大值抑制技術去除備援的框。
說明:R-CNN論文中使用的CNN網絡是AlexNet,資料集時ImageNet。訓練CNN網絡時,先在資料集上訓練,再在目标檢測資料集上對訓練好的CNN做微調。
AlexNet:
ImageNet: ImageNet資料集是為了促進計算機圖像識别技術的發展而設立的一個大型圖像資料集。2016年ImageNet資料集中已經有超過千萬張圖檔,每一張圖檔都被手工标定好類别,其類别達上千個。
R-CNN的優點是利用了CNN優異的特征提取能力;缺點是計算量太大,通過Selective Search得到的有效區域往往在1000個以上,這就意味着CNN要進行1000多次的特征提取計算,另外,在訓練階段,還需要把所有特征儲存起來,再通過SVM進行訓練,這也是非常耗時且麻煩的。
2.SPPNet(spatial pyramid pooling convolutional networks)
SPPNet流程:
SPPNet主要做了一件事情:将CNN的輸入從固定尺寸改進為任意尺寸。SPPNet在普通的CNN結構中加入了ROI池化層(ROI Pooling),使得網絡的輸入圖像可以是人以尺寸的,輸出則不變,同樣是一個固定維數的向量。
ROI池化一般跟在卷積層後面,它的輸入是任意大小的卷積,輸出是固定維數的向量。
ROI池化層
為了說清楚為什麼ROI池化層能夠把任意大小的卷積特征轉換成固定長度的向量,不妨設卷積層輸出的寬度為w,高度為h,通道數為c。不管輸入的圖像尺寸是多少,卷積層的通道數都不會變,也就是說c是一個常數。而w,h會随着輸入圖像尺寸的變化而變化,可以看作是兩個變量。以上圖中的ROI池化為例,它首先把卷積層劃分為4x4的網格,每個網格的寬度為w/4,高是h/4,通道數為c。當不能整除時,需要取整。接着,對每個網格中的每個通道,都取出其最大值,就是對每個網格中的特征做最大值池化。這個4x4的網格最終形成16c維的特征。接着,再把網絡劃分為2x2的網格,用同樣的方法提取特征,提取的特征的長度為4c。再把網絡劃分為1x1的網格,提取的特征長度為c,最後的1x1的劃分實際是取出卷積中每個通道的最大值。最後将得到的特征拼接起來,得到的特征是16c+4c+c=21c維的特征。很顯然,這個輸出特征的長度與w、h兩個值無關,是以ROI池化層可以把任意寬度、高度的卷積特征轉換為固定長度的向量。
應該怎麼把ROI池化層用到目标檢測中來呢?其實,可以這樣考慮問題:網絡的輸入是一張圖像,中間經過若幹卷積形成了卷積特征,這個卷積特征實際上和原始圖像在位置上是有一對對應關系的。是以,原始圖像中的候選框,實際上也可以對應到卷積特征中相同位置的框。由于候選框的大小千變萬化,對應到卷積特征的區域形狀也各有不同,但是利用ROI池化層可以把卷積特征中的不同形狀的區域對應到同樣長度的向量特征。
SSPNet與R-CNN的不同點在于,R-CNN要對每個區域計算卷積,而SPPNet隻需要計算一次,是以SPPNet的效率比R-CNN高得多。它們的相同點在于,它們都遵循着提取候選區域,提取特征,分類三個步驟。在提取特征後,它們都使用了SVM進行分類。
3.Fast R-CNN
Fast R-CNN流程:
在SPPNet中,實際上特征提取和區域分類兩個步驟還是分離的。隻是使用ROI池化層提取了每個區域的特征,在對這些區域分類時,還是使用傳統的SVM作為分類器。Fast R-CNN相比SPPNet更進一步,不再使用SVM作為分類器,而是使用神經網絡進行分類,這樣就可以同時訓練特征提取網絡和分類網絡,進而取得比SPPNet更高的準确度。
對于原始圖檔中的候選框區域,和SPPNet中的做法一樣,都是将它映射到卷積特征的對應區域,然後使用ROI池化層對該區域提取特征。在這之後,SPPNet是使用SVM對特征進行分類,而Fast R-CNN則是直接使用全連接配接層。全連接配接層有兩個輸出,一個輸出負責分類,另一個輸出負責框回歸。
先說分類,假設要在圖像中檢測K類物體,那麼最終的輸出應該是K+1(包含背景)個數,每個數都代表該區域為某個類别的機率。再說框回歸,框回歸實際上要做的是對原始的檢測框進行某種程度的“校準”。因為使用Selective Search獲得的框有時存在一定偏差。設通過Selective Search得到的框的四個參數為(x,y,w,h),其中(x,y)表示框左上角的坐标位置,(w,h)表示框的寬度和高度。而真正的框的位置用(x’,y’,w’,h’)表示,框回歸就是要學習參數((x’-x)/w,(y’-y)/h,ln(w’/w),ln(h’/h)),前兩個參數表示與尺度無關的平移量,後兩個參數表示與尺度無關的縮放量。也就是說,Fast R-CNN使用一個網絡同時完成了提取特征,判斷類别,框回歸三項工作。
4.Faster R-CNN
Faster R-CNN流程:
Faster R-CNN中用RPN(Region Proposal Network)取代了Selective Search,不僅速度得到大大提高,而且還獲得了更加精确的結果。
RPN網絡結構
RPN還是需要先使用一個CNN網絡對原始圖檔提取特征,設這個前置的CNN提取的特征為51x39x256,即高位51,寬為39,通道數為256.對這個卷積特征再進行一次卷積計算,保持寬,高,通道數不變,再次得到一個51x39x256的特征。為了友善叙述,先來定義一個“位置”的概念:對于一個51x39x256的卷積特征,稱它一共有51x39個“位置”。讓新的卷積特征的每一個“位置”都“負責”原圖中對應位置9中尺寸的框的檢測,檢測的目标是判斷框中是否存在一個物體,是以共有51x39x9個“框”。在Faster R-CNN的原論文中,将這些框都統一稱為“anchor”。
anchor的9種尺寸如下圖所示,它們的面積分别為128²,256²,512²。每種面積又分為3種長寬比,分别為2:1,1:2,1:1。anchor的尺寸實際是屬于可調的參數,不同任務可以選擇不同的尺寸。
Faster R-CNN中的anchor
對于51x39個位置和51x39x9個anchor,下圖展示了接下來每個位置的計算步驟。設k為單個位置對應的anchor的個數,此時k=9.首先使用一個3x3的滑動視窗,将每個位置轉換為一個統一的256維的特征,這個特征對應了兩部分的輸出。一部分表示該位置的anchor為物體的機率,這部分的總輸出長度為2xk(一個anchor對應兩個輸出:是物體的機率+不是物體的機率)。另一部分為框回歸,框回歸的含義與Fast R-CNN中一樣,一個anchor對應4個框回歸參數,是以框回歸部分的總輸出的長度為4xk。
anchor與網絡輸出的對應關系
Faster R-CNN使用RPN生成候選框後,剩下的網絡結構和Fast R-CNN中的結構一模一樣。在訓練過程中,需要訓練兩個網絡,一個是RPN網絡,一個是在得到框之後使用的分類網絡。通常的做法是交替訓練,即在一個batch内,先訓練RPN網絡一次,再訓練分類網絡一次。
R-CNN,Fast R-CNN,Faster R-CNN的對比
5.YOLO
YOLO流程:
将一幀圖像分解為7x7個網格單元,物體落入到哪個格子就由哪個格子負責檢測,判斷物體是否落入某個格子的标準是:該物體的中心落入到了格子裡。每個網格單元預測出兩個候選區域,即7x7x2=98個可能的目标,網絡預測回歸出目标的位置資訊(x,y),尺寸資訊(w,h),置信度以及對應的每個類别的機率資訊。
6.SSD
SSD流程:
SSD預測目标的位置使用的是目标位置周圍局部的特征。SSD網絡結構利用了Faster R-CNN模型中的anchor機制和YOLO模型中單個神經網絡檢測思路,是以它既保留了Faster R-CNN的準确率又有YOLO的檢測速度,可以實作高準确率的實時檢測。
SSD的基本思想是基于卷積神經網絡,産生固定大小的邊界框位置偏移量,以及每個框中包含物體的機率得分後,使用非極大值抑制方法得到最終的檢測結果。