【目標檢測】R-CNN系列與SPP-Net總結


@

1. 前言

  最近讀完了R-CNN三部曲+SPP-Net,算是Detection里比較經典的一個系列,最近也在讀CVPR或者ECCV的其他Detection相關的論文,發現很多都是在改進R-CNN系列的一些細節。因此在這將這4篇論文先分別進行一些講解,再進行一些比較,闡述一些自己的想法,以便加深自己對這系列論文的理解,也希望可以幫到其他人。

2. R-CNN

2.0 論文鏈接

R-CNN鏈接

2.1 概述

  R-CNN算是很經典的一篇論文,當時很多Detection algorithm都是利用圖片本身的顏色,紋理,梯度等low-level圖片特征進行檢測。R-CNN引進了CNN以及proposal等來進行檢測,同時也利用pre-training來解決一些樣本量很少的任務。
 R-CNN提出了一種全新的訓練結構,它的整體流程如下:

  1. 先利用Selective Search在每個圖片選出大約2k個region proposals
  2. 由於之后的網絡結構只能接受相同大小的proposal,所以需要把每一個proposal拉伸(warp)成227*227大小
  3. 如果proposal與GT IOU大於閾值(0.5)標記為正樣本,否則是負樣本
  4. 對於每一個proposal利用CNN提取特征
  5. 利用這些特征訓練一個SVM分類器,從而得出相應類別的分數
  6. 利用NMS去掉一些冗余的候選框,大致的Detection就完成了
  7. 很容易發現許多proposal都不精確,因此使用Bounding Box Regression對候選框進行微調

2.2 pre-training

  針對很多數據集樣本很少,很難單獨的使用一個數據集進行訓練跟檢測,R-CNN首先在其他樣本較多與目標數據集任務相似的副本數據集進行有監督預訓練,保留其訓練的模型參數,利用目標數據集對某些網絡進行微調(domain-specific fine-tuning),這樣可以產生更好的性能,這也是本文的亮點之一。

2.3 不同階段正負樣本的IOU閾值

  首先在fine-tuning階段,IOU閾值為0.5,即大於0.5的都是目標,小於0.5的都是背景,而在SVM訓練時,小於0.3的都是負樣本,正樣本為GT。
  為什么要分開設置閾值呢?在fine-tuning期間,為了防止過擬合,閾值設置的寬松一點,就是就算有一半左右的物體與GT相交,那也是算是物體,而不是背景。在訓練SVM的時候,則正樣本只有GT,閾值大於0.3的忽略掉,小於0.3的算負樣本(0.3也是通過實驗挑選出來的)。之所以要重新訓練SVM,也是因為在之前fine-tuning網絡的時候設置的閾值較為寬松,所以softmax進行分類的性能其實並不是很理想。因此重新訓練了一個SVM分類器,效果相比softmax更理想了。

2.4 關於fine-tuning

  fine-tuning用來微調一些參數,畢竟在副本任務訓練不是當前數據集本身,肯定還是有差距的,CNN通常第一層提取出一些線條,邊緣,之后更深的層則將這些基礎特征組合起來,副本任務可以理解為提取大多數圖像的共同的基本特征(這也就要求副本任務與目標任務要相近),通過在目標任務fine-tuning進行微調,使得detector對提取到目標數據集獨特的特征與信息,同時文章中的實驗也體現了fine-tuning的重要性與必要性,本文在fine-tuning時將原來網絡1000個分類改為N+1(N為類別數量,1為背景)個分類,為了防止過大的影響原來的參數,學習率為預訓練學習率的1/10。

2.5 對文章的一些思考

1.我讀完文章的時候就在想,對於每一個proposal進行CNN提取特征,一個圖片2k左右proposals,一個數據集通常有更多的圖片,那是不是有點太費力了?同時一個圖片通常沒有那么多“物體”,2000個proposal是不是有點太多了,應該會在物體附近很密集。
2.再單獨訓練一個SVM,是否有一些冗余,雖然文章中給出了單獨訓練SVM必要性的有力證據, 那是否可以改變一下網絡模型使得softmax可行。
3.CNN網絡之前必須將proposal進行變形稱為固定的227*227是否可以接受任意形狀的圖片呢。

