RCNN--對象檢測的又一偉大跨越 2(包括SPPnet、Fast RCNN)(持續更新)


  繼續上次的學習筆記,在RCNN之后是Fast RCNN,但是在Fast RCNN之前,我們先來看一個叫做SPP-net的網絡架構。

一,SPP(空間金字塔池化,Spatial Pyramid Pooling)簡介:

  有一個事實需要說清楚:CNN的卷積層不需要固定尺寸的圖像,全連接層是需要固定大小輸入的,因此提出了SPP層放到卷積層的后面。SPPNet將任意大小的圖像池化生成固定長度的圖像表示,如下圖所示:

這里寫圖片描述

  SPP的優點:1)任意尺寸輸入,固定大小輸出,2)層多,3)可對任意尺度提取的特征進行池化。

  池化示意圖:

  SPP層的結構如下,將緊跟最后一個卷積層的池化層使用SPP代替,作為全連接層的輸入。當我們有很多層網絡的時候,當網絡輸入的是一張任意大小的圖片,這個時候我們可以一直進行卷積、池化,直到網絡的倒數幾層的時候,也就是我們即將與全連接層連接的時候,就要使用金字塔池化,使得任意大小的特征圖都能夠轉換成固定大小的特征向量,這就是空間金字塔池化的奧義(多尺度特征提取出固定大小的特征向量)(每一種刻度我們稱之為:金字塔的一層)

  Note :

BoW -> SPM

