深度學習_目標檢測_Fast R-CNN詳解

論文地址:Fast R-CNN

Fast R-CNN創新點

  1. 規避R-CNN中冗餘的特徵提取操作,只對整張圖像全區域進行一次特徵提取。
  2. 用RoI pooling層取代最後一層max pooling層,同時引入建議框信息,提取相應建議框特徵。
  3. Fast R-CNN網絡末尾採用並行的不同的全連接層,可同時輸出分類結果和窗口迴歸結果,實現了end-to-end的多任務訓練【建議框提取除外】,也不需要額外的特徵存儲空間【R-CNN中這部分特徵是供SVM和Bounding-box regression進行訓練的】。
  4. 採用SVD對Fast R-CNN網絡末尾並行的全連接層進行分解,減少計算複雜度,加快檢測速度。

促使Fast R-CNN產生的原因

  1. R-CNN網絡訓練、測試速度都很慢:R-CNN網絡中,一張圖經由selective search算法提取約2k個建議框【這2k個建議框大量重疊】,而所有建議框變形後都要輸入AlexNet CNN網絡提取特徵【即約2k次特徵提取】,會出現上述重疊區域多次重複提取特徵,提取特徵操作冗餘。
  2. R-CNN網絡訓練、測試繁瑣:R-CNN網絡訓練過程分爲ILSVRC 2012樣本下有監督預訓練、PASCAL VOC 2007該特定樣本下的微調、20類即20個SVM分類器訓練、20類即20個Bounding-box迴歸器迴歸等步驟,過於繁瑣。
  3. R-CNN網絡訓練需要大量存儲空間:20類即20個SVM分類器和20類即20個bounding-box迴歸器在訓練過程中需要大量特徵作爲訓練樣本,這部分從CNN提取的特徵會佔用大量存儲空間。
  4. R-CNN網絡需要對建議框進行變形操作後【形變爲227×227227\times227size】再輸入CNN網絡提取特徵,其實像AlexNet網絡在提取特徵過程中對圖像的大小並無要求,只是在提取完特徵進行全連接操作的時候才需要固定特徵尺寸【R-CNN中將輸入圖像形變爲227×227227\times227正好滿足AlexNet網絡最後的特徵尺寸要求】,然後才使用SVM分類器分類,R-CNN需要進行形變操作的問題在Fast R-CNN已經不存在。

Fast R-CNN如何解決問題

測試過程

Fast R-CNN的網絡結構如下圖所示:

在這裏插入圖片描述

  1. 任意size圖片輸入CNN網絡,經過若干卷積層與池化層,得到特徵圖。
  2. 在任意size圖片上採用selective search算法提取約2k個建議框。
  3. 根據原圖中建議框到特徵圖映射關係在特徵圖中找到每個建議框對應的特徵框【深度和特徵圖一致】,並在RoI池化層中將每個特徵框池化到H×WH\times WVGG-16網絡是7×77\times7】的size。
  4. 固定H×WH\times WVGG-16網絡7×77\times7】大小的特徵框經過全連接層得到固定大小的特徵向量。
  5. 第4步所得特徵向量經由各自的全連接層【由SVD分解實現】,分別得到兩個輸出向量:一個是Softmax的分類得分,一個是Bounding-box窗口迴歸。
  6. 利用窗口得分分別對每一類物體進行非極大值抑制剔除重疊建議框,最終得到每個類別中迴歸修正後的得分最高的窗口。

