从今天开始,阅读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累加。