Faster R-CNN簡介
RBG團隊在2015年,與Fast R-CNN同年推出了Faster R-CNN,我們先從頭回顧下Object Detection任務中各個網路的發展,首先R-CNN用分類+bounding box解決了目標檢測問題,SPP-Net解決了卷積共享計算問題,Fast R-CNN解決了end-to-end訓練的問題,那麼最後還能下一個ss演算法,依舊**於網路,是一個單獨的部分,然而這個演算法需要大概2秒的時間,這個點是R-CNN系列的效能瓶頸,所有Fast R-CNN是沒有什麼實時性的。那麼Faster R-CNN的出現就是為了解決這個瓶頸問題。
在Faster R-CNN中提出了RPN網路,Region Proposal Network(區域建議網路)以代替原來的ss演算法,可以簡單的理解為:
Faster R-CNN =Fast R-CNN+RPN-ss演算法
所以,可以說除了RPN,Faster R-CNN剩下的地方與Fast R-CNN是一樣的, 那麼理解Faster R-CNN的關鍵其實理解RPN。
RPN網路結構
首先,上面這張圖說明了RPN在Faster R-CNN中的位置,它在CNN卷積後的特徵圖上做區域建議(大約300個),並根據RPN生成的區域建議對feature maps做提取,並對提取後的特徵做RoI pooling。在RoI pooling之後的東西就和Fast R-CNN一樣了。所以RPN的輸入是卷積後的特徵圖,輸出是多個打過分的建議框,所謂打分是對框中是否是物體打分,建議框是四個值(x,y,w,h)。
RPN是一種全卷積網路,它的前幾層卷積層和Faster R-CNN的前五層是一樣的,所以RPN是在進一步的共享卷積層的計算,以降低區域建議的時間消耗。
也是因為共享卷積的原因,所以我們一般認為RPN只有兩層。而RPN前面到底有幾層,決定於Faster R-CNN選擇哪種初始模型,如果是AlexNet的話,那就是5層,如果是ZFNet的話,也是5層,如果是VGG16的話,就是13層,等等。
那麼我們還是用AlexNet舉例好了,此時的conv5特徵圖的尺寸為1313256,也就是這一層的特徵別送入到RPN中,RPN在這個特徵圖上用33256的卷積核,一共用了256個。那麼卷積核一次卷積之後的特徵就是11256,也就是下圖中的256-d,之後該特徵出兩個分支:
第一個分支(reg layer)用4k個11256的卷積核卷積,最後輸出4k個數,這裡的4是一個建議框的引數,即(x,y,w,h);
第二個分支(cls layer)用2k個11256的卷積核卷積,最後輸出2k個數,這裡的2是該區域到底有沒有物體,即(object,non-object)。
那麼,k是什麼呢? k是Anchor box(參考框)的型別數,在Faster R-CNN中k=9,分別是3個尺度scale和3個比例ratio,其中:
scale為(128,256,512)
ratio為 1:1,1:2,2:1
參考框的中心就是卷積核的中心。
所以,在conv5層上,用33卷積核每卷積一次,都會生成k個參考框,那麼參考框的總數就應該是WHK,如上所說,conv5的尺寸為1313的話,那麼生成的Anchor box的總數就是1521個。
然後我們就會發現通過上面的解釋,RPN有一些地方是說不通的,下面我們一一解釋下這些坑:
**1.上面提到Anchor box的總數是1521個,那為什麼說RPN生成300個左右的區域建議呢? **
每一個參考框都會有一個是不是物體的打分,在檢測過程中RPN計算所有的參考框後會選擇其中300個得分最高的區域。
2.參考框中的尺寸為(128,256,512),但是conv5的尺寸只有13*13,在哪裡生成這些參考框呢?
這些參考框不是在特徵圖上生成,而是在原圖上,而原圖之前的尺寸也不是224*244,這個尺寸是原圖經過壓縮得到的,所以anchor size的選擇一定是要考慮縮放前的原圖的尺寸,因為最後anchor超過的影象大小,並沒有意義。所以RPN在做的是將每個點產生的9個參考框來對映原始影象,也就是通過4k個位置偏移輸出和k個參考框,得到參考框在原始影象中的位置。就像Fast R-CNN中ss演算法,其實也是在原圖上生成的,最後只是經過了座標變化才能在conv5上提取。
**3.在卷積核卷積到一個點的時候,輸出了9個參考框,但是這9個建議框的特徵是相同的,都是256個33256卷積核卷積得到的11256的特徵,那麼這9個參考框在哪裡引導的RPN關注這些區域呢? **
特徵確實是相同的,但是得到的特徵最終是要向原圖做對映的,以得到最終的區域建議,而相同的特徵對應了9種不同的參考對映方式,於是相同的特徵,對映給不同的參考框時,loss是不同的。那麼哪種方式是做好的呢,當然是loss最小的那個。所以不同的9個參考框,它們的區別並不體現在特徵上,而是在loss上,我們下面就看下RPN的損失函式。
RPN損失函式
首先給出函式的公式:
這個公式和Fast R-CNN的多工損失其實很像,同樣是一個在做分類,一個在做迴歸,然後把兩個函式加在一起。i是一個batch中anchor box的索引。
用於分類的loss:
這依然是一個負的log值,,Pi為第i個參考框是物體的預測概率,Pi是一個指示函式,如果anchor是物體的話,Pi 就是1;如果anchor是背景,那麼Pi* 就是0。
那麼如果某一個區域是物體的話,如果pi=1,pi*=1,此時的損失函式為0;同理pi=0的話,損失函式為正無窮。
用於迴歸的loss:
其中R還是smooth L1平滑方程:
同樣的背景沒有邊界框,所以需要Pi* Lreg。
而ti與ti*分佈對應四個值,分別是x,y,w,h的座標偏差,其中:
x,y,w,h是預測框(就是reg layer的輸出);
xa,ya,wa,ha是anchor參考框;
x*,y*,w*,h*是ground truth框;
ti是預測框與anchor之間的偏差,ti是ground truth與anchor之間的偏差,那麼我們考慮一種情況,那就是ti與ti與相同了,此時損失函式就是0,那麼這意味著:
預測值與anchor之間的偏差=ground truth與anchor之間的偏差
也就是說預測值完全等於ground truth。這就是上面提到的注意機制引導RPN關注anchor的過程,當anchor不同的時候,loss函式是不同的。所以這是一個反向的過程,我們選擇出來了某一個點上3*3範圍內的特徵,那麼這個特徵是物體還是背景呢,還有就是它對應原圖中哪個區域的時候,效果是最好的呢?這就是RPN要解決的問題。
在這裡順便說一下個人的一個想法,會更方便理解,RPN在conv5上用33的卷積核卷積,那麼如果原圖上某一個區域在conv5上的大小恰好就是33呢?那麼這個卷積就相當於一個全尺寸卷積了,顯然它是可以學習到這個區域內的所有特徵的,然後我們再看下這些尺寸,這方便我們理解為什麼RPN選擇了3*3卷積。
conv5的尺寸為13*13;
卷積為3*3;
原圖大小如果是1024;
那麼anchor選擇為256的時候,它們的比例非常接近:
13/3 = 1024/256
但是原圖的尺寸不一定都是1024*1024,所以為了考慮形變與縮放,anchor有9個選擇。
Faster R-CNN訓練
Faster R-CNN的訓練時分步的,但是不是分階段的,因為end-to-end的問題在fast R-CNN就已經解決了。前面說了Faster R-CNN =Fast R-CNN +RPN,所以訓練的過程需要分步來完成,但是每一步都是end-to-end。
Step 1:訓練RPN網路;用的是ImageNet上的初始模型,因為RPN是由自己的損失函式的,所以在這裡可以先把RPN訓練起來,但是在組合mini-batch做梯度回傳的時候為了避免負樣本(背景)偏多的情況,會人為的我們隨機地在一個影象中選擇256個anchor,其中取樣的正負anchor的比例是1:1。如果一個影象中的正樣本數小於128,我們就用負樣本填補這個mini-batch。
Step 2:訓練Fast R-CNN;訓練好RPN之後,單獨訓練Fast R-CNN,此時Fast R-CNN是不與RPN共享卷積層的,也就是初始模型還是ImageNet上得到的,用的區域建議是RPN生成的,訓練的過程在之前的文章就就介紹了。
Step 3:調優RPN,在這一步中將再次訓練RPN,這不過這次的前五層卷積核與Fast R-CNN共享,用Step2中的結果初始化RPN,並固定卷積層,finetune剩下的層。
Step 4:調優Fast R-CNN,此時用的區域建議是Step3中調優後的RPN生成的,同樣是固定了卷積層,finetune剩下的層。
Faster R-CNN效能評價
上面這張圖說明了Faster R-CNN的單圖測試時間與mAP,可以看到,Fast R-CNN與R-CNN的時間與Object Detection系列(三) Fast R-CNN的說法不一樣了,這是因為後者加上了ss演算法的時間,大概2s左右的樣子。單圖測試時間的大幅縮減,讓Fast R-CNN能夠真正意義上實現實時檢測任務。但是吧,Faster R-CNN的效能評價是在8個K40 GPU上做出來的。