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的出現就是爲了解決這個瓶頸問題。html
在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的輸入是卷積後的特徵圖,輸出是多個打過度的建議框,所謂打分是對框中是不是物體打分,建議框是四個值(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,以後該特徵出兩個分支:cdn
第一個分支(reg layer)用4k個11256的卷積核卷積,最後輸出4k個數,這裏的4是一個建議框的參數,即(x,y,w,h);htm
第二個分支(cls layer)用2k個11256的卷積核卷積,最後輸出2k個數,這裏的2是該區域到底有沒有物體,即(object,non-object)。blog
那麼,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的損失函數。
首先給出函數的公式:
這個公式和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的訓練時分步的,可是不是分階段的,由於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剩下的層。
單圖測試時間的大幅縮減,讓Fast R-CNN可以真正意義上實現實時檢測任務。可是吧,Faster R-CNN的性能評價是在8個K40 GPU上作出來的。