關於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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM