1. 程式人生 > >針對Faster RCNN具體細節以及原始碼的解讀之RoIPooling層

針對Faster RCNN具體細節以及原始碼的解讀之RoIPooling層

從今天開始,閱讀faster rcnn的相關程式碼,並記錄我對faster rcnn中特別的層的理解。本篇主要是對RoiPooling進行解讀。

RBG大神認為CPU版本的太慢了,故有些操作CPU版壓根就沒有實現。RoI Pooling就是實現從原圖區域對映到conv5區域最後pooling到固定大小的功能。

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

LayerSetUp

將引數賦值。

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累加。