淺談深度神經網絡 — R-CNN(區域卷積神經網絡)R-CNN->Fast R-CNN->Faster R-CNN

在這裏插入圖片描述

R-CNN(區域卷積神經網絡)

在這裏插入圖片描述
模型發展圖

1. 引言

目標檢測(Object Detection) 就是一種基於目標幾何和統計特徵的圖像分割,它將目標的分割和識別合二爲一,通俗點說就是給定一張圖片要精確的定位到物體所在位置,並完成對物體類別的識別。其準確性實時性是整個系統的一項重要能力。

R-CNN的全稱是Region-CNN (區域卷積神經網絡),是第一個成功將深度學習應用到目標檢測上的算法。R-CNN基於卷積神經網絡(CNN),線性迴歸,和支持向量機(SVM)等算法,實現目標檢測技術。

但是這個問題並沒有想象的那麼簡單,首先物體的尺寸變化很大,物體擺放的角度不同,形態各異,而且可以出現在圖片的任何地方,有些物體還具有多個類別。

2. 任務

R-CNN主要就是用了做目標檢測任務的。先簡單瞭解下目標檢測,我的通俗理解是對於給定圖片精確的找到物體所在的位置,並且標註物體的類別(一張圖像中含有一個或多個物體)。

輸入:image
輸出:類別標籤(Category label);位置(最小外接矩形 / Bounding Box)

模型構思
按分類問題對待可分爲兩個模塊:

  • 模塊一:提取物體區域(Region proposal)
  • 模塊二:對區域進行分類識別(Classification)

主要難度: 在提取區域上需要面臨 不同位置,不同尺寸,提取數量很多的問題。在分類識別方面主要面對CNN分類及計算量大的問題。

3. 傳統方法 -> R-CNN

3.1 模型概述

傳統的目標檢測方法大多以圖像識別爲基礎。 一般可以在圖片上使用窮舉法選出所所有物體可能出現的區域框,對這些區域框提取特徵並使用圖像識別方法分類, 得到所有分類成功的區域後,通過非極大值抑制(Non-maximumsuppression)輸出結果。

R-CNN遵循傳統目標檢測的思路,同樣採用提取框,對每個框提取特徵、圖像分類、 非極大值抑制四個步驟進行目標檢測。只不過在提取特徵這一步,將傳統的特徵(如 SIFT、HOG 特徵等)換成了深度卷積網絡提取的特徵。

3.2 R-CNN詳細步驟

