論文名:Fast R-CNN
論文作者:Ross Girshick
期刊/會議名:ICCV 2015
發表時間:2015-9
?論文地址:https://arxiv.org/pdf/1504.08083
源碼:https://github.com/rbgirshick/fast-rcnn
摘要
這篇論文提出了一個快速的R-CNN網絡,也就是Fast R-CNN用于目標檢測任務。Fast R-CNN使用了深度卷積神經網絡來高效地對候選區域進行分類。并且與之前的工作相比,Fast R-CNN既能提高訓練和測試時的速度,又能增加檢測的精度。在當時比較典型的目標檢測算法就是R-CNN和SPPnet,所以接下來就舉了R-CNN和SPPnet這兩個例子,來對比說明Fast R-CNN速度有多快。比如與R-CNN相比,Fast R-CNN在訓練時能夠快9倍,在測試時快了213倍。與SPPnet相比,Fast R-CNN訓練時快了3倍,測試時快了10倍。所以說Fast R-CNN在當時與其他的目標點這模型相比,速度又快,精度又高,在當時是一個比較優秀的算法。
1.引言
1.1.R-CNN and SPPnet
分別寫了R-CNN和SPPnet的缺點。
比如在這里先是R-CNN有一些缺點,然后在下面這里又寫了SPPnet也有一些缺點。因此作者提出了一種新的訓練方法來解決R-CNN和SPPnet的這個缺點,這個新的方法也被稱為Fast R-CNN。
先來看一下R-CNN具體的這三個缺點,其中前兩條都是在算法訓練時的缺點,第三條是算法測試時的缺點。我們之前在講R-CNN論文的時候,有提到AlexNet的算法在訓練時是分了不同的多個階段的。首先是訓練了一個CNN用來提取候選區域的特征。等這個cnn訓練好后再提取整個數據集上所有區域的特征,然后利用特征來額外訓練一個SVM網絡來對候選區域進行分類。如果是R-CNN BB算法的話,它還會有第三個階段,也就是訓練一個框回歸的模型用來回歸出候選框的精確位置。所以說整個網絡的訓練過程是一個多階段的訓練過程,因為它要先訓練CNN再訓練SVM,最后還要訓練一個框回歸器,在訓練svm和框回歸模型的時候,是不是需要把每一張圖片上的每一個候選框的這個特征都給它去提取出來,等這些特征都被提取出來后才能訓練后續的模型,所以利用CNN提取到這個特征需要先把它寫到磁盤里,供后續訓練使用。所以在訓練過程中會耗費大量的空間來存特征,會耗費大量的時間來提取特征。
R-CNN測試流程:
對于一張測試圖片,R-CNN也需要先產生2000個候選區域,每個候選區域都需要通過這個CNN的前向傳播來提特征,因此測試一張圖片的速度也會特別慢,導致一張圖的測試時間可能會達到47秒。通過剛剛對這三條的分析,我們可以看出來,R-CNN它之所以慢,是不是很大程度上都是因為它需要使用一個CNN來前向傳播,提取每一個候選區域的特征,沒有用到共享計算。因此后續提出的SPPnet這個網絡,就嘗試通過共享計算來加速R-CNN的訓練和測試過程。
?SPPnet的改進思路:
這里是SPPnet論文里的一個網絡結構圖。它的核心其實就是引入了一個這個spp層,也叫空間金字塔池化層。R-CNN里的CNN它其實就是AlexNet或者VGG這種圖像分類網絡,它本質上就是幾個CNN跟上一個最大尺化層,幾個CNN跟上一個最大石化層,然后這樣不斷堆疊的這種形式,最后再跟上幾個全連接層的形式,然后在這里是橫著把這個網絡畫出來了。然后在SPPnet這里它是豎著畫了一個網絡,在這里也是這種卷積層加上最大石化層,不斷的堆疊,...,在最后再跟上了幾個全連接層的形式。所以說SPPnet的這個網絡結構跟R-CNN里的CNN其實幾乎是一樣的,它們唯一的區別就是R-CNN里的這個CNN,它在原先的這個全連接層的前面是一個最大值化層,但是在SPPnet這個網絡里,全連接層前面的最后一個最大石化給替換成了一個空間金字塔池化層,這個空間金字塔紙化層的優點就是當你傳入一張圖片,通過一些卷積層和池化層,在最后通過一個卷積層的時候,假如得到了一個13x13x256通道的這么一個特征圖,在這里只畫了其中的一個通道。
正常在R-CNN的情況下,它會使用一個3x3大小,步長為2的一個最大池化層把13x13x256通道的特征圖變成6x6大小的一個特征圖,然后再把最后池化的這個結果拉平后,傳給全連接層,獲取最終的一個圖片特征。這個SPP層它本質上就是限制了輸出尺寸,也就是說它采用了一個動態的池化和尺寸。比如想從13x13的這個圖中得到4x4大小的特征圖,那么只需要使用13÷4,再向上取整的這么一個值來作為池化合的一個尺寸,也就是43÷4,再向下取整的這個值也就是三來作為池化后的步長,然后以這個尺寸為4,步長為3的一個池化后去在13x13的特征圖上做池化運算,最后就會產生一個4x4大小的輸出特征圖,這個2x2和1x11大小的輸出特征圖也是同理,通過這種方法可以算出來。所以說這個空間金字塔池化層的池化后的尺寸和步長是一個動態變化的過程,它會根據輸出特征圖的尺寸來動態的改變池化合的尺寸和步長,在得到4x4大小,2x2大小和1x1大小的一個特征圖之后,再把這些特征給拼接起來,就形成了一個固定長度的一個特征了,然后再把這個特征給傳給后續的全連接層來形成最終的一個候選區域的圖片特征。所以說有了這種空間金字塔池化層,就可以輸入任意大小的圖片了,因為輸入任意大小的圖片后,不管最后得到這個特征圖是多少,都可以通過這一層來把它產生一個固定大小的一個輸出,最后得到一個固定大小的一個特征。
既然不需要像R-CNN這樣去限制cnn的輸入尺寸了,那是不是可以換個思路就是不傳候選區域進去而是直接把整幅圖片給傳到CNN當中,比如在原圖上候選區域是這一部分區域,原圖最后產生的這個特征圖,它這個候選區域的特征也就是這一部分的區域,因此就可以直接把候選區域的特征圖摳出來就可以了,由于不同位置最后得到的候選區域的這個尺寸是不一樣的,但是正好可以利用這個SPP層把不同尺寸的特征圖給轉換成特定大小的一個輸出,就可以只用把一整張圖傳進去給CNN,然后在CNN里只使用這一整張圖進行一次前向傳播,然后計算整張圖的一個特征圖,最后再把各個候選區域的特征給摳出來就可以了,也就是在整張圖上共享計算了,這就是SPPnet最終采用的一個方法。
SPPnet不是像R-CNN一樣把每一個候選區摳出來后再傳給CNN去進行一次前向傳播提取特征。這就解決了R-CNN的第三個問題,也就是在測試圖片的時候不需要把每個區域都給傳入到CNN中進行預測了,只需要傳一整張圖進去就就可以了。雖然解決了第三個問題,但是SPPnet還是有一些缺點的,首先像R-CNN一樣,SPPnet的訓練過程還是一個多階段的過程,因為在最后利用全連接層提取到特征之后還是像R-CNN一樣額外單獨訓練一個分類器或者訓練一個回歸模型。所以它還是一個多階段的訓練過程,并沒有解決R-CNN的第一個問題。既然是多階段的,那么所有特征還是需要先存下來,寫到磁盤里,以便后續訓練使用,所以R-CNN的第二個問題也沒有得到解決,并且雖然第三個問題通過特征共享解決了,但是它又引入了一個新的問題就是SPPnet的微調算法很難去更新這個卷積層。
因此本文就提出了Fast R-CNN的方法來嘗試解決上述R-CNN和SPPnet的缺點,Fast R-CNN有非常多的優點:
1.2.Fast R-CNN的貢獻
第一,它比R-CNN和SPPnet具有更高的一個檢測精度。第二,它的訓練過程是一個單階段的過程而不再是多階段了。第三,訓練能更新所有的網絡層而不是像SPPnet的第三個缺點不能更新卷積層。第四,由于訓練過程變成單階段了,所以說他也就不需要額外的磁盤空間來緩存特征了。
2.Fast R-CNN的模型結構和訓練流程?
圖一展示了Fast R-CNN的模型結構,圖一對于一整張輸入圖片,Fast R-CNN會先通過一個深度卷積神經網絡來得到整張圖片的一個圖片特征,根據候選區域在原圖上的一個圖片位置,可以使用RoI投影來獲取到候選區域在特征圖上的這個候選區域特征,有了候選區域的特征圖之后再通過RoI池化層來把這個尺寸不固定的候選區域特征圖給轉換成特定尺寸的一個特征圖,然后再接上兩個全連接層來得到每一個區域的特征向量,有了每一個候選區域的特征后再額外接上兩個并行的全連接層,其中一個利用softmax函數負責預測類別,另一個直接預測和框的坐標相關的一個框回歸,這個預測類別的分支,輸出k+1個類別,也就是數據集的類別加上一個背景類。另一個預測坐標的分支直接輸出4乘以(k+1)個值,也就是每個類別對應的坐標。
回顧SPPnet的網絡結構,就可以發現他們兩個的區別是不是就兩點,第一點區別是SPPnet在最后一個卷積層后面跟上的是一個空間金字塔池化,但是Fast R-CNN在最后一個卷積層后面跟上的是一個RoI池化層。第二點區別就是SPPnet在提取到候選區域的特征之后會像R-CNN一樣額外訓練支持向量機進行分類或回歸,但是Fast R-CNN在這里是后面直接接了兩個并行的全連接層實現分類和回歸。
?2.1.RoI池化層
RoI池化層能將任意有效的候選區域內的這個特征給轉化成一個小的特征圖,并且這個小的特征圖具有特定的一個空間范圍,這不就是SPPnet的這個空間金字塔池化層所干的事嗎。因為它本質上就是使用最大池化把不規則的一個特征圖給轉換成一個特定尺寸的輸出,只不過在這個空間金字塔池化層這里,它是分別使用了三個不同的池化來得到三個不同大小的一個輸出。但是在Fast R-CNN這里,作者只用了一個池化來得到一個輸出,所以作者才在最后這里寫到RoI池化層僅僅是空間金字塔池化層的一種特殊情況,因為金字塔池化層是有三個輸出,但是RoI池化層在這里它只有一個輸出。
2.2.從預訓練的模型中初始化一個Fast R-CNN模型?
?作者試驗了三個預訓練的Imagenet網絡,每個網絡都具有五個最大池化層并且具有5到13個卷積層。這三個預訓練模型的具體結構會在4.1小節給詳細列出。
所以這個就是預訓練網絡,它其實指的就是在Imagenet上預訓練好的一個圖像分類模型,預訓練的分類模型它一般都是這種結構,也就是說先傳入一整張圖片,給一個深度卷積網絡然后這個深度卷積網絡會得到這一整張圖片的一個特征圖,然后接上一個固定尺寸的最大值化層來對這一個特征圖做最大池化,再接上幾個全連接層,最后再跟上一個全連接層和softmax函數來輸出Imagenet數據集上的1000個圖像類別。這里的這個初始化指的其實就是把一個預訓練的一個圖像分類網絡給變成Fast R-CNN網絡的這么一個過程。
也就是從上面這個模型變成下面這個模型的過程,在變換的過程中一共經歷了三個變換階段。第一步先把最后的一個最大池化層給替換成RoI池化層。第二步是把最后的一個全連接層和softmax層給替換成了兩個并行的全連接層,其中一個分支用來預測k+1個類別,另一個分支用來預測邊界框回歸。第三步是把網絡給修改成了兩個數據輸入,除了輸入圖片外還需要輸入圖片中的一系列候選區域坐標以便于在最終的這個特征圖中把這個根據這個候選區域的坐標,把這個候選區域的特征給提取出來。
2.3.在檢測任務上進行微調?
在初始化好模型之后就需要開始微調這個檢測模型了。微調模型其實就是使用反向傳播來訓練整個網絡的一個權重,Fast R-CNN具有很好的訓練權重的能力,但是SPPnet卻不能很好的更新網絡權重,為什么呢?這就需要涉及到訓練過程中樣本的一個采樣方法。
看一下模型結構,這里因為是測試一張圖片,所以只有一張圖片,但是在模型訓練時它是需要一批一批的圖片給這個卷積神經網絡的一次會傳入多張圖片。在反向傳播更新權重的時候是需要利用正向傳播得到的中間每一層的值去更新權重的。假如是SPPnet在訓練時,它傳入的多張圖片,一批樣本是通過隨機采樣得到的,比如說需要128個候選區,這128個區域它可能是來自不同的圖片,也就是說需要傳入128張這種類似的原圖進去,然后在128個特征圖中各自提取各自所需要的這個后面區域。在前向傳播和反饋傳播的過程中會占用大量的顯存,降低模型的訓練效率,但是Fast R-CNN采用的是另一種方法。
在Fast R-CNN的訓練過程中,隨機梯度下降的這個mini batch它是通過一種按層抽樣的方法,這里以n=2,r=128為例,它會首先采樣兩張圖片然后在每張圖片上各自采樣64個候選區域,這樣做的好處就是每次在前會傳播的時候只傳兩張圖片進去就可以了。因為每張圖片的64個區域都是在一張圖上去得到的,所以說只需要兩張原圖傳進去,然后在兩張原圖的特征圖上各自提取64個候選區域就可以了,而不是像SPPnet一樣需要去傳入128個原圖。這就大大提升了訓練效率,這也就是作者他為什么提到SPPnet不能夠更新空間,金字塔池化層之前的一個網絡權重,因為它因為它更新權重的效率實在太低了。
?2.4.多任務損失函數
Fast R-CNN網絡是有兩個并行的輸出層的。這第一個輸出用來產生k+1個類別,其中p0 就表示某個候選區域是背景類的概率,p1-pk就表示屬于k數據集類別的概率。第二個分支輸出的就是一個框回歸的一個偏移量,它預測出來的tx和ty就表示框的中心點歸一化后的偏移量,tw和th就表示跟邊界框的寬和高相關的一個值,它們四個的具體含義跟R-CNN中的定義是一樣的。
求損失函數的時候除了要有預測值之外,還需要有一個提前標注好的一個目標值,也就是ground truth。作者在這里把標注好的候選區域類別給用u這個符號給表示出來,把邊界框回歸的這個目標值給定義成v這個符號。多任務損失的公式就可以寫成這種形式,也就是類別損失和框回歸損失相加的一個形式?
在求類別損失的時候,它用到了類別的預測值和類別的一個目標值,類別損失的具體公式就寫成了這種形式,它相當于是求了du類預測概率的log損失來作為分類的一個損失,在求框回歸損失的時候,用到了du類目標的一個坐標,預測值和目標值,它的具體公式就寫成了這種形式
通過求x y w h這四個值的預測值和目標值之間的一個smooth L1損失來作為框回歸的一個損失公式,smooth L1的一個具體的公式就是下面的這種形式,在這里也回顧一下R-CNN中使用的L2 損失,L2損失是這種形式就是x平方,看一下它們的圖像:
如果使用L2 損失,就這條曲線它是可以向兩端無限延伸的。如果你預測出來的這個預測值和目標值偏差過大的話,就會導致這個x過大,這x過大的話就會導致你這個值一直無限的往上延伸,然后在這個圖像上,它的這個斜率其實就是梯度,當無限往上延伸的時候這個梯度就會趨向于無窮大,就會產生梯度爆炸現象,沒法訓練。所以這個smooth L1損失在x大于等于1的時候把它寫成了這種形式
因為這種形式它的梯度是恒等于1的,也就是說它相當于是給這個梯度它設置了一個上限就不會再像這種L2 損失是一樣產生梯度爆炸的。因為這個梯度是恒等于1的,當x絕對值小于1的時候,這里多乘了一個0.5的這一個系數是為了讓這個分段函數它在x等于1的這個點兩端的一個梯度值是連續的。在公式中還有一個超參數就是lambda,這個lambda它其實就是用來控制你的分類損失和回歸損失之間的一個平衡,這個lamba的值一般被設置為1。
在公式里面還有一個就是這個方括號,它表示只有當目標類別是大于等于1的時候,這個方框的值才等于1,表示需要去求這個回歸損失。如果u等于0的話就表示這是一個背景類,這個值也就是零。所以最后求出一下這個回歸損失就是0。因為背景類它是沒有預測框的,也就不需要去求后邊這個回歸損失。
?2.5.尺度不變性
尺度不變性指的就是有兩個相同的目標,一個目標比較大,一個目標比較小。如果這兩個目標都能夠被模型識別出來,就說明這個模型具有比較好的尺度不變性。
作者實現了兩種方法來實現目標檢測的尺度不變性,第一種brute force,可以把它理解成單尺度訓練,在單尺度訓練過程中每一張圖片都被處理成了一個預定義好的圖片尺寸來進行訓練或者是進行預測。它的目的是讓網絡來直接學會尺度不變形。第二種這種多尺度方法其實就是在訓練期間,每一張圖片都先被隨機采樣成一個特定的尺度而不是像第一種一樣是采用一個預定義的固定尺度,然后這種多尺度的訓練方法也是一種數據增強的方式。關于這兩種方法哪種好,在第五章的時候會有實驗結果做對比。
3.Fast R-CNN測試
一旦Fast R-CNN的網絡被微調好后就可以進行目標檢測了。整個網絡只需要接收兩個輸入,分別是一張圖片和這個圖片中的一系列目標候選區域,就能夠預測出候選區域的類別和精確坐標了。
3.1.截斷SVD以便更快地檢測??
對于圖像分類任務來說,花費在全連接層上的時間比花費在卷積層上的時間要小。相反的對于檢測任務來說,由于這個RoI的數量非常非常的大,因此幾乎一半的錢會傳播時間都被花費在了計算全連接層上,這是因為在測試一張圖片的時候只需要通過一次前向傳播把這一整張圖的一個特征圖給提取出來就可以了。但是在后面進行全連接層運算的時候需要把這一張圖上所有的候選區域摳出來后的這個候選區域特征圖都給通過后面的全連接層去進行運算。所以說后面這個全連接層會占據大量的一個測試時間,所以必須要對后面這個全連接層進行加速,大的全連接層的一個加速方法就是通過這種階段的奇異值分解方法
先理解這個SVD是什么?簡單來說假如有一個u乘v大小的一個矩陣,可以通過奇異值分解把它分解成一個u乘n大小的矩陣,乘上一個n乘n大小的一個對角矩陣,再乘上一個n乘v大小的一個矩陣,并且中間的這個對角矩陣其實有一個性質就越靠近左上角的這個值越重要,越靠近右下角的這個值越不重要,既然右下角的這個值不重要,那就可以直接把這些值給去掉,讓中間的這個矩陣它變成一個t乘t的一個矩陣,相當于把后面的元素都給去掉,然后只保留左上角這一部分變成一個t乘t的矩陣,相應的前面這個矩陣就把最后這幾列給去掉,變成u乘t的一個矩陣,然后后面這個矩陣就把最后的這幾行給去掉就變成一個t乘v的一個矩陣,相當于對原始的這么一個u乘v的矩陣做了一個壓縮。我們把這個公式用字母表示就可以表示成左邊的這種形式,也就是左邊的這個矩陣跟你右邊的這個壓縮后的矩陣,其實兩者是可以近似相等的。
現在回到全連接層的概念,全連接層本質上就是讓參數矩陣w和一個輸入特征x去進行相乘,既然左邊乘x的,那么右邊也可以乘上一個x,也就是說可以把單個全連接層w給替換成兩個全連接層,這兩個全連接層中的第一個是使用了一個權重矩陣,這個形式也就是這個來作為兩個全連接層中的第一個,然后兩個全連接層中的第二個就使用這個u來作為權重矩陣,也就是這個這個全中,這就可以把左邊的這個和全連接層用右邊兩個更小的全連接層近似替換了,然后在替換前左邊的這個參數是u乘w的參數,然后右邊壓縮后的參數其實是u乘t加上一個v乘t,并且在右邊這個壓縮的力度越大,最后在右邊的這個參數是越小的,參數越少,模型的運行速度就會越快。所以說通過這種截斷的奇異值分解法可以提高全連接層的一個推理速度。
4.實驗結果
證明1. State-of-the-art mAP on VOC07, 2010, and 2012
證明2. Fast training and testing compared to R-CNN, SPPnet?
證明3. Fine-tuning conv layers in VGG16 improves mAP?
5.設計評價?
5.1多任務訓練有幫助嗎
實驗結果表明,這個多任務訓練的一個結果確實是要比這個多階段的訓練效果要好的。
5.2單尺度訓練和多尺度訓練的一個效果對比
?5.3Fast R-CNN是否需要更多的訓練數據
證明了對Fast R-CNN來說,更多的訓練數據確實會提高模型的精度而不會出現其他傳統模型出現了這種精度飽和的情況。
5.4支持向量機是否比soft max的訓練效果好
5.5候選區域是不是越多越好
參考視頻
目標檢測之Fast R-CNN論文精講,Fast RCNN_嗶哩嗶哩_bilibili