解釋分析

  1. 整個測試過程什麼可以只進行一次CNN特徵提取操作?
    先看R-CNN網絡,它首先採用selective search算法提取約2k個建議框,並對所有建議框都進行了CNN特徵提取操作,會出現重疊區域多次重複提取特徵,這些操作非常耗時、耗空間。事實上我們並不需要對每個建議框都進行CNN特徵提取操作,只需要對原始的整張圖片提取出特徵圖後,再找出相應建議框在特徵圖中對應的區域,這樣就可以避免冗餘的特徵提取操作,節省大量時間。

  2. 爲什麼要將每個建議框對應的特徵框池化到H×WH\times W的size?如何實現?
    問題4中已經指出像AlexNet等網絡在提取特徵過程中對圖像的大小並無要求,只是在提取完特徵進行全連接操作的時候才需要固定特徵尺寸,利用這一點,Fast R-CNN可輸入任意size圖片,並在全連接操作前加入RoI池化層,將建議框對應特徵圖中的特徵框池化到H×WH\times W的size,以便滿足後續操作對size的要求。

    具體如何實現呢?
    首先假設建議框對應特徵圖中的特徵框大小爲h×wh\times w,將其劃分爲H×WH\times W個子窗口,每個子窗口大小爲h/H×w/wh/H\times w/w,然後對每個子窗口採用max pooling下采樣操作,每個子窗口只取一個最大值,則特徵框最終池化爲H×WH\times W的size【特徵框各深度同理】,這將各個大小不一樣的特徵框轉化爲大小統一的數據輸入下一層。

  3. 爲什麼要採用SVD分解實現Fast R-CNN網絡中最後的全連接層?具體如何實現?
    圖像分類任務中,用於卷積層計算的時間比用於全連接層計算的時間多,而在目標檢測任務中,selective search算法提取的建議框比較多【約2k】,幾乎有一半的前向計算時間被花費於全連接層,就Fast R-CNN而言,RoI池化層後的全連接層需要進行約2k次【每個建議框都要計算】,因此在Fast R-CNN中可以採用SVD分解加速全連接層計算。

    具體如何使實現?
    一.物體分類和窗口迴歸都是通過全連接層實現的,假設全連接層輸入數據爲xx,輸出數據爲yy,全連接層參數爲WW,尺寸爲u×vu\times v,那麼該層全連接計算爲:y=Wxy=Wx計算複雜度爲u×vu\times v
    二.若將WW進行SVD分解,並用前t個特徵值近似代替,即:

    W=UVTU(u,1:t)(1:t,1:t)V(v,1:t)TW = U\sum V^T\approx U(u,1:t)·\sum (1:t,1:t)· V(v,1:t)^T

    那麼原來的前向傳播分解成兩步:

    y=Wx=U(VT)x=Uzy=Wx=U·(\sum V^T)·x=U·z

    計算複雜度爲u×t+v×tu\times t+v\times t,若t < min(u,v),則這種分解會大大減少計算量。

    在實現時,相當於把一個全連接層拆分爲兩個全連接層,第一個全連接層不含偏置,第二個全連接層含偏置。實驗表明,SVD分解全連接層能使mAP只下降0.3%的情況下提升30%的速度,同時該方法也不必再執行額外的微調操作。

在這裏插入圖片描述

  1. 文中僅採用selective search算法提取約2k個候選區域,那候選區域越多約好嗎?
    文中利用selective search算法提取1k-10k中10種數目【1k,2k…】的候選區域進行訓練測試,發現隨着候選區域個數的增加,mAP成先增長後緩慢下滑的趨勢,這表明更多的候選區域會有損精度。與此同時,作者也做了召回率【所謂召回率即候選區域爲真的窗口與Ground Truth的比值【IoU大於閾值即爲真】】分析實驗,發現隨着候選區域個數的增加,召回率並沒有和mAP成很好的相關性,而是一直不斷增加,也就是說更高的召回率並不意味着更高的mAP。

    文中也以selective search算法提取的2k個候選區域爲基礎,每次增加1000×2,4,6,8,10,32,451000\times {2,4,6,8,10,32,45}個密集box【滑動窗口方法】進行訓練測試,發現mAP比只有selective search方法的2k候選區域下降幅度更大,最終達到53%。

  2. 如何處理尺度不變性問題?即如何使24×24和1080×720的車輛同時在一個訓練好的網絡中都能正確識別?
    文中提及兩種方式處理:brute-force(單一尺度)和image pyramids(多尺度)。單一尺度直接在訓練和測試階段將image定死爲某種scale,直接輸入網絡訓練就好,然後期望網絡自己能夠學習到scale-invariance的表達;多尺度在訓練階段隨機從圖像金字塔【縮放圖片的scale得到,相當於擴充數據集】中採樣訓練,測試階段將圖像縮放爲金字塔中最爲相似的尺寸進行測試;

    可以看出,多尺度應該比單一尺度效果好。作者在5.2節對單一尺度和多尺度分別進行了實驗,不管哪種方式下都定義圖像短邊像素爲s,單一尺度下s=600【維持長寬比進行縮放】,長邊限制爲1000像素;多尺度s={480,576,688,864,1200}【維持長寬比進行縮放】,長邊限制爲2000像素,生成圖像金字塔進行訓練測試;實驗結果表明AlexNet【S for small】、VGG_CNN_M_1024【M for medium】下單一尺度比多尺度mAP差1.2%~1.5%,但測試時間上卻快不少,VGG-16【L for large】下僅單一尺度就達到了66.9%的mAP【由於GPU顯存限制多尺度無法實現】,該實驗證明了深度神經網絡善於直接學習尺度不變形,對目標的scale不敏感。

  3. 爲什麼不沿用R-CNN中的形式繼續採用SVM進行分類?
    爲什麼R-CNN中採用SVM分類而不直接用CNN網絡輸出端進行分類已經在R-CNN博客中說明,針對Fast R-CNN,文中分別進行實驗並對比了採用SVM和採用softmax的mAP結果,不管AlexNet【S for small】、VGG_CNN_M_1024【M for medium】、VGG-16【L for large】中任意網絡,採用softmax的mAP都比採用SVM的mAP高0.1%~0.8%,這是由於softmax在分類過程中引入了類間競爭,分類效果更好。

    Fast R-CNN去掉了SVM這一步,所有的特徵都暫存在顯存中,就不需要額外的磁盤空間。