在這裏插入圖片描述
R-CNN的步驟如下(對應上圖):

  1. 圖像輸入 輸入待檢測的圖像。

  2. 區域建議(Region proposals) 對第一步輸入的圖像進行區域框的選取。常用的方法是Selective Search EdgeBox,主要是利用圖像的邊緣、紋理、色彩、顏色變化等信息在圖像中選取2000個可能存在包含物體的區域(這一步驟 選擇可能存在物體的區域,跟分類無關 ,包含一個物體)。

  3. 特徵提取 使用CNN網絡對選取的2000存在物體的潛在區域進行特徵提取。但是可能存在一些問題,由於上一步Region proposals所提取出來的圖像的尺寸大小是不一樣的,我們需要卷積後輸出的特徵尺度是一樣的,所以要將Region proposals選取的區域進行一定的縮放處理(warped region)成統一的227x227的大小,再送到CNN中特徵提取。
    R-CNN特徵提取用的網絡是對ImageNet上的AlexNet(AlexNet網絡詳解)的CNN模型進行pre-train(以下有解釋,可先行了解pre-train)得到的基本的網絡模型。然後需要對網絡進行fine-tune,這時網絡結構需要一些修改,因爲AlexNet是對1000個物體分類,fc7輸出爲1000,因此我們需要改爲(class + 1)若類別數爲20則應改爲20+1=21個節點,加一的原因是對圖像背景類識別,判斷是不是背景。其他的都用AlexNet的網絡結構fine-tune(全連接),其中包括五層卷積和兩層全連接層。 (在這裏使用的是ImageNet競賽上面訓練好的AlexNet模型去除最後兩層全連接層的模型(也可以是VGG,GoogLeNet,ResNet等)。特徵提取用的是卷積神經網絡代替了傳統的HOG特徵,Haar特徵等取特徵的方法。)

  4. SVM分類 將提取出來的特徵送入SVM分類器得到分類模型,在這裏每個類別對應一個SVM分類器,如果有20個類別,則會有20SVM分類器。對於每個類別的分類器只需要判斷是不是這個類別的,如果同時多個結果爲Positive則選擇概率之最高的。

  5. Bounding Box Regression 這個迴歸模型主要是用來修正由第二步Region proposals得到的圖像區域。同第四步的分類一樣,每個類別對應一個Regression模型。這個Bounding Box Regression主要是爲了精準定位。它所做的就是把舊的區域(SS算法生成的區域)Pi=(Pxi,Pyi,Pwi,Phi)P^i=(P^i_x,P^i_y,P^i_w,P^i_h)重新映射到新的區域Gi=(Gxi,Gyi,Gwi,Ghi)G^i=(G^i_x,G^i_y,G^i_w,G^i_h),其中 - 中心位置(x,y)(x,y) -寬高尺寸(w,h)(w,h)
    在這裏插入圖片描述
    上圖中 ww_* 是我們要學習的參數矩陣,一共對應四個參數各有一個 ww_*矩陣。 左圖下面四個式子tit_*^i 分別是在直角座標系和極座標系下的比例關係。左圖第一個式子中tit_*^i 對應下面四個式子,WTϕ5(Pi)W^T_*\phi_5(P^i)可以但國足是變化delta或是一個修正,後面的範式則是正則項。在測試的時候我們首先求得delta(右圖最後一個式子),之後分別求得四個區域參數。

  6. 使用非極大值抑制輸出(針對於測試階段) 可能幾個區域選擇的是同一個區域內的物體,爲了獲得無冗餘的區域子集。通過使用非極大值抑制(loU>=0.5)獲取無冗餘的區域子集。主要有以下幾步:

    ① 所與區域分值從大到小排列
    ② 剔除冗餘,與最大分值區域loU>=0.5的所有區域
    ③ 保留最大分值區域,剩餘區域作爲新的候選集
    在這裏插入圖片描述

3.3 對以上出現的一些概念的解釋:

3.3.1 pre-train

預訓練,拿一個在其他訓練集上面訓練好的模型作爲初始模型,共用層的參數是相同的已經在其他訓練集上面訓練好的。e.g. ImageNet是一個很大的數據集,它的1000個分類基本涵蓋主要的物體識別,是比較權威的,在前卷積層特徵提取已經比較成熟,我們就可以直接把模型的結構參數拿過來直接使用。

3.3.2 fine-tune

再訓練,把模型拿過來針對現在要解決問題的數據集再次訓練,以更加適應現在數據集。e.g. 我們要分類的物體不包含在ImageNet分類中,則需要針對現在的數據集再訓練,重新訓練得到參數。

3.3.3 IoU(Intersection over Union)

在這裏插入圖片描述
IoUIntersection over Union=AB/AB=SI/(SA+SBSI)IoU(Intersection\ over\ Union) = (A\bigcap B)/(A\bigcup B)= SI/(SA+SB-SI)

3.4 一些問題

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恰好可以解決這個問題。

4. SPP-Net網絡

4.1 模型概述

SPP:Spatial Pyramid Pooling(空間金字塔池化) SPP-Net是出自2015年發表在IEEE上的論文-《Spatial Pyramid Pooling in Deep ConvolutionalNetworks for Visual Recognition》。

空間金字塔池化, ROI Pooling詳解 : SPPROI Pooling