(SPP的思想來源於SPM,然后SPM的思想來源自BoW。
關於BoW和SPM,找到了兩篇相關的博文,就不在這里展開了。
http://blog.csdn.net/v_JULY_v/article/details/6555899
http://blog.csdn.net/jwh_bupt/article/details/9625469)

 

二,用SPPnet進行對象檢測:

  R-CNN重復使用深層卷積網絡在~2k個窗口上提取特征,特征提取非常耗時。SPPNet將比較耗時的卷積計算改為對整幅圖像只進行一次,之后使用spp將窗口特征圖池化為一個固定長度的特征表示。

----------------------------------------------------------------------------------------

這里插一條關於神經網絡訓練中常用的三個英文單詞:epoch、 iteration和batchsize的區別:

(1)batchsize:批大小。在深度學習中,一般采用SGD訓練,即每次訓練在訓練集中取batchsize個樣本訓練;

(2)iteration:1個iteration等於使用batchsize個樣本訓練一次;

(3)epoch:1個epoch等於使用訓練集中的全部樣本訓練一次;

舉個例子,訓練集有1000個樣本,batchsize=10,

那么:訓練完整個樣本集需要:100次iteration,1次epoch。

------------------------------------------------------------------------------------------

這是原文的關於SPP的詳解,自己認為非常好,這里先貼出來,明天繼續學習:

---------------------------------

SPP網絡,我不得不要先說,這個方法的思想在Fast RCNN, Faster RCNN上都起了舉足輕重的作用。SPP網絡主要是解決深度網絡固定輸入層尺寸的這個限制,也從各個方面說明了不限制輸入尺寸帶來的好處。文章在一開始的時候就說明了目前深度網絡存在的弊端:如果固定網絡輸入的話,要么選擇crop策略,要么選擇warp策略,crop就是從一個大圖扣出網絡輸入大小的patch(比如227×227),而warp則是把一個bounding box的內容resize成227×227 。無論是那種策略,都能很明顯看出有影響網絡訓練的不利因素,比如crop就有可能crop出object的一個部分,而無法准確訓練出類別,而warp則會改變object的正常寬高比,使得訓練效果變差。接着,分析了出深度網絡需要固定輸入尺寸的原因是因為有全連接層(FC),不過在那個時候,還沒有FCN的思想,那如何去做才能使得網絡不受輸入尺寸的限制呢?Kaiming He 大神就想出,用不同尺度的pooling 來pooling出固定尺度大小的feature map,這樣就可以不受全鏈接層約束任意更改輸入尺度了。下圖就是SPP網絡的核心思想:
通過對feature map進行相應尺度的pooling,使得能pooling出4×4, 2×2, 1×1的feature map,再將這些feature map concat成列向量與下一層全鏈接層相連。這樣就消除了輸入尺度不一致的影響。訓練的時候就用常規方法訓練,不過由於不受尺度的影響,可以進行多尺度訓練,即先resize成幾個固定的尺度,然后用SPP網絡進行訓練,學習。這里講了這么多,實際上我想講的是下面的 東西, SPP如何用在檢測上面。論文中實際上我覺得最關鍵的地方是提出了一個如何將原圖的某個region映射到conv5的一種機制,雖然,我並不是太認可這種映射機制,等下我也會說出我認為合理的映射方法。論文中是如何映射的,實際上我也是花了好久才明白。
首先,我想先說明函數這個東東,當然我不是通過嚴謹的定義來說明。什么是y=f(x),我認為只要輸入x,有一組固定的操作f,然后產生一個對應的y,這樣子就算是函數。根據輸入有一個一一對應的輸出,這就是函數。這樣理解的話,卷積也是函數,pooling也是函數。當然我並不想說明函數是什么,什么是函數,實際上我想強調的是一一對應這樣的關系。大家都知道,現在默許的無論是卷積還是pooling(無stride),都會加相應的pad,來使得卷積后的尺寸與卷積前相同,當然這種做法還有個好處就是使得邊緣不會只被卷積一次就消失了~這樣子的話,實際上原圖與卷積后的圖就是一一對應的關系。原圖的每一個點(包括邊緣)都可以卷積得到一個新的點,這就是一一對應了。如下圖所示(自己畫得太丑):
這里寫圖片描述這里寫圖片描述
綠色部分是圖片,紫色部分是卷積核。 
這里寫圖片描述 
如上圖可以看出,藍色的區域是原圖區域,而紅色的區域是padding區域,紫色的是卷積核。卷積后得到的區域與原區域是一一對應的。而卷積或pooling增加stride的話就相當與原圖先進行卷積或池化,再進行sampling,這還是能一一對應的,就這樣原圖的某個區域就可以通過除以網絡的所有stride來映射到conv5后去區域。終於把這里講出來了,大家如果直接按照函數的一一對應關系去理解,很容易理解為什么原圖的區域除以所有的stride就是映射到conv5的區域。這樣子就可以在原圖上的一些操作放在conv5上進行,這樣可以減小任務復雜度。不過,我並不是太認可這種映射機制,這種映射只能是點到點的關系,不過我覺得從原圖的某個區域R映射到conv5的區域r,應該r對R敏感,換句話說,應該r感受野應該與R有交集。這樣子的話,示意圖如下:
這里寫圖片描述 
其中藍色的為conv的神經元感受野,紅色的是原圖的某個感興趣區域,而黑色框我才認為是要映射到conv5的區域。 
使用SPP進行檢測,先用提候選proposals方法(selective search)選出候選框,不過不像RCNN把每個候選區域給深度網絡提特征,而是整張圖提一次特征,再把候選框映射到conv5上,因為候選框的大小尺度不同,映射到conv5后仍不同,所以需要再通過SPP層提取到相同維度的特征,再進行分類和回歸,后面的思路和方法與RCNN一致。實際上這樣子做的話就比原先的快很多了,因為之前RCNN也提出了這個原因就是深度網絡所需要的感受野是非常大的,這樣子的話需要每次將感興趣區域放大到網絡的尺度才能卷積到conv5層。這樣計算量就會很大,而SPP只需要計算一次特征,剩下的只需要在conv5層上操作就可以了。當然即使是這么完美的算法,也是有它的瑕疵的,可能Kaiming He大神太投入 SPP的功效了,使得整個流程框架並沒有變得更加完美。首先在訓練方面,SPP沒有發揮出它的優勢,依舊用了傳統的訓練方法,這使得計算量依舊很大,而且分類和bounding box的回歸問題也可以聯合學習,使得整體框架更加完美。這些Kaiming He都給忽略了,這樣也就有了第二篇神作 Fast RCNN。

-----------------------------------------------------------------------------

 

@@@@@@@@@@@@@@

在微調階段談及SPP-net只能更新FC層,這是因為卷積特征是線下計算的,從而無法再微調階段反向傳播誤差。
而在fast-RCNN中則是通過image-centric sampling提高了卷積層特征抽取的速度,從而保證了梯度可以通過SPP層(即ROI pooling層)反向傳播。

@@@@@@@@@@@@@@

 

三,Fast RCNN

3.1 首先想說下RCNN的缺點:

1. 訓練時要經過多個階段,首先要提取特征微調ConvNet,再用線性SVM處理proposal,計算得到的ConvNet特征,然后進行用bounding box回歸。 

2. 訓練時間和空間開銷大。要從每一張圖像上提取大量proposal,還要從每個proposal中提取特征,並存到磁盤中。 

3. 測試時間開銷大。同樣是要從每個測試圖像上提取大量proposal,再從每個proposal中提取特征來進行檢測過程,可想而知是很慢的。 

 

3.2 然后說下SPPnet的缺點:

1.多階段的訓練
2.特征向量需要被存儲在磁盤上
3.SPPnet不能更新SPP之前的卷積層

 

3.3 Fast RCNN的改進:

1. 比R-CNN更高的檢測質量(mAP); 
2. 把多個任務的損失函數寫到一起,實現單級的訓練過程; 
3. 在訓練時可更新所有的層; 
4. 不需要在磁盤中存儲特征。

 

四,Fast RCNN整體框架:

整體框架如下圖,如果以AlexNet(5個卷積和3個全連接)為例,大致的訓練過程可以理解為:
1.selective search在一張圖片中得到約2k個object proposal(這里稱為RoI)

2.縮放圖片的scale得到圖片金字塔,FP得到conv5的特征金字塔。

3.對於每個scale的每個ROI,求取映射關系,在conv5中crop出對應的patch。並用一個單層的SPP layer(這里稱為Rol pooling layer)來統一到一樣的尺度(對於AlexNet是6x6)。

4.繼續經過兩個全連接得到特征,這特征又分別share到兩個新的全連接,連接上兩個優化目標。第一個優化目標是分類,使用softmax,第二個優化目標是bbox regression,使用了一個smooth的L1-loss.
(除了1,上面的2-4是joint training的。測試時候,在4之后做一個NMS即可。)

 

這里我把自己看論文認為的處理過程寫出來:

1.將原圖 & 一系列對象區域 輸入整個框架;
2.用一些卷積層 & max pooling層只對原圖產生卷積后的feature map
3.從feature map中將對應的ROI區域用 pooling層(這里的SPP金字塔只有一層)提取固定長度的特征向量
4.將固定長度的特征向量經過一系列全連接層
5.每個向量產生兩個輸出:
   5.1 一個是對類別可能性概率的估計(包括K種類別 和 一個背景)
   5.2 一個是對每一種對象類別產生的4個實數,就是bbox的坐標

??????一個問題??????

為什么是一層SPP金字塔,多層不是更好?

對於這個問題,筆者認為是因為需要讀取pretrain model來finetuning的原因,比如VGG就release了一個19層的model,如果是使用多層的SPP layer就不能夠直接使用這個model的parameters,而需要重新訓練了。

????????????????

 

五,這里再惡補一個知識點 SGD(Stochastic Gradient Descent-隨機梯度下降,SGD)方法:

一種擬合函數關系的一種方法,詳細后面再補充。

 

六,預訓練網絡的初始化:

1.最后一個max pooling 層被ROI pooling層所取代,設置一個H,W使得和第一個全連接層的匹配
2.最后一個全連接層和softmax層被替換成兩個姊妹層。
3.網絡需要兩個輸入:原圖 & 一系列的ROI區域

 

七,訓練FRCN網絡時,用於檢測的調優技巧:

7.1  Multi-task loss:

  這里寫圖片描述

  第一項是分類損失,第二項是定位損失,L由R個輸出取均值而來。

1)對於分類loss,是一個N+1路的softmax輸出,其中的N是類別個數,1是背景。為何不用SVM做分類器了?在5.4作者討論了softmax效果比SVM好,因為它引入了類間競爭。(原文作者覺得這個理由略牽強,他估計還是實驗效果驗證了softmax的performance好吧 ^_^)
2)對於回歸loss,是一個4xN路輸出的regressor,也就是說對於每個類別都會訓練一個單獨的regressor的意思,比較有意思的是,這里regressor的loss不是L2的,而是一個平滑的L1,形式如下:



作者這樣設置的目的是想讓loss對於離群點更加魯棒,控制梯度的量級使得訓練時不容易跑飛。
最后在5.1的討論中,作者說明了Multitask loss是有助於網絡的performance的。

 

7.2  Mini-batch sampling:(小批量采樣)

這里沒怎么理解。。。

 

7.3  Back-propagation through RoI pooling layers(RoI pooling層的反向傳播):

 

7.4  SGD超參數(SGD hyperparameters):

 

八,尺度不變形:

SPPnet用了兩種實現尺度不變的方法: 
1. brute force (single scale),直接將image設置為某種scale,直接輸入網絡訓練,期望網絡自己適應這個scale。 
2. image pyramids (multi scale),生成一個圖像金字塔,在multi-scale訓練時,對於要用的RoI,在金字塔上找到一個最接近227x227的尺寸,然后用這個尺寸訓練網絡。 
雖然看起來2比較好,但是非常耗時,而且性能提高也不對,大約只有1%,所以這篇論文在實現中還是用了1。

 

九,用FRCN檢測(FRCN的測試階段):

@@@Truncated SVD for faster detection

在分類中,計算全連接層比卷積層快,而在檢測中由於一個圖中要提取2000個RoI,所以大部分時間都用在計算全連接層了。文中采用奇異值分解的方法來減少計算fc層的時間.

具體來說,作者對全連接層的矩陣做了一個SVD分解,mAP幾乎不怎么降(0.3%),但速度提速30%

 

-----------------------------

RCNN:《Rich feature hierarchies for Accurate Object Detection and Segmentation》

R*CNN:《Contextual Action Recognition with R*CNN》

SPP-Net:《Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition》

Fast-rcnn:《Fast R-CNN》

Faster-rcnn: 《Faster R-CNN: Towards Real-Time Object  Detection with Region Proposal Networks》

YOLO:《You Only Look Once(YOLO):Unified, Real-Time Object Detection》

FCN:《Fully Convolutional Networks for Semantic Segmentation》

-------------------------------

 


免責聲明!

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



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