讀論文系列:Object Detection NIPS2015 Faster RCNN
轉載請註明作者:夢裡茶
Faster RCNN在Fast RCNN上更進一步,將Region Proposal也用神經網路來做,如果說Fast RCNN的最大貢獻是ROI pooling layer和Multi task,那麼RPN(Region Proposal Networks)就是Faster RCNN的最大亮點了。使用RPN產生的proposals比selective search要少很多(300vs2000),因此也一定程度上減少了後面detection的計算量。
Introduction
Fast RCNN之後,detection的計算瓶頸就卡在了Region Proposal上。一個重要原因就是,Region Proposal是用CPU算的,但是直接將其用GPU實現一遍也有問題,許多提取規則其實是可以重用的,因此有必要找一種能夠共享算力的GPU版Region Proposal。
Faster RCNN則是專門訓練了一個卷積神經網路來回歸bounding box,從而代替region proposal。這個網路完全由卷積操作實現,並且引入anchor以應對對象形狀尺寸各異的問題,測試速度與Fast RCNN相比速度極快。
這個網路叫做region proposal layer.
RPN
訓練數據就是圖片和bounding box
- 輸入任意尺寸的圖片,縮放到800×600
- 輸入到一個基礎卷積神經網路,比如ZF或者VGG,以ZF為例,得到一個51×39的feature map
- 用一個小的網路在feature map上滑窗,算每個3x3窗口的feature,輸出一個長度為256的向量,這個操作很自然就是用3×3卷積來實現,於是可以得到一個51×39×256的feature map
- 每個256向量跟feature map上一個3×3窗口對應,也跟800×600的原圖上9個區域相對應,具體講一下這個9個區域:
- 卷積後feature map上的每個3x3的區域對應原圖上一個比較大的感受野,用ZF做前面的卷積層,感受野為171×171,用VGG感受野為228×228
- 我們想用feature map來判斷它的感受野是否是前景,從而將感受野作為proposal,但是對象並不總是正方形的,於是我們需要對感受野做一個替換,得到多種形狀的proposal
- 我們讓每個3x3的區域(圖中橙色方格)和原圖上九個區域相對應,這九個區域的中心(灰色方格)就是感受野的中心
- 九個區域有九種尺寸分別是
- 128x128 128x64 64x128
256x256 256x128 128x256
512x512 512x256 256x512 - 這九個區域我們也成為9個anchor,或者9個reference box
- 如此,每個特徵就能和原圖上形狀和尺寸各異的區域對應起來了
- 回到剛剛的256向量,將這個向量輸入一個FC,得到2x9個輸出,代表9個anchor為前景還是背景的概率
- 學慣用的標籤設置:如果anchor與真實bounding box重疊率大於0.7,就當做是前景,如果小於0.3,就當做背景
- 將256向量輸入另一個FC,得到4x9個輸出,代表9個anchor的修正後的位置信息(x,y,w,h)
- 學慣用的標籤就是真實的bounding box,用的還是之s前Faster RCNN的bounding box regression
兩個FC在實現的時候是分別用兩個1x1卷積實現的
以橙色為例,256向量和W1矩陣相乘,得到長度為18的向量,這樣的操作在51x39個feature都要做一遍,實現起來就很自然變成了用一個1x1的卷積核在feature map上做卷積啦,這樣也暗含了一個假設,不同位置的slide window對於anchor的偏好是相同的,是一個參數數量與精度的權衡問題。
- 於是我們會得到圖片上51x39x9≈20K個anchor為前景的概率,以及修正後的位置
上面這個過程可以完全獨立地訓練,得到一個很好的Region Proposal Network
理論上我們可以用上面這個流程去訓練RPN,但訓練RPN的時候,一個batch會直接跑20K個anchor開銷太大了。
- 因此每個batch是采一張圖裡的256個anchor來訓練全連接層和卷積層;
- 這256個anchor里正負樣本比例為1:1,正樣本128個,負樣本128個,
- 如果正樣本不足128個,用負樣本填充,這也意味著並非所有的背景anchor都會拿來訓練RPN,因為前景的anchor會遠少於背景的anchor,丟掉一些背景anchor才能保證樣本平衡,丟背景anchor的時候
- 具體實現上,先算所有anchor,再算所有anchor與bounding box的重疊率,然後選擇batch中的256個anchor,參與訓練。同一張圖會多次參與訓練,直到圖中的正anchor用完。
因此最終的一個mini batch的訓練損失函數為:
其中,
- 是一個batch中的多個anchor屬於前景/後景的預測概率向量, 是一個batch中正anchor對應的bounding box位置向量
- 是softmax二分類損失
- 跟Fast RCNN中的bounding box regression loss一樣,乘一個 ,意味著只有前景計算bounding box regression loss
- 論文中說 為256,也就是mini-batch size, 約為2569=2304(論文中說約等於2400),這意味著一對p對應9個t,這種對應關係也體現在全連接層的輸出個數上,由於兩個task輸出數量差別比較大,所以要做一下歸一化。
但這就意味著loss中的mini-batch size是以3x3的slide window為單位的,因為只有slide window和anchor的個數才有這種1:9的關係,而挑選訓練樣本講的mini-batch size卻是以anchor為單位的,所以我猜實際操作是這樣的:
- 先選256個anchor,
- 然後找它們對應的256個slide window,
- 然後再算這256個slide window對應的256×9個anchor的loss,每個slide window對應一個256特徵,有一個 ,同時對應9個anchor,有9個
論文這裡講得超級混亂,可以感受下:
Proposal layer
其實這也可以算是RPN的一部分,不過這部分不需要訓練,所以單獨拉出來講
接下來我們會進入一個proposal layer,根據前面得到的這些信息,挑選region給後面的fast rcnn訓練
- 圖片輸入RPN後,我們手頭的信息:anchor,anchor score,anchor location to fix
- 用全連接層的位置修正結果修正anchor位置
- 將修正後的anchor按照前景概率從高到底排序,取前6000個
- 邊緣的anchor可能超出原圖的範圍,將嚴重超出邊緣的anchor過濾掉
- 對anchor做非極大抑制,跟RCNN一樣的操作
- 再次將剩下的anchor按照anchor score從高到低排序(仍然可能有背景anchor的),取前300個作為proposals輸出,如果不足300個就…也沒啥關係,比如只有100個就100個來用,其實不足300個的情況很少的,你想Selective Search都有2000個。
Fast RCNN
接下來就是按照Fast RCNN的模式來訓練了,我們可以為每張圖前向傳播從proposal_layer出來得到最多300個proposals,然後
- 取一張圖的128個proposal作為樣本,一張圖可以取多次,直到proposal用完,正樣本不夠128的話填負樣本。
- 餵給Fast RCNN做分類和bounding box回歸,這裡跟RPN很像,但又有所不同,
- BB regressor:擬合proposal和bounding box,而非擬合anchor和bounding box
- Classifier:Object多分類,而非前景背景二分類
迭代訓練
RPN和Fast RCNN其實是很像的,因此可以一定程度上共享初始權重,實際訓練順序如下(MATLAB版):
1. 先用ImageNet pretrain ZF或VGG2. 訓練RPN3. 用RPN得到的proposal去訓練Fast RCNN4. 用Fast RCNN訓練得到的網路去初始化RPN5. 凍結RPN與Fast RCNN共享的卷積層,Fine tune RPN6. 凍結RPN與Fast RCNN共享的卷積層,Fine tune Fast RCNN論文中還簡單講了一下另外兩種方法:
- 將整個網路合起來一塊訓練,而不分步,但由於一開始訓練時RPN還不穩定,所以訓練Fast RCNN用的proposal是固定的anchor,最後效果差不多,訓練速度也快。
- 整個網路合起來一起訓練,不分步,訓練Fast RCNN用的proposals是RPN修正後的anchor,但這種動態的proposal數量不好處理,用的是一種RoI warping layer來解決,這又是另一篇論文的東西了。
SUMMARY
網路結構和訓練過程都介紹完了,實驗效果也是依樣畫葫蘆,就不再介紹了,整體來說,Faster RCNN這篇論文寫得很亂,很多重要的細節都要去看代碼才能知道是怎麼回事,得虧是效果好才能中NIPS。。
推薦閱讀:
※目標檢測入門(二):模型的評測與訓練技巧
※目標檢測:SPPNet 論文閱讀
※PASCAL VOC數據集的標註格式
※【目標檢測簡史】Mask-RCNN
※基於深度學習的「目標檢測」演算法綜述