衆所周知,CNN一般都含有卷積部分和全連接部分,其中,卷積層不需要固定尺寸的圖像,而全連接層是需要固定大小的輸入。所以當全連接層面對各種尺寸的輸入數據時,就需要對輸入數據進行crop(crop就是從一個大圖扣出網絡輸入大小的patch,比如227×227),或warp(把一個邊界框bounding box的內容resize成227×227)等一系列操作以統一圖片的尺寸大小,比如224224(ImageNet)、3232(LenNet)、96*96等。
在這裏插入圖片描述
正如你在上圖中看到的,在R-CNN中,“因爲取出的區域大小各自不同,所以需要將每個Region Proposal縮放(warp)成統一的227x227的大小並輸入到CNN”。

但warp/crop這種預處理,導致的問題要麼被拉伸變形、要麼物體不全,限制了識別精確度。沒太明白?說句人話就是,一張16:9比例的圖片你硬是要Resize成1:1的圖片,你說圖片失真不?

SPP Net的作者Kaiming He等人逆向思考,既然由於全連接FC層的存在,普通的CNN需要通過固定輸入圖片的大小來使得全連接層的輸入固定。那借鑑卷積層可以適應任何尺寸,爲何不能在卷積層的最後加入某種結構,使得後面全連接層得到的輸入變成固定的呢?
在這裏插入圖片描述

4.2 兩個特點

它的特點有兩個:

  1. 結合空間金字塔方法實現CNN的多尺度輸入。SPP Net的第一個貢獻就是在最後一個卷積層後,接入了金字塔池化層,保證傳到下一層全連接層的輸入固定。
    換句話說,在普通的CNN機構中,輸入圖像的尺寸往往是固定的(比如224*224像素),輸出則是一個固定維數的向量。SPP Net在普通的CNN結構中加入了ROI池化層(ROI Pooling),使得網絡的輸入圖像可以是任意尺寸的,輸出則不變,同樣是一個固定維數的向量。
    簡言之,CNN原本只能固定輸入、固定輸出,CNN加上SSP之後,便能任意輸入、固定輸出。
    ROI池化層一般跟在卷積層後面,此時網絡的輸入可以是任意尺度的,在SPP layer中每一個pooling的filter會根據輸入調整大小,而SPP的輸出則是固定維數的向量,然後給到全連接FC層。

  2. 只對原圖提取一次卷積特徵。在R-CNN中,每個候選框先resize到統一大小,然後分別作爲CNN的輸入,這樣是很低效的。
    而SPP Net根據這個缺點做了優化:只對原圖進行一次卷積計算,便得到整張圖的卷積特徵feature map,然後找到每個候選框在feature map上的映射patch,將此patch作爲每個候選框的卷積特徵輸入到SPP layer和之後的層,完成特徵提取工作。
    如此這般,R-CNN要對每個區域計算卷積,而SPPNet只需要計算一次卷積,從而節省了大量的計算時間,比R-CNN有一百倍左右的提速。

4.3 總結: 2大改進

  • 直接輸入整圖,所有區域共享卷積計算(一遍),在CNN輸出上提取所有區域的特徵
  • 引入空間金字塔池化(Spatial Pyramid Pooling),爲不同的尺寸區域在CNN輸出上提取特徵,映射到固定尺寸的全連接層上。

SPP-Net網絡使用了SPP技術實現了① 共享計算適應不同輸入的尺寸

4.4 SPP-Net一些問題

繼承了R-CNN的問題

① 需要存儲大量特徵
② 複雜的多階段訓練
③ 訓練時間長

5 . Fast R-CNN網絡

空間金字塔池化, ROI Pooling詳解 : SPPROI Pooling

5.1 改進

  • 比R-CNN,SPP-Net更快的train/test,更高的準確率,召回率。
  • 實現end-to-end(端對端)單階段訓練,使用多任務損失函數。
  • 所有層都可以fine-tune
  • 不需要離線存儲特徵文件