3. SPP-Net

3.0 論文鏈接

SPP-Net地址

3.1 概述

  R-CNN在當時取得了很大的成果,但是他還是有一些問題,最突出的就是效率問題,SPP-Net主要就是解決R-CNN的幾個問題: 1. 對於每張圖片的每個proposal跑一邊CNN,SVM分類器,做了很多冗余的操作。2.proposal在送進網絡之前都要進行拉伸(warp),這樣會影響圖片的質量以及內容,同時也比較費時費力。
 SPP-Net的改進如下:

  1. 送入網絡的不再是proposal里的圖像,而是一次性的把整個圖片送入,而且只輸入一次,將通過Selective Search生成的proposal映射到通過卷積網絡生成的feature map上,相當於一個proposal中的圖像通過一層層卷積得到的feature map
  2. CNN網絡之所以需要固定輸入圖像的尺寸,不在於卷積層與池化層,而在於全連接層,全連接層的參數維度需要固定。之前的解決方法都是固定圖片的尺寸,這里在最后一層卷積層與FC層之間插入了一層SPP-layer,對於輸入任意尺寸都是可以輸出相同尺寸的特征。

3.2 一次性full-image卷積

  相比R-CNN需要對每個proposal做卷積,SPP-Net只做一次卷積,將相應的sub-image映射到full-image卷積后的feature map上從而得到sub-image通過卷積層得到的feature,下圖可以很形象的表達:

3.3 Spatital Pyramid Pooling

  這也是本篇paper的亮點之一, 通過一個“池化金字塔”,金字塔的每一層都做一次池化,具體的池化規則相當於為:stride = \(\lfloor a/n \rfloor\) window size = \(\lceil a/n\rceil\) 其中n為每層最終輸出的feature map邊長, a為經過最后一層卷積層后的feature map的邊長。 這樣對於每一層的輸出都是固定的,將各層的輸出拼接起來作為FC層的輸入,具體可以用下圖表示:

在單尺度情況下,我們知道了輸入圖片的大小,那么就可以提前計算出“池化金字塔”每層需要幾乘幾的格子(bin)來池化,同時SPP也起到了多尺度訓練的作用。

3.4 多尺度訓練與測試

  理論上SPP-Net可以用於任何尺寸的圖片輸入,但在訓練時候不能隨意輸入任意大小的圖片,因為“池化金字塔”的n x n “bins“需要提前設定,不同的尺寸的圖片用同一Spatital Pyramid Pooling可能會輸出不同規格的feature map。
  訓練過程中,其實使用的是共享參數的多個固定尺寸的網絡實現了不同輸入尺寸的SPP-Net。其中從一個尺寸編導另一個尺寸使用的縮放而不是裁剪,這樣不同尺度的區域僅僅是分辨率上的不同,內容與布局沒有變化。
  為了降低從一個網絡(比如224)向另一個網絡(比如180)切換的開銷,在每個網絡上訓練一個完整的epoch,然后在下一個完成的epoch再切換到另一個網絡(權重保留)。依此往復。實驗中發現多尺寸訓練的收斂速度和單尺寸差不多。多尺寸訓練的主要目的是在保證已經充分利用現在被較好優化的固定尺寸網絡實現的同時,模擬不同的輸入尺寸.
  注意,上面的多尺寸解析度只用於訓練。在測試階段,是直接對各種尺寸的圖像應用SPP-net的。

3.5 如何將原圖的proposal映射到到feature map上

  為了簡單起見,對每一層卷積層進行padding,大小為\(\lfloor p /2 \rfloor\),其中\(p\)為卷積核的邊長,這樣卷積過程中feature map規格不會變,這樣原圖上的某點\((x, y)\) 與在 feature map上相應點\((x^{'}, y^{'})\)的關系為: 左(上)邊界\(x^{'} = \lfloor x/S \rfloor+1,\) 右(下)邊界 \(x^{'} = \lceil x / S \rceil - 1\), 同時,如果padding不是\(\lfloor p /2 \rfloor\),需要對x進行一些補償。

