R-CNN、SPP-Net、Fast R-CNN、Faster R-CNN總結
來自專欄對象檢測6 人贊了文章
這幾篇論文相繼提出,性能不斷提升。且每個演算法都是在前面的工作上進行改進,各演算法之間有較強的關聯性。閱讀了這幾篇處於世界級領先水平的目標檢測文章後,對他們做個總結(當然,目前又出現了更好的演算法如YOLO、SSD、Mask R-CNN等)。下面給出及幾篇文章的;鏈接:
- R-CNN:R-CNN——【CVPR2014】Rich feature hierarchies for accurate object detection and semantic segmentation
- SPP:SPP——【ECCV2014】Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition
- Fast R-CNN:Fast R-CNN——【ICCV2015】Fast R-CNN
- Faster R-CNN:Faster RCNN——【NIPS2015】Faster R-CNN_Towards Real-Time Object Detection with Region Proposal Networks
一、R-CNN
實現過程:
- 輸入一張多目標圖片,用selective search 算分提取約2K個建議框(region proposals);
- 對建議框進行padding=16處理(即邊界像素填充為16個像素值,像素值16作為建議框像素平均值),再直接縮放至227x227(這裡輸入cnn的圖片大小固定);
- 特徵提取:先把每個建議框像素值減去建議框像素平均值16,再把所有227x227大小的建議框作為AlexNet CNN網路的輸入,每個建議框通過CNN網路提取出4096維的特徵(原文中使用了AlexNet CNN網路並去掉了最後一個輸出層SoftMax,提取出4096維的特徵)。所有建議框提取的特徵組成2000x4096維矩陣。
- 將CNN網路提取的2000×4096維特徵與20個SVM組成的權值矩陣4096×20相乘(SVM是二分類器,給出是或否的答案),獲得2000×20維矩陣表示每個建議框是某個物體類別的得分;
- 分別對上述2000×20維矩陣中每一列即每一類進行非極大值抑制(NMS:non-maximum suppression)剔除重疊建議框,得到該列即該類中得分最高的一些建議框;
- 分別用20個回歸器對上述20個類別中剩餘的建議框進行回歸操作,最終得到每個類別的修正後的得分最高的bounding box。
註:具體的解釋可以看我的另一篇文章:
莉莉安啊:R-CNN學習筆記存在的問題:
- 特徵提取操作冗餘:selective search演算法提取的2k個region proposals都要進行一次CNN操作。
- 測試及訓練過程繁瑣:R-CNN網路訓練過程分為ILSVRC 2012樣本下有監督預訓練、PASCAL VOC 2007該特定樣本下的微調、20類即20個SVM分類器訓練、20類即20個Bounding-box 回歸器訓練,該訓練流程繁瑣複雜;同理測試過程也包括提取建議框、提取CNN特徵、SVM分類和Bounding-box 回歸等步驟,過於繁瑣;
- 需要大量存儲空間:進行bounding box回歸器訓練的時候需要CNN網路的pool5的特徵,所以需要在進行CNN網路運算的時候把這個特徵存儲在磁碟以備後用。
- 輸入圖片尺寸固定:通常固定尺寸採取crop或者warp。warp(壓縮)會造成幾何變形,crop(裁剪)會造成圖片信息不全。
二、SPP-Net
實現過程:
- 任意size圖片輸入CNN網路,經過若干卷積層與池化層【池化層用於減少參數,降維等】,得到feature map(特徵圖);
- 在任意size圖片上採用selective search演算法提取約2k個region proposals(建議框);
- 根據原圖中建議框到特徵圖映射關係,在特徵圖中找到每個建議框對應的特徵框。通過spatial pyramid pooling 將任意大小的特徵圖轉換成固定大小的特徵向量;
- 訓練SVM,BoundingBox回歸。這一步跟R-CNN一樣。
詳細說明
如何在feature maps中找到原始圖片中建議框的對應區域?
建議框是通過對原圖採用selective search演算法得到的,而feature maps的大小和原始圖片的大小是不同的,feature maps是經過原始圖片卷積、下採樣等一系列操作後得到的。那麼我們要如何在feature maps中找到對應的區域呢?這個答案可以在文獻中的最後面附錄中找到答案:APPENDIX A:Mapping a Window to Feature Maps。這個作者直接給出了一個很方便我們計算的公式:假設(x』,y』)表示特徵圖上的坐標點,坐標點(x,y)表示原輸入圖片上的點,那麼它們之間有如下轉換關係:
(x,y)=(S*x』,S*y』)
其中S的就是CNN中所有的strides的乘積(Strides包含了池化、卷積的stride)。比如paper所用的ZF-5:S=2*2*2*2=16
而對於Overfeat-5/7就是S=12,這個可以看一下下面的表格:
反過來,我們希望通過(x,y)坐標求解(x』,y』),那麼計算公式如下:
如何通過spatial pyramid pooling 將任意大小的特徵圖轉換成固定大小的特徵向量?
首先解釋什麼叫空間金字塔特徵提取。假設輸入一張任意大小的圖片,我們希望提取21個特徵,使用空間金字塔特徵提取的步驟如下:
如上圖所示,對輸入圖片,利用不同大小的刻度,對其劃分:
第一張圖片,我們把一張完整的圖片,分成了16個塊,也就是每個塊的大小就是(w/4,h/4);
第二張圖片,劃分了4個塊,每個塊的大小就是(w/2,h/2);
第三張圖片,把一整張圖片作為了一個塊,也就是塊的大小為(w,h)
最後總共可以得到16+4+1=21個塊,我們將從這21個塊中,每個塊提取出一個特徵,這樣剛好就是我們要提取的21維特徵向量。
空間金字塔最大池化的過程,其實就是從這21個圖片塊中,分別計算每個塊的最大值,從而得到一個輸出神經元。最後把一張任意大小的圖片轉換成了一個固定大小的21維特徵(當然你可以設計其它維數的輸出,增加金字塔的層數,或者改變劃分網格的大小)。上面的三種不同刻度的劃分,每一種刻度我們稱之為:金字塔的一層,每一個圖片塊大小我們稱之為:windows size了。
註:cnn網路主要包含卷積層、池化層、全連接層。根據計算規則可以發現,只有全連接層需要固定輸入圖片的大小,因此我們只需要在全連接層之前加上SPP-Net網路就可以滿足需求。相比於其他的CNN網路,SPPNet的優點是可以方便地進行多尺寸訓練,而且對於同一個尺度,其特徵也是個空間金字塔的特徵,綜合了多個特徵的空間多尺度信息。
三、Fast R-CNN
- 任意size圖片輸入CNN網路,經過若干卷積層與池化層【池化層用於減少參數,降維等】,得到feature map(特徵圖);
- 在任意size圖片上採用selective search演算法提取約2k個region proposals(建議框);
- 根據原圖中建議框到特徵圖映射關係,在特徵圖中找到每個建議框對應的特徵框。通過RoI 將任意大小的特徵圖轉換成固定大小的特徵向量;(自己的Fast R-CNN那篇博客理解有誤,這裡更正過來)
- 第4步所得特徵向量經由各自的全連接層【由SVD分解實現】,分別得到兩個輸出向量:一個是softmax的分類得分,一個是Bounding-box窗口回歸;
- 利用窗口得分分別對每一類物體進行非極大值抑制剔除重疊建議框,最終得到每個類別中回歸修正後的得分最高的窗口。
註:具體的解釋可以看我的另一篇文章:
莉莉安啊:Fast R-CNN四、SPP-Net、Fast R-CNN
SPP-Net、Fast R-CNN有什麼區別?
Fast R-CNN中對金字塔池化進行改進,使用了其特例(只使用了一層),變成了ROI pooling。它的輸入維度不定h*w,輸出維度固定H*W。只需要根據h/H和w/W來調整池化框的大小即可。
SPP-Net、Fast R-CNN的加速秘訣?
在R-CNN中需要提取2000個建議框並把框的尺寸固定後全部輸入cnn進行特徵提取,也就是說要進行2000次特徵提取,這大大的增加了計算量。因此,SPP-Net、Fast R-CNN都採取了同樣的手段:將一整張圖扔進cnn進行一次特徵提取,再單獨對原圖提取2000個建議框,最後通過建議框與特徵圖的對映關係得到特徵向量。此時再對此特徵向量通過池化(SPP-Net、Fast R-CNN的主要區別就在於這裡採取的池化方式不同)輸出固定維度的特徵向量。
SPP-Net、Fast R-CNN還有何不足?
通過上述說明可以看出,SPP-Net、Fast R-CNN仍然需要使用selective search演算法提取2000個建議框,Faster R-CNN就是針對這一缺點提出了改進措施。Faster R-CNN採用RPN網路提取建議框,實現了端到端的訓練,提高了檢測精度及檢測速度。
五、Faster R-CNN
實現過程:
- 首先向CNN網路【此處以ZF網路為例】輸入任意大小圖片;
- 經過CNN網路前向傳播至最後的卷積層,得到供RPN網路輸入的特徵圖;
- 供RPN網路輸入的特徵圖經過RPN網路得到建議框和建議框得分,並對區域得分採用非極大值抑制【閾值為0.7】,輸出其Top-N【文中為300】得分的建議框給RoI池化層;
- 第2步得到特徵圖和第3步輸出的建議框同時輸入RoI池化層將任意大小的特徵圖轉換成固定大小的特徵向量;
- 第4步得到的特徵向量通過全連接層後,輸出該區域的分類得分以及回歸後的bounding-box。
詳細說明(這裡只介紹RPN網路):
- 網路輸入:卷積網路得到的feature map:以ZF網路為例 輸出的feature map大小為:h*w*256(輸入是任意大小的圖片,所以輸出大小不固定);
- 網路輸出:h*w*k(k表示每個像素點的anchor box個數,本文取k=9)個anchor box的特徵向量。每個特徵向量是6維(yes,no,tx,ty,tw,th),分別表示代表了前景背景及位置坐標;
下面解釋這幅圖
- 上圖中紅色的框就是sliding window(注意sliding window只是選擇位置,除此之外沒有其它作用,和後面的3*3的卷積區分),大小為n*n(實現時n=3)
- anchor box:在特徵圖的每個像素點都給出9個不同尺寸的人為設定好的anchor box,這九個anchor box可以一一映射到原圖。同時,這些anchor box的中心就是sliding window的中心。下面是一個點的九個anchor boxes:
- 經過全連接層得到的256-d的向量:首先,這裡的全連接層實際上是通過RPN網路的第一層「卷積層」與feature map進行卷積得到的(卷積尺寸3*3*256,卷積核個數256個);其次,這個256-d的特徵向量僅僅針對一個sliding window(一個sliding window對應feature map上的一個像素點,對應這一個像素點預測的9個anchor box,這九個anchor box可以一一映射到原圖),換句話說這個256-d的特徵向量是feature map中的一個像素點在歸一化圖像上的信息(至於這個像素點跟原圖的多大區域的信息對應,這就跟感受野有關了)
- 得到的這個256維的特徵向量就會用於打分和回歸,它會與兩個全連接層連接,一個全連接層的神經元個數是2k,另一個全連接層的神經元個數是4k。
這256維的向量如何能包含九個anchor boxes?
feature map中的一個點在輸入圖像上的感受野是很大一片區域。而這個區域基本上可以包含想要的anchor boxes(anchor boxes的大小設定應該是跟原始圖像中想要檢測的目標大小有關)。即使沒有完整的包含anchor box也ok,因為如果找到了目標的中心一大部分信息,也能大致推斷出是否是目標以及目標的大致範圍(在某篇博客中看到的)。所以通過那256維的特徵向量就能獲得9個anchor的信息。
怎麼從同一個256維的向量中區分出9個框並挨個評分呢?
原文中有這樣一句話:並沒有顯式地提取任何候選窗口,完全使用網路自身完成判斷和修正。
首先看一下損失函數:
損失函數中 以及 是不同anchor boxes的真實情況。從損失函數定義可以看出,我們讓網路的輸出與anchor boxes真實的情況(是否為前景以及與GT的位置偏差)相差最小,因此,通過網路自身就能對之前預測那9個anchor box進行修正,最終選出與真實的ground truth最接近的作為輸出。
下圖為自己畫的一個示意圖,將就著看吧。。。
參考博客:
深度學習(六十四)Faster R-CNN物體檢測 - CSDN博客
R-CNN論文詳解 - CSDN博客
Faster R-CNN學習總結
聲明:本文只是記錄自己的學習過程,大部分文字內容並非原創,自己通過理解整合了前輩們的內容,如有侵權,請聯繫我。
推薦閱讀:
※告別PS,用神經網路給家裡的黑白老照片上色。
※基於深度學習的目標檢測演算法綜述
※TensorFlow從基礎到實戰:一步步教你創建交通標誌分類神經網路
※Course Notes:Neural Networks and Deep Learning Week 4
※一個專門用來模仿飛蛾識別味道的神經網路,說明了為什麼飛蛾的學習速度遠超機器