引入2個新技術:

  • 感興趣區域池化層(Rol pooling layer
    其實就是是空間金字塔池化特殊形式,空間金字塔池化單層特例。(詳細內容這裏不再敘述)
  • 多任務損失函數(Multi-task loss)

5.2 結構

在這裏插入圖片描述

5.3 概述

R-CNN框架圖對比,可以發現主要有兩處不同:一是最後一個卷積層後加了一個ROI pooling layer,二是損失函數使用了多任務損失函數(multi-task loss),將邊框迴歸Bounding Box Regression直接加入到CNN網絡中訓練(關於什麼是邊框迴歸,請參看七月在線APP題庫大題查看深度學習分類下第56題:https://www.julyedu.com/question/big/kp_id/26/ques_id/2139)。

(1) ROI pooling layer實際上是SPP-NET的一個精簡版,SPP-NET對每個proposal使用了不同大小的金字塔映射,而ROI pooling layer只需要下采樣到一個7x7的特徵圖。對於VGG16網絡conv5_3有512個特徵圖,這樣所有region proposal對應了一個77512維度的特徵向量作爲全連接層的輸入。

換言之,這個網絡層可以把不同大小的輸入映射到一個固定尺度的特徵向量,而我們知道,conv、pooling、relu等操作都不需要固定size的輸入,因此,在原始圖片上執行這些操作後,雖然輸入圖片size不同導致得到的feature map尺寸也不同,不能直接接到一個全連接層進行分類,但是可以加入這個神奇的ROI Pooling層,對每個region都提取一個固定維度的特徵表示,再通過正常的softmax進行類型識別。

(2) R-CNN訓練過程分爲了三個階段,而Fast R-CNN直接使用softmax替代SVM分類,同時利用多任務損失函數邊框迴歸也加入到了網絡中,這樣整個的訓練過程是端到端的(除去Region Proposal提取階段)。

也就是說,之前R-CNN的處理流程是先提proposal,然後CNN提取特徵,之後用SVM分類器,最後再做bbox regression,而在Fast R-CNN中,作者巧妙的把bbox regression放進了神經網絡內部,與region分類和併成爲了一個multi-task模型,實際實驗也證明,這兩個任務能夠共享卷積特徵,並相互促進。
在這裏插入圖片描述
所以,Fast-RCNN很重要的一個貢獻是成功的讓人們看到了Region Proposal + CNN這一框架實時檢測的希望,原來多類檢測真的可以在保證準確率的同時提升處理速度,也爲後來的Faster R-CNN做下了鋪墊。

畫一畫重點:
R-CNN有一些相當大的缺點(把這些缺點都改掉了,就成了Fast R-CNN)。
大缺點:由於每一個候選框都要獨自經過CNN,這使得花費的時間非常多。
解決:共享卷積層,現在不是每一個候選框都當做輸入進入CNN了,而是輸入一張完整的圖片,在第五個卷積層再得到每個候選框的特徵

原來的方法:許多候選框(比如兩千個)–>CNN–>得到每個候選框的特徵–>分類+迴歸
現在的方法:一張完整圖片–>CNN–>得到每張候選框的特徵–>分類+迴歸

所以容易看見,Fast R-CNN相對於R-CNN的提速原因就在於:不過不像R-CNN把每個候選區域給深度網絡提特徵,而是整張圖提一次特徵,再把候選框映射到conv5上,而SPP只需要計算一次特徵,剩下的只需要在conv5層上操作就可以了。

在性能上提升也是相當明顯的:
在這裏插入圖片描述

5.4 多任務損失函數

分類器loss:
Lcls(p,u)=logpuL_{cls}(p,u) = -logp^u
bounding box迴歸L1 loss:

Lloc(tu,v)=iϵ{x,y,w,h}smoothL1(tiuvi)L_{loc}(t^u,v)= \sum_{i\epsilon \{x,y,w,h\}}smooth_{L_1}(t_i^u-v_i)

多任務損失函數:
L(p,u,tu,v)=Lcls(p,u)+λ[u1]Lloc(tu,v)L(p,u,t^u,v)= L_{cls}(p,u) +\lambda [u\geq 1]L_{loc}(t^u,v)

6 . Faster R-CNN網絡

在這裏插入圖片描述
同 Fast R-CNN 相比 Faster R-CNN引入了RPN(Region Proposal Network)即 Faster R-CNN = Fast R-CNN + RPN

6.1 RPN網絡介紹參考:

(RegionProposal Network)RPN網絡結構及詳解

6.2 集成RPN網絡(Region Proposal NetWork)的優點

  • 取代離線Selective Search模塊,解決性能瓶頸(之前提取的區域建議都是離線存儲的)
  • 進一步共享卷積層計算
  • 基於Attention注意機制,引導Fast R-CNN關注區域
  • Region proposals量少質優
  • 高準確率,召回率

6.3 RPN網絡loss

L({pi},{ti})=1NclsiLcls(pi,pi)+λ1NregipiLreg(ti,ti)L(\{pi\},\{ti\})=\frac1 {N_{cls}}∑_iL_{cls}(pi,p^∗_i)+λ\frac1 {N_{reg}}∑_ip^∗_iL_{reg}(t_i,t^∗_i)

6.4 訓練過程(分步訓練)

Step1 - 訓練RPN網絡

  • 卷集層初始化 使用ImageNet上pre-train模型參數

Step2 - 訓練Fast R-CNN網絡

  • 卷集層初始化 使用ImageNet上pre-train模型參數
  • Region proposals由Step1的RPN生成

Step3 - 調優RPN網絡

  • 卷集層初始化 Fast R-CNN的卷積層參數
  • 固定卷積層,finetune剩餘層

Step4 - 調優Fast R-CNN網絡

  • 固定卷積層,finetune剩餘層
  • Region proposals由Step3的RPN生成

7. 小結:

最後總結一下各大算法的步驟:
RCNN
1.在圖像中確定約1000-2000個候選框 (使用選擇性搜索Selective Search)
2.每個候選框內圖像塊縮放至相同大小,並輸入到CNN內進行特徵提取
3.對候選框中提取出的特徵,使用分類器判別是否屬於一個特定類
4.對於屬於某一類別的候選框,用迴歸器進一步調整其位置

Fast R-CNN
1.在圖像中確定約1000-2000個候選框 (使用選擇性搜索Selective Search)
2.對整張圖片輸進CNN,得到feature map
3.找到每個候選框在feature map上的映射patch,將此patch作爲每個候選框的卷積特徵輸入到SPP layer和之後的層
4.對候選框中提取出的特徵,使用分類器判別是否屬於一個特定類
5.對於屬於某一類別的候選框,用迴歸器進一步調整其位置

Faster R-CNN
1.對整張圖片輸進CNN,得到feature map
2.卷積特徵輸入到RPN,得到候選框的特徵信息
3.對候選框中提取出的特徵,使用分類器判別是否屬於一個特定類
4.對於屬於某一類別的候選框,用迴歸器進一步調整其位置

簡言之,即如本文開頭所列
R-CNN(Selective Search + CNN + SVM)
SPP-net(ROI Pooling)
Fast R-CNN(Selective Search + CNN + ROI)
Faster R-CNN(RPN + CNN + ROI)

R-CNN, SPP-NET, Fast R-CNN, Faster R-CNN一路走來,基於深度學習目標檢測的流程變得越來越精簡,精度越來越高,速度也越來越快。

8. 參考:

算法之道 結構之法 : https://blog.csdn.net/v_JULY_v/article/details/80170182
RPN網絡結構及詳解: https://blog.csdn.net/qq_36269513/article/details/80421990
ROI Pooling:https://blog.csdn.net/H_hei/article/details/89791176
SPP-Net: https://blog.csdn.net/H_hei/article/details/87298459

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章