PS: paper中直接給出結論, 具體證明還沒有去做,之后補上

3.6 SPP-Net的一些不足

  1. 雖然解決了R-CNN許多大量冗余計算的問題,但是還是沿用了R-CNN的訓練結構,也訓練了SVM分類器, 單獨進行BBox regression。
  2. SPP-Net 很難通過fine-tuning對SPP-layer之前的網絡進行參數微調,效率會很低,原因具體是(Fast-RCNN中的解釋): SPP做fine-tuning時輸入是多個不同的圖片,這樣對於每一個圖片都要重新產出新的feature map,效率很低,而Fast-RCNN對其進行了改進。

4. Fast R-CNN

4.0 論文鏈接

Fast R-CNN鏈接

4.1 概述

  Fast R-CNN最主要的是解決了SPP-Net與R-CNN訓練步驟復雜、冗余的缺點,首先它同樣對整個圖像只做一次卷積提取full-image feature map,其次它利用了ROI pooling layer(可以看做SPP的簡化版) 進行固定送入FC層的feature尺寸,從而達到對任意尺寸的圖像進行訓練及測試,最后它將分類與回歸同時進行,相當於多任務學習,他們共享前面網絡的特征與計算,這樣也不需要利用磁盤對特征進行存儲。同時Fast R-CNN也對損失函數,FC層加速等做了優化。同時該文章還通過實驗證明了深度網絡具有較好的scale-invariance,即對scale並不是特別敏感。

4.2 網絡結構

