1. 程式人生 > >關於RoI pooling 層

關於RoI pooling 層

ROIs Pooling顧名思義,是pooling層的一種,而且是針對ROIs的pooling;

整個 ROI 的過程,就是將這些 proposal 摳出來的過程,得到大小統一的 feature map。

 

什麼是ROI呢?(https://www.sogou.com/link?url=DOb0bgH2eKh1ibpaMGjuyy_CKu9VidU_Nm_z987mVIMm3Pojx-sH_PfgfR9iaaFcn666hxi--_g.)

ROI是Region of interest的簡寫,指的是faster rcnn結構中,經過rpn層後,產生的proposal對應的box框。

ROI Pooling的輸入

輸入有兩部分組成: 
1. data:指的是進入RPN層之前的那個Conv層的Feature Map,通常我們稱之為“share_conv”; 
2. rois:指的是RPN層的輸出,一堆矩形框,形狀為1x5x1x1(4個座標+索引index),其中值得注意的是:座標的參考系不是針對feature map這張圖的,而是針對原圖的(神經網路最開始的輸入)
ROI Pooling的輸出

輸出是batch個vector,其中batch的值等於roi的個數,vector的大小為channelxwxhROI Pooling的過程就是將一個個大小不同的box矩形框,都對映成大小為wxh的矩形框;

如圖所示,我們先把roi中的座標對映到feature map上,對映規則比較簡單,就是把各個座標除以輸入圖片與feature map的大小的比值,得到了feature map上的box座標後,我們使用pooling得到輸出;由於輸入的圖片大小不一,所以這裡我們使用的spp pooling,spp pooling在pooling的過程中需要計算pooling後的結果對應的兩個畫素點反映社到feature map上所佔的範圍,然後在那個範圍中進行取max或者取average。
---------------------

(https://www.sogou.com/link?url=44aejrzSKwWwrNJcKKLVtEK1rJUb32uHp37TwbVHvja5OaZX_AHBzQ..)

TensorFlow的pool layer是固定大小的

(https://www.sogou.com/link?url=DSOYnZeCC_rR_TP93bdO6GxT14t4sbuOSwJr4L_oLI5lf9NGYfOU6pULrym3hTBVtsCnpVGpPpA.)

RoI Pooling就是實現從原圖區域對映到conv5區域最後pooling到固定大小的功能。

輸入,b0 為卷積的feature map,b1 為rois。

Reshape

將top reshape成num_b1(num of rois) c_b0 pooled_height pooled_width,將max_idx_ reshape與top一樣。

Forward(向前傳播)

首先計算rois對映到feature map的座標,即原始座標*spacial_scale(大小為所有stride的乘積分之一),然後針對每個輸出來進行計算,即每個輸出點都代表原先的一塊區域,這個區域大小為bin_h= roi_height / pooled_ height, bin_w=roi_width / pooled_width.遍歷所有top的點所映射回feature map的區域,並找到最大值,記錄最大值所在的位置。  

backward(反向傳播)

backward直接寫成gpu的形式,不過開頭可以看出是遍歷feature map並記錄n, c, h, w,為之後記錄bottom_diff做準備,然後計算每個roi對映到feature map的座標,接下來我就認為有個小問題了,作者的意思是表達如果h,w如果不在roi區域內的話,可以直接continue了,這點不難理解,某個點在roi中可能對這個roi所對應的top產生貢獻(在某個bin中為最大),如果點不在那個區域中,一定不會對top產生貢獻。而某一點可能對多個區域產生貢獻,故loss返回來時,同一點的loss累加。

(https://www.sogou.com/link?url=DSOYnZeCC_rR_TP93bdO6GxT14t4sbuOSwJr4L_oLI5lf9NGYfOU6pULrym3hTBVtsCnpVGpPpA.)

 

我們知道在Faster R-CNN中,對於每個ROI(文中叫candidate object)主要有兩個輸出,一個輸出是分類結果,也就是預測框的標籤;另一個輸出是迴歸結果,也就是預測框的座標offset。而Mask R-CNN則是添加了第三個輸出:object mask,也就說對每個ROI都輸出一個mask,該支路是通過FCN網路(如Figure1中的兩個卷積層)來實現的。以上這三個輸出支路相互之間都是平行關係,相比其他先分割再分類的例項分割演算法相比,這種平行設計不僅簡單而且高效。
---------------------
作者:AI之路
來源:CSDN
原文:https://blog.csdn.net/u014380165/article/details/81878644

大致回顧下ROI Pool層的操作:

ROI Pool的輸入是ROI的座標和某一層的輸出特徵,不管是ROI Pool還是ROIAlign,目的都是提取輸出特徵圖上該ROI座標所對應的特徵。RPN網路得到的ROI座標是針對輸入影象大小的,所以首先需要將ROI座標縮小到輸出特徵對應的大小,假設輸出特徵尺寸是輸入影象的1/16,那麼先將ROI座標除以16並取整(第一次量化),然後將取整後的ROI劃分成H*W個bin(論文中是 7*7,有時候也用14*14),因為劃分過程得到的bin的座標是浮點值,所以這裡還要將bin的座標也做一個量化,具體而言對於左上角座標採用向下取整,對於右下角座標採用向上取整,最後採用最大池化操作處理每個bin,也就是用每個bin中的最大值作為該bin的值,每個bin都通過這樣的方式得到值,最終輸出的H*W大小的ROI特徵。從這裡的介紹可以看出ROI Pool有兩次量化操作,這兩步量化操作會引入誤差。
---------------------
作者:AI之路
來源:CSDN
原文:https://blog.csdn.net/u014380165/article/details/81878644