訓練過程

有監督預訓練

樣本 來源
正樣本 ILSVRC 20XX
負樣本 ILSVRC 20XX

ILSVRC 20XX樣本只有類別標籤,有1000種物體。

文中採用AlexNet【S for small】、VGG_CNN_M_1024【M for medium】、VGG-16【L for large】這三種網絡分別進行訓練測試,下面僅以VGG-16舉例。

特定樣本下的微調

樣本 比例 來源
正樣本 25% 與某類Ground Truth相交IoU∈[0.5,1]的候選框
負樣本 75% 與20類Ground Truth相交IoU中最大值∈[0.1,0.5)的候選框

PASCAL VOC數據集中既有物體類別標籤,也有物體位置標籤,有20種物體;
正樣本僅表示前景,負樣本僅表示背景;
迴歸操作僅針對正樣本進行;
該階段訓練集擴充方式:50%概率水平翻轉;

微調前,需要對有監督預訓練後的模型進行3步轉化:
①RoI池化層取代有監督預訓練後的VGG-16網絡最後一層池化層。
②兩個並行層取代上述VGG-16網絡的最後一層全連接層和softmax層,並行層之一是新全連接層1+原softmax層1000個分類輸出修改爲21個分類輸出【20種類+背景】,並行層之二是新全連接層2+候選區域窗口迴歸層,如下圖所示。
③上述網絡由原來單輸入:一系列圖像修改爲雙輸入:一系列圖像和這些圖像中的一系列候選區域。

在這裏插入圖片描述

SGD超參數選擇:
除了修改增加的層,原有的層參數已經通過預訓練方式初始化。
用於分類的全連接層以均值爲0、標準差爲0.01的高斯分佈初始化,用於迴歸的全連接層以均值爲0、標準差爲0.001的高斯分佈初始化,偏置都初始化爲0。
針對PASCAL VOC 2007和2012訓練集,前30k次迭代全局學習率爲0.001,每層權重學習率爲1倍,偏置學習率爲2倍,後10k次迭代全局學習率更新爲0.0001。
動量設置爲0.9,權重衰減設置爲0.0005。

解釋分析

  1. Fast R-CNN如何採樣進行SGD訓練,和R-CNN、SPPnet中採樣方式有什麼區別和優勢?
    R-CNN和SPPnet中採用RoI-centric sampling:從所有圖片的所有候選區域中均勻取樣,這樣每個SGD的mini-batch中包含了不同圖像的樣本,不同圖像之間不能共享卷積計算和內存,運算開銷大;
    Fast R-CNN中採用image-centric sampling: mini-batch採用層次採樣,即先對圖像採樣【N個】,再在採樣到的圖像中對候選區域採樣【每個圖像中採樣R/N個,一個mini-batch共計R個候選區域樣本】,同一圖像的候選區域卷積共享計算和內存,降低了運算開銷;
    image-centric sampling方式採樣的候選區域來自於同一圖像,相互之間存在相關性,可能會減慢訓練收斂的速度,但是作者在實際實驗中並沒有出現這樣的擔憂,反而使用N=2,R=128的image-centric sampling方式比R-CNN收斂更快。

    這裏解釋一下爲什麼SPPnet不能更新spatial pyramid pooling層前面的卷積層,而只能更新後面的全連接層?
    博主沒有看過SPPnet的論文,有網友解釋說卷積特徵是線下計算的,從而無法在微調階段反向傳播誤差;另一種解釋是,反向傳播需要計算每一個RoI感受野的卷積層梯度,通常所有RoI會覆蓋整個圖像,如果用RoI-centric sampling方式會由於計算too much整幅圖像梯度而變得又慢又耗內存。

  2. 訓練數據越多效果約好嗎?

