在看fasterrcnn以及和maskrcnn的時候,發現自己對fasterrcnn的roi_pooling層的原理還是不是很明白,之前只是知道roi_pooling是將rpn輸出的乙個roi的區域對映成乙個固定大小的map,再送入後面的分類層進行分類。最近看了下roi_pooling層的原始碼,頓悟了。
根據看caffe原始碼的原則,先看該成在caffe.proto檔案中的定義:
// message that stores parameters used by roipoolinglayer
message roipoolingparameter
從這裡可以看出,在網路定義檔案中定義roi_pooling層需要設定3個引數,分別是pooled_h 、pooled_w 以及spatial_scale 的值。前2個值分別為pool後的map的寬度和高度,比如在fasterrcnn中即為6*6,後面這個值
spatial_scale 為從原圖到pool前的feature map的比例的大小,因為rpn輸出的roi的座標是基於原圖的,轉換到feature map,是有乙個比例的。
再來看看在fasterrcnn中,roi_pooling層的定義:
#*****==== rcnn **********==
layer
}
相關的引數設定和caffe.proto中定義的一致。
在這裡,主要是關注其前向傳播的函式。
namespace caffe
template
void roipoolinglayer::reshape(const
vector
*>& bottom,
const
vector
*>& top)
template
void roipoolinglayer::forward_cpu(const
vector
*>& bottom,
const
vector
*>& top)
// 求最大值
for (int h = hstart; h < hend; ++h) }}
}}
//feature map 的乙個channel遍歷完後,batch_data指標feature map的下乙個channel
batch_data += bottom[0]->offset(0, 1);
//feature map 的乙個channel遍歷完後,top_data指標自身的下乙個channel
top_data += top[0]->offset(0, 1);
//argmax_data 同上
argmax_data += max_idx_.offset(0, 1);
}// increment roi data pointer,轉到下乙個roi區域
// 轉到下乙個roi的位置
bottom_rois += bottom[1]->offset(1);
}}
需要注意以下幾點:
1、輸入roi_pool前的feature map是乙個batch_size 的。
2、輸出的top的blob的形狀引數如下: num * c* h * w,其中num與roi區域的個數是一致的。c的值和輸入feature map的通道數是一致的, h和w分別是設定的值。
3、注意3個函式,celi函式向上取整,round函式四捨五入取整,floor函式向下取整。比如資料2.7,三個函式的取值分別為: 3、 3、 2。
4、實際在執行maxpool的時候,是對feature map上的每個通道分別執行max的操作的,最後輸出的top的通道和輸入feature map的c通道數是一致的。
ROI Pooling層簡單理解
目標檢測typical architecture 通常可以分為兩個階段 1 region proposal 給定一張輸入image找出objects可能存在的所有位置。這一階段的輸出應該是一系列object可能位置的bounding box。這些通常稱之為region proposals或者 reg...
ROIPooling和ROIAlign的特點和區別
一 roipooling 這個可以在faster rcnn中使用以便使生成的候選框region proposal對映產生固定大小的feature map 先貼出一張圖,接著通過這 釋roipooling的工作原理 針對上圖 1 conv layers使用的是vgg16,feat stride 32 ...
RoIPooling與RoIAlign的區別
通過對faster rcnn的學習我媽了解的rolpooling可以使生成的候選框region proposal對映產生固定大小的feature map 先貼出一張圖,接著通過這 釋roipooling的工作原理 針對上圖 1 conv layers使用的是vgg16,feat stride 32 ...