Fast R-CNN 將整個圖片與通過Selective Search篩選出的region proposals一同輸入,經過卷積層、池化層產出feature map,計算出原圖的proposal在feature map的映射,將相應的feature送到ROI pooling層,進行池化,產出固定長度的feature vector作為FC層(SVD分解實現)的輸入最終分支成兩個兄弟輸出層:一個通過softmax產生K+1個分類的概率,另一個對於每個object 類別輸出四個實數,代表一個較為精確的BBox position,最后進行NMS得到最終的結果。具體網絡結構如下圖:(摘取自:Coding_ML

4.3 ROI pooling

  具體做法首先將原始圖片的proposal映射到feature map上,取出相應的feature,假設feature長H寬W,要輸出的規格為h x w,那么就把原feature分成 h x w,對每一塊區域做max pooling,得到一個固定h x w規格的feature vector送入FC層。

4.4 SVD分解實現FC層加速

  圖像分類任務中,用於卷積層計算的時間比用於全連接層計算的時間多,而在目標檢測任務中,selective search算法提取的建議框比較多,幾乎有一半的前向計算時間被花費於全連接層,就Fast R-CNN而言,RoI池化層后的全連接層需要進行約2k次(每個建議框都要計算),因此在Fast R-CNN中可以采用SVD分解加速全連接層計算;
SVD原理:
【待補充】

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

PS:因為最近事情真的比較多,所以SVD的學習以后再進行。

4.5 使用softmax進行預測概率而不是SVM

  針對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在分類過程中引入了類間競爭,分類效果更好;(對於類間競爭,我的理解是softmax所有類的概率相加為1,一個類的概率變高,其他類的概率必然有所下降,這樣即使論文中的competition between classes)
Fast R-CNN去掉了SVM這一步,所有的特征都暫存在顯存中,就不需要額外的磁盤空間,省時省力。

 【疑問】 關於為什么Fast R-CNN可以舍棄SVM分類器而直接采用softmax,而不會出現因為IOU閾值選的0.5導致softmax的精度下降,我目前沒有十分確切的想法,認為可能有以下幾點原因(猜想):

  1. R-CNN是對原圖片進行wrap,所以可能會導致圖片的某些信息在卷積層跟池化層丟失(因為拉伸或者壓縮,一些像素出現在不應該出現的位置),而Fast R-CNN則將原圖完好的進行了卷積與池化,再通過ROI池化。
  2. Fast R-CNN 通過較深的網絡訓練,相比R-CNN有更強的性能,因此搜反而,softmax更好一點。
  3. ROI pooling 比 max pooling 更好一點(霧

4.6 單尺度訓練與測試

  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不敏感。

以上基本上論文翻譯,文中解釋的很好。

4.7 R-CNN(SPP-Net)與Fast-RCNN不同的樣本采樣

  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的RoI-centric sampling方式比R-CNN收斂更快。

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

4.8 需要fine-tuning的參數

  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往后微調。

4.9 Fast R-CNN 多任務訓練及損失函數

4.9.1 損失函數

  Fast R-CNN網絡分類損失和回歸損失如下圖所示【僅針對一個RoI即一類物體說明】,黃色框表示訓練數據,綠色框表示輸入目標:

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

\[L_{cls}(p, u) = -log_{p_{u}} \]

-loss_bbox評估回歸損失代價,比較真實分類u對應的預測平移縮放參數和真實平移縮放參數的差距:

\[L_{loc}(t^{u}, v) = \sum_{i \in \{x, y, w, h\}} smooth_{L_{1}{(t_{i}^{u} - v_{i})}} \]

t代表預測值,v代表真實值,u代表類別,其中

\[smooth_{L_{1}}(x) = \begin{cases} 0.5x^{2} & if\left|x\right| < 1 \\ \left|x\right| - 0.5 & otherwise, \end{cases}\]

\(L_{1}\) loss相對R-CNN與SPP-Net中的\(L_{2}\) loss對異常值更不敏感,同時也能有效防止梯度爆炸

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

微調時總得損失函數為:\(L(p, u, t^{u}, v) = L_{cls}(p, u) + \lambda[u \geq 1]L_{loc}(t^{u}, v)\)

4.9.2 對於多任務

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

4.10 RoI池化層如何進行反向求導訓練

  首先看普通max pooling層如何求導,設為\(x_{i}\)輸入層節點,\(y_{i}\)為輸出層節點,那么損失函數L對輸入層節點\(x_{i}\)的梯度為:

\[\frac{\partial L}{\partial x_{i}} = \begin{cases} 0, & \delta(i, j) = false \\ \frac{\partial L}{\partial y_{i}} & \delta(i, j) = true \end{cases}\]

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

對於RoI max pooling層,設\(x_{i}\)為輸入層的節點,\(y_{ri}\) 為第r個候選區域的第j個輸出節點,一個輸入節點可能和多個輸出節點相關連,如下圖所示,輸入節點7和兩個候選區域輸出節點相關連;

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

\[\frac{\partial L}{\partial x_{i}} = \sum_{r}{\sum_{j}} [i = i * (r, j)]\frac{\partial L}{\partial y_{rj}} \]

\[ [i = i * (r, j)] = \begin{cases} 1, & i = i*(r, j) \geq1 \\ 0, & otherwise \end{cases} \]

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

4.11 Fast R-CNN 訓練與測試的流程圖


5. Faster R-CNN

5.0 論文鏈接

Faster RCNN

5.1 概述

  Fast R-CNN還是用的Selective Search來提取region proposal, Faster R-CNN就此問題提出了使用RPN生成region proposal,然后再接上Fast R-CNN形成了一個完全的end-to-end的CNN對象檢測模型,可以完全在GPU運行,同時RPN與后面的detection network 共享full-image convolutional features。
 算法總體流程如下:

  1. 利用預訓練的一些網絡對原圖進行卷積池化等操作得到一個full-image convolutional feature map(這個過程通常會利用padding保證卷積過程中輸入size =輸出size,這樣只有在池化過程中size才會發生改變,從而方便利用feature map找到原圖的區域)
  2. 通過RPN生成一些帶着有物體置信度(objectness score)的矩形proposal(RPN通過softmax判斷proposal為物體還是背景以及用簡單BBox regression 對proposal進行修正)
  3. 將feature map 與 通過RPN生成的proposal作為RoI pooling layer的輸入,從而得到固定size的proposal feature map
  4. 最后將所有的proposal feature map 送到檢測網絡中,利用1x1卷積進行分類與BBox回歸。

  可以發現,其他上述流程等於在Fast RCNN加了一個RPN生成proposal,同時對proposal進行了兩次調修與分類,使得結果更加准確。因為兩個網絡共享相同的full-image convolutional feature map 與 計算,所以相比Fast RCNN效率有了很大的提高。

5.2 RPN-Net的流程細節

5.2.1 RPN算法流程

  為了生成proposal,RPN在預訓練的網絡模型生成的特征圖(convolutional feature map )上滑動一個小網絡(slide a small network),這個網絡把特征圖上的一個n x n窗口(文章中n=3)的特征作為輸入,對於每個窗口,以窗口的中心點作為基准,通過不同(文章中9個)的anchors映射到原圖從而得到一個個proposals,之后通過對這些proposal進行softmax分類與BBox regression的學習,從而輸出調優后的proposal with score。
大體流程可以用下圖表示:

5.2.2 anchor

  之前提到的anchor其實代表的就是“長寬比與面積以及滑動窗口的中心”,比如有3個面積以及3個長寬比,那么對於每個滑動窗口都有9個以滑動窗口中心映射到原圖像素點為中心滿足長寬比與面積要求的proposal(emmm,有點繞)。假如feature map 的尺寸為WxH,每個滑動窗口最多有k個anchors(比如3x3),那么整個特征圖就有W x H x k個anchors(通常會在特征圖進行pading從而維持這個數量)。

  之前實現多尺度通常有兩種,一種是輸入的圖片進行多尺度變換,另一種是卷積核進行多尺度變換(比如滑動窗口進行相關變換)。不過通常這兩種是結合起來使用。anchor的設計,也可以滿足多尺度性能,因為anchor本身就結合了不同的長寬比與面積,因此只在單尺度圖片上進行訓練,也能具有多尺度的性能。

5.2.3 正負樣本的標注規則

a. 對每個標定的真值候選區域,與其重疊比例最大的anchor記為前景樣本
b. 對a)剩余的anchor,如果其與某個標定重疊比例大於0.7,記為前景樣本;如果其與任意一個標定的重疊比例都小於0.3,記為背景樣本
c. 對a),b)剩余的anchor,棄去不用。
d. 跨越圖像邊界的anchor棄去不用