實驗 訓練集 測試集 mAP
實驗1 VOC 2007訓練集 VOC 2007測試集 66.9%
實驗1 VOC 2007+VOC 2012訓練集 VOC 2007測試集 70.0%
實驗2 VOC 2012訓練集 VOC 2010測試集 66.1%
實驗2 VOC 2007+VOC 2012訓練集+VOC2007測試集 VOC 2010測試集 68.8%
實驗3 VOC 2012訓練集 VOC 2012測試集 65.7%
實驗3 VOC 2007+VOC 2012訓練集+VOC2007測試集 VOC 2012測試集 68.4%

文中分別在VOC 2007、VOC 2010、VOC 2012測試集上測試,發現訓練數據越多,效果確實更好。這裏微調時採用100k次迭代,每40k次迭代學習率都縮小10倍。

  1. 哪些層參數需要被微調?
    SPPnet論文中採用ZFnet【AlexNet的改進版】這樣的小網絡,其在微調階段僅對全連接層進行微調,就足以保證較高的精度,作者文中採用VGG-16【L for large】網路,若僅僅只對全連接層進行微調,mAP會從66.9%降低到61.4%, 所以文中也需要對RoI池化層之前的卷積層進行微調;

    那麼問題來了?向前微調多少層呢?所有的卷積層都需要微調嗎?
    作者經過實驗發現僅需要對conv3_1及以後卷積層【即9-13號卷積層】進行微調,才使得mAP、訓練速度、訓練時GPU佔用顯存三個量得以權衡;
    作者說明所有AlexNet【S for small】、VGG_CNN_M_1024【M for medium】的實驗結果都是從conv2往後微調,所有VGG-16【L for large】的實驗結果都是從conv3_1往後微調。

  2. Fast R-CNN如何進行多任務訓練?多任務訓練有效果嗎?
    Fast R-CNN網絡分類損失和迴歸損失如下圖所示【僅針對一個RoI即一類物體說明】,黃色框表示訓練數據,綠色框表示輸入目標:

在這裏插入圖片描述

-cls_score層用於分類,輸出K+1維數組p,表示屬於K類物體和背景的概率;
-bbox_predict層用於調整候選區域位置,輸出4*K維數組,也就是說對於每個類別都會訓練一個單獨的迴歸器;
-loss_cls層評估分類代價,由真實分類u對應的概率決定:

Lcls(p,u)=logpuL_{cls}(p,u)=-\log p_u

-loss_bbox評估迴歸損失代價,比較真實分類u對應的預測平移縮放參數tu=(txu,tyu,twu,thu)t^u=(t_x^u,t_y^u,t_w^u,t_h^u)和真實平移縮放參數v=(vx,vy,vw,vh)v =(v_x,v_y,v_w,v_h)的差距:

Lloc(tu,v)=ix,y,w,hsmoothL1(tiuvi)L_{loc}(t^u,v)=\sum_{i\in{x,y,w,h}}smooth_{L1}(t_i^u-v_i)

