論文地址:Fast R-CNN
Fast R-CNN創新點
- 規避R-CNN中冗餘的特徵提取操作,只對整張圖像全區域進行一次特徵提取。
- 用RoI pooling層取代最後一層max pooling層,同時引入建議框信息,提取相應建議框特徵。
- Fast R-CNN網絡末尾採用並行的不同的全連接層,可同時輸出分類結果和窗口迴歸結果,實現了end-to-end的多任務訓練【建議框提取除外】,也不需要額外的特徵存儲空間【R-CNN中這部分特徵是供SVM和Bounding-box regression進行訓練的】。
- 採用SVD對Fast R-CNN網絡末尾並行的全連接層進行分解,減少計算複雜度,加快檢測速度。
促使Fast R-CNN產生的原因
- R-CNN網絡訓練、測試速度都很慢:R-CNN網絡中,一張圖經由selective search算法提取約2k個建議框【這2k個建議框大量重疊】,而所有建議框變形後都要輸入AlexNet CNN網絡提取特徵【即約2k次特徵提取】,會出現上述重疊區域多次重複提取特徵,提取特徵操作冗餘。
- R-CNN網絡訓練、測試繁瑣:R-CNN網絡訓練過程分爲ILSVRC 2012樣本下有監督預訓練、PASCAL VOC 2007該特定樣本下的微調、20類即20個SVM分類器訓練、20類即20個Bounding-box迴歸器迴歸等步驟,過於繁瑣。
- R-CNN網絡訓練需要大量存儲空間:20類即20個SVM分類器和20類即20個bounding-box迴歸器在訓練過程中需要大量特徵作爲訓練樣本,這部分從CNN提取的特徵會佔用大量存儲空間。
- R-CNN網絡需要對建議框進行變形操作後【形變爲size】再輸入CNN網絡提取特徵,其實像AlexNet網絡在提取特徵過程中對圖像的大小並無要求,只是在提取完特徵進行全連接操作的時候才需要固定特徵尺寸【R-CNN中將輸入圖像形變爲正好滿足AlexNet網絡最後的特徵尺寸要求】,然後才使用SVM分類器分類,R-CNN需要進行形變操作的問題在Fast R-CNN已經不存在。
Fast R-CNN如何解決問題
測試過程
Fast R-CNN的網絡結構如下圖所示:
- 任意size圖片輸入CNN網絡,經過若干卷積層與池化層,得到特徵圖。
- 在任意size圖片上採用selective search算法提取約2k個建議框。
- 根據原圖中建議框到特徵圖映射關係,在特徵圖中找到每個建議框對應的特徵框【深度和特徵圖一致】,並在RoI池化層中將每個特徵框池化到【VGG-16網絡是】的size。
- 固定【VGG-16網絡】大小的特徵框經過全連接層得到固定大小的特徵向量。
- 第4步所得特徵向量經由各自的全連接層【由SVD分解實現】,分別得到兩個輸出向量:一個是Softmax的分類得分,一個是Bounding-box窗口迴歸。
- 利用窗口得分分別對每一類物體進行非極大值抑制剔除重疊建議框,最終得到每個類別中迴歸修正後的得分最高的窗口。
解釋分析
-
整個測試過程什麼可以只進行一次CNN特徵提取操作?
先看R-CNN網絡,它首先採用selective search算法提取約2k個建議框,並對所有建議框都進行了CNN特徵提取操作,會出現重疊區域多次重複提取特徵,這些操作非常耗時、耗空間。事實上我們並不需要對每個建議框都進行CNN特徵提取操作,只需要對原始的整張圖片提取出特徵圖後,再找出相應建議框在特徵圖中對應的區域,這樣就可以避免冗餘的特徵提取操作,節省大量時間。 -
爲什麼要將每個建議框對應的特徵框池化到的size?如何實現?
問題4中已經指出像AlexNet等網絡在提取特徵過程中對圖像的大小並無要求,只是在提取完特徵進行全連接操作的時候才需要固定特徵尺寸,利用這一點,Fast R-CNN可輸入任意size圖片,並在全連接操作前加入RoI池化層,將建議框對應特徵圖中的特徵框池化到的size,以便滿足後續操作對size的要求。具體如何實現呢?
首先假設建議框對應特徵圖中的特徵框大小爲,將其劃分爲個子窗口,每個子窗口大小爲,然後對每個子窗口採用max pooling下采樣操作,每個子窗口只取一個最大值,則特徵框最終池化爲的size【特徵框各深度同理】,這將各個大小不一樣的特徵框轉化爲大小統一的數據輸入下一層。 -
爲什麼要採用SVD分解實現Fast R-CNN網絡中最後的全連接層?具體如何實現?
圖像分類任務中,用於卷積層計算的時間比用於全連接層計算的時間多,而在目標檢測任務中,selective search算法提取的建議框比較多【約2k】,幾乎有一半的前向計算時間被花費於全連接層,就Fast R-CNN而言,RoI池化層後的全連接層需要進行約2k次【每個建議框都要計算】,因此在Fast R-CNN中可以採用SVD分解加速全連接層計算。具體如何使實現?
一.物體分類和窗口迴歸都是通過全連接層實現的,假設全連接層輸入數據爲,輸出數據爲,全連接層參數爲,尺寸爲,那麼該層全連接計算爲:計算複雜度爲。
二.若將進行SVD分解,並用前t個特徵值近似代替,即:那麼原來的前向傳播分解成兩步:
計算複雜度爲,若t < min(u,v),則這種分解會大大減少計算量。
在實現時,相當於把一個全連接層拆分爲兩個全連接層,第一個全連接層不含偏置,第二個全連接層含偏置。實驗表明,SVD分解全連接層能使mAP只下降0.3%的情況下提升30%的速度,同時該方法也不必再執行額外的微調操作。
-
文中僅採用selective search算法提取約2k個候選區域,那候選區域越多約好嗎?
文中利用selective search算法提取1k-10k中10種數目【1k,2k…】的候選區域進行訓練測試,發現隨着候選區域個數的增加,mAP成先增長後緩慢下滑的趨勢,這表明更多的候選區域會有損精度。與此同時,作者也做了召回率【所謂召回率即候選區域爲真的窗口與Ground Truth的比值【IoU大於閾值即爲真】】分析實驗,發現隨着候選區域個數的增加,召回率並沒有和mAP成很好的相關性,而是一直不斷增加,也就是說更高的召回率並不意味着更高的mAP。文中也以selective search算法提取的2k個候選區域爲基礎,每次增加個密集box【滑動窗口方法】進行訓練測試,發現mAP比只有selective search方法的2k候選區域下降幅度更大,最終達到53%。
-
如何處理尺度不變性問題?即如何使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不敏感。
-
爲什麼不沿用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。
解釋分析
-
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整幅圖像梯度而變得又慢又耗內存。 -
訓練數據越多效果約好嗎?
實驗 | 訓練集 | 測試集 | 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倍。
-
哪些層參數需要被微調?
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往後微調。 -
Fast R-CNN如何進行多任務訓練?多任務訓練有效果嗎?
Fast R-CNN網絡分類損失和迴歸損失如下圖所示【僅針對一個RoI即一類物體說明】,黃色框表示訓練數據,綠色框表示輸入目標:
-cls_score層用於分類,輸出K+1維數組p,表示屬於K類物體和背景的概率;
-bbox_predict層用於調整候選區域位置,輸出4*K維數組,也就是說對於每個類別都會訓練一個單獨的迴歸器;
-loss_cls層評估分類代價,由真實分類u對應的概率決定:
-loss_bbox評估迴歸損失代價,比較真實分類u對應的預測平移縮放參數和真實平移縮放參數的差距:
smooth L1損失函數曲線如下圖所示,相比於L2損失函數,其對離羣點、異常值不敏感,可控制梯度的量級使訓練時不容易跑飛;
結合分類損失和迴歸損失,Fast R-CNN微調階段總的損失函數爲:
約定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】。
- RoI池化層如何進行反向求導訓練?
首先看普通max pooling層如何求導,設爲輸入層節點,爲輸出層節點,那麼損失函數對輸入層節點的梯度爲:
其中判決函數表示輸入i節點是否被輸出j節點選爲最大值輸出。不被選中【\delta(i,j)=false】有兩種可能:不在範圍內,或者不是最大值。若選中【\delta(i,j)=true】則由鏈式規則可知損失函數L相對的梯度等於損失函數L相對的梯度x(對的梯度恆等於1),故可得上述所示公式。
對於RoI polling層,設爲輸入層的節點,爲第個候選區域的第個輸出節點,一個輸入節點可能和多個輸出節點相關連,如下圖所示,輸入節點7和兩個候選區域輸出節點相關連。
該輸入節點7的反向傳播如下圖所示。對於不同候選區域,節點7都存在梯度,所以反向傳播中損失函數L對輸入層節點的梯度爲損失函數L對各個有可能的候選區域r【被候選區域r的第j個輸出節點選爲最大值】輸出梯度的累加,具體如下公式所示:
判決函數,表示i節點是否被候選區域r的第j個輸出節點選爲最大值輸出,若是,則由鏈式規則可知損失函數L相對的梯度等於損失函數L相對的梯度x(對的梯度恆等於1),上圖已然解釋該輸入節點可能會和不同的有關係,故損失函數L相對的梯度爲求和形式。
Fast R-CNN結果如何
- PASCAL VOC 2007訓練集上,使用VGG-16【L for large】網絡Fast R-CNN訓練時間爲9.5h,同等條件下R-CNN需要84h,快8.8倍。
- 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倍。
- 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框架就是符合這樣需求的目標檢測框架。