5.2.3 Loss Function

  RPN的loss function 學習了 Fast R-CNN中的loss function,如下:

\[L(\{p_{i}\},\{t_{i}\}) = \frac{1}{N_{cls}}\sum_{i}{L_{cls}(p_{i},p_{i}^{*})} + \lambda \frac{1}{N_{reg}}\sum_{i}{p_{i}^{*}L_{reg}(t_{i}, t_{i}^{*})} \]

  其中,\(i\)代表anchor在mini-batch里的序號,\(p_{i}\)代表預測為物體的概率,\(p_{i}^{*}\) = 1代表GT是物體,否則為背景。同理\(t_{i}\)代表的是預測的proposal框的四個點,\(t_{i}^{*}\)代表GT的坐標點。\(L_{cls}\)代表的是是否為物體的log loss,\(L_{reg}\)用的是Fast R-CNN里的\({smooth} {L_{1}}\),而具體的參數形式為R-CNN附錄中的求解方式(邊框回歸),這兩部分通過\(N_{cls}\),\(N_{reg}\)來標准化,通過\(\lambda\)來進行平衡權重。
  值得注意的是, 之前模型的BBox regression通常是所有的尺度共享參數,在Fast R-CNN中,他對不同的anchor分別訓練了不同的回歸器,共有k個。

5.2.4 訓練RPN

  訓練RNP的樣本采集是“image-centric”,即每個mini-batch 包含一張圖片中的多個anchor。如果所有anchor都參與訓練,那么負樣本會遠遠大於正樣本,因此會引起生成器偏移,文章采用256個anchors,其中128個正樣本128個負樣本,多填少補盡量維持比例1:1.