smoothL1(x)={0.5x2,x<1x0.5,otherwisesmooth_L1(x)=\begin{cases} 0.5x^2,|x|<1 \\ |x|-0.5,otherwise \end{cases}

smooth L1損失函數曲線如下圖所示,相比於L2損失函數,其對離羣點、異常值不敏感,可控制梯度的量級使訓練時不容易跑飛;

在這裏插入圖片描述

結合分類損失和迴歸損失,Fast R-CNN微調階段總的損失函數爲:

L(p,u,tu,v)=Lcls(p,u)+λ[u1]Lloc(tu,v)L(p,u,t^u,v)=L_{cls}(p,u)+\lambda[u\ge1]L_{loc}(t^u,v)

[u1]={1,u>10,otherwise[u\ge1]=\begin{cases}1,u>1 \\ 0,otherwise\end{cases}

約定u=0爲背景分類,那麼[u≥1] 函數表示背景候選區域即負樣本不參與迴歸損失,不需要對候選區域進行迴歸操作;
λ 控制分類損失和迴歸損失的平衡,文中所有實驗λ=1;

那多任務訓練有效果嗎?
首先不看多任務訓練效果,至少比起R-CNN其訓練方便、簡潔。多任務訓練考慮各任務間共享卷積層的相互影響,是有潛在可能提高檢測效果的。
文中通過實驗發現AlexNet【S for small】、VGG_CNN_M_1024【M for medium】三種網絡採用多任務訓練比不採用mAP提高了0.8%~1.1%【測試時不採用Bounding-box regression】。

  1. RoI池化層如何進行反向求導訓練?
    首先看普通max pooling層如何求導,設xix_i爲輸入層節點,yiy_i爲輸出層節點,那麼損失函數LL對輸入層節點xix_i的梯度爲:

Lxi={0,δ(i,j)=falseLyj,δ(i,j)=true\frac{\partial L}{\partial x_i}=\begin{cases}0,\delta(i,j)=false\\\frac{\partial L}{\partial y_j},\delta(i,j)=true\end{cases}

在這裏插入圖片描述

其中判決函數δ(i,j)\delta(i,j)表示輸入i節點是否被輸出j節點選爲最大值輸出。不被選中【\delta(i,j)=false】有兩種可能:xix_i不在yiy_i範圍內,或者xix_i不是最大值。若選中【\delta(i,j)=true】則由鏈式規則可知損失函數L相對xix_i的梯度等於損失函數L相對yiy_i的梯度x(yiy_ixix_i的梯度恆等於1),故可得上述所示公式。

對於RoI polling層,設xix_i爲輸入層的節點,yriy_{ri}爲第rr個候選區域的第jj個輸出節點,一個輸入節點可能和多個輸出節點相關連,如下圖所示,輸入節點7和兩個候選區域輸出節點相關連。

在這裏插入圖片描述

該輸入節點7的反向傳播如下圖所示。對於不同候選區域,節點7都存在梯度,所以反向傳播中損失函數L對輸入層節點xix_i的梯度爲損失函數L對各個有可能的候選區域r【xix_i被候選區域r的第j個輸出節點選爲最大值】輸出yriy_{ri}梯度的累加,具體如下公式所示:

在這裏插入圖片描述

Lxi=rj[i=i(r,j)]Lyrj\frac{\partial L}{\partial x_{i}}=\sum_r\sum_j[i=i^*(r,j)]\frac{\partial L}{\partial y_{rj}}

[i=i(r,j)]={1,i=i(r,j)10,otherwise[i=i^*(r,j)]=\begin{cases}1,i=i^*(r,j)\ge1\\0,otherwise\end{cases}

判決函數[i=i(r,j)][i=i^*(r,j)],表示i節點是否被候選區域r的第j個輸出節點選爲最大值輸出,若是,則由鏈式規則可知損失函數L相對xix_i的梯度等於損失函數L相對yrjy_{rj}的梯度x(yrjy_{rj}xix_i的梯度恆等於1),上圖已然解釋該輸入節點可能會和不同的yrjy_{rj}有關係,故損失函數L相對xix_i的梯度爲求和形式。

Fast R-CNN結果如何

  1. PASCAL VOC 2007訓練集上,使用VGG-16【L for large】網絡Fast R-CNN訓練時間爲9.5h,同等條件下R-CNN需要84h,快8.8倍。
  2. PASCAL VOC 2007測試集上,使用VGG-16【L for large】網絡不採用SVD Fast R-CNN測試時間爲0.32s/image【不包括候選區域提取時間】,同等條件下R-CNN需要47.0s/image,快146倍;採用SVD測試時間爲0.22s/image【不包括候選區域提取時間】,快213倍。
  3. PASCAL VOC 2007測試集上,使用VGG-16【L for large】網絡不採用SVD Fast R-CNN mAP爲66.9%,同等條件下R-CNN mAP爲66.0%;Fast R-CNN採用SVD mAP爲66.6%。

Fast R-CNN存在的問題

Fast R-CNN中採用selective search算法提取候選區域,而目標檢測大多數時間都消耗在這裏【selective search算法候選區域提取需要2~3s,而提特徵分類只需要0.32s】,這無法滿足實時應用需求,而且Fast R-CNN並沒有實現真正意義上的端到端訓練模式【候選區域是使用selective search算法先提取出來的】。

那有沒有可能使用CNN直接產生候選區域並對其分類呢?Faster R-CNN框架就是符合這樣需求的目標檢測框架。

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