5.3 RPN與Fast R-CNN共享特征圖訓練

  前面已經討論如何訓練提取proposal的RPN,分類采用Fast R-CNN。如何把這兩者放在同一個網絡結構中訓練出一個共享卷積的Multi-task網絡模型。

  我們知道,如果是分別訓練兩種不同任務的網絡模型,即使它們的結構、參數完全一致,但各自的卷積層內的卷積核也會向着不同的方向改變,導致無法共享網絡權重,論文作者提出了三種可能的方式:

  1.Alternating training:此方法其實就是一個不斷迭代的訓練過程,既然分別訓練RPN和Fast-RCNN可能讓網絡朝不同的方向收斂,a)那么我們可以先獨立訓練RPN,然后用這個RPN的網絡權重對Fast-RCNN網絡進行初始化並且用之前RPN輸出proposal作為此時Fast-RCNN的輸入訓練Fast R-CNN。b) 用Fast R-CNN的網絡參數去初始化RPN。之后不斷迭代這個過程,即循環訓練RPN、Fast-RCNN。

  2.Approximate joint training:這里與前一種方法不同,不再是串行訓練RPN和Fast-RCNN,而是嘗試把二者融入到一個網絡內,具體融合的網絡結構如下圖所示,可以看到,proposals是由中間的RPN層輸出的,而不是從網絡外部得到。需要注意的一點,名字中的"approximate"是因為反向傳播階段RPN產生的cls score能夠獲得梯度用以更新參數,但是proposal的坐標預測則直接把梯度舍棄了,這個設置可以使backward時該網絡層能得到一個解析解(closed results),並且相對於Alternating traing減少了25-50%的訓練時間。(此處不太理解: 每次mini-batch的RPN輸出的proposal box坐標信息固定,讓Fast R-CNN的regressor去修正位置?)

  3.Non-approximate training:上面的Approximate joint training把proposal的坐標預測梯度直接舍棄,所以被稱作approximate,那么理論上如果不舍棄是不是能更好的提升RPN部分網絡的性能呢?作者把這種訓練方式稱為“ Non-approximate joint training”,但是此方法在paper中只是一筆帶過,表示“This is a nontrivial problem and a solution can be given by an “RoI warping” layer as developed in [15], which is beyond the scope of this paper”,

  上面說完了三種可能的訓練方法,可非常神奇的是作者發布的源代碼里卻用了另外一種叫做4-Step Alternating Training的方法,思路和迭代的Alternating training有點類似,但是細節有點差別:

第一步:用ImageNet模型初始化,獨立訓練一個RPN網絡;
第二步:仍然用ImageNet模型初始化,但是使用上一步RPN網絡產生的proposal作為輸入,訓練一個Fast-RCNN網絡,至此,兩個網絡每一層的參數完全不共享;
第三步:使用第二步的Fast-RCNN網絡參數初始化一個新的RPN網絡,但是把RPN、Fast-RCNN共享的那些卷積層的learning rate設置為0,也就是不更新,僅僅更新RPN特有的那些網絡層,重新訓練,此時,兩個網絡已經共享了所有公共的卷積層;
第四步:仍然固定共享的那些網絡層,把Fast-RCNN特有的網絡層也加入進來,形成一個unified network,繼續訓練,fine tune Fast-RCNN特有的網絡層,此時,該網絡已經實現我們設想的目標,即網絡內部預測proposal並實現檢測的功能。

5.4 RPN中對anchor box 分類與回歸的作用

  作者通過實驗驗證了他們的作用,如果把cls layer去掉(沒有NMS與排名可以用了),從這些unscored proposal取1000個送入下一層會發現mAP幾乎是沒有變化的,但是如果僅僅取100個,會急速下降。
  如果去掉reg layer,因此送到ROI pooling layer 就只是沒有微調的anchor box, mAP會下降到52.1%,證明在RPN層的BBox 是很有用也是很有必要的。
  同時作者也通過實驗證明了NMS並不會減少最后的mAP,反而可以減少一些冗余的proposal

參考文獻

Fast R-CNN論文詳解
Fast R-CNN詳解
Faster R-CNN


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM