RoIPooling、RoIAlign

本文对比分析了RoIPooling和RoIAlign两种用于目标检测中区域提议映射的技术。RoIPooling通过量化操作将不同大小的ROI映射到固定大小的特征图,但存在像素偏差问题。RoIAlign则采用双线性插值法,避免量化误差,提高小目标检测精度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

功能:将不同size的ROI区域映射到固定大小的feature map上

1.RoIPooling

这个可以在Faster RCNN中使用以便使生成的候选框region proposal映射产生固定大小的feature map

 先贴出一张图,接着通过这图解释RoiPooling的工作原理   

    针对上图

  1)Conv layers使用的是VGG16,feat_stride=32(即表示,经过网络层后图片缩小为原图的1/32),原图800*800,最后一层特征图feature map大小:25*25

  2)假定原图中有一region proposal,大小为665*665,这样,映射到特征图中的大小:665/32=20.78,即20.78*20.78,如果你看过Caffe的Roi Pooling的C++源码,在计算的时候会进行取整操作,于是,进行所谓的第一次量化,即映射的特征图大小为20*20

  3)假定pooled_w=7,pooled_h=7,即pooling后固定成7*7大小的特征图,所以,将上面在 feature map上映射的20*20的 region  proposal划分成49个同等大小的小区域,每个小区域的大小20/7=2.86,即2.86*2.86,此时,进行第二次量化,故小区域大小变成2*2;经过这两次量化,候选区域已经出现了较明显的偏差(如图中绿色部分所示)

  4)每个2*2的小区域里,取出其中最大的像素值,作为这一个区域的‘代表’,这样,49个小区域就输出49个像素值,组成7*7大小的feature map

  总结,所以,通过上面可以看出,经过两次量化,即将浮点数取整,原本在特征图上映射的20*20大小的region proposal,偏差成大小为14*14的,这样的像素偏差势必会对后层的回归定位产生影响

它的缺点:由于两次量化带来的误差;

(1)将候选框边界量化为整数点坐标值。

(2)将量化后的边界区域平均分割成 k x k 个单元(bin),对每一个单元的边界进行量化。

 所以,产生了替代方案,RoiAlign

2.RoIAlign

ROI Align的思路很简单:取消量化操作,使用双线性内插的方法获得坐标为浮点数的像素点上的图像数值,从而将整个特征聚集过程转化为一个连续的操作

这个是在Mask RCNN中使用以便使生成的候选框region proposal映射产生固定大小的feature map时提出的

先贴出一张图,接着通过这图解释RoiAlign的工作原理

 同样,针对上图,有着类似的映射

 1)Conv layers使用的是VGG16,feat_stride=32(即表示,经过网络层后图片缩小为原图的1/32),原图800*800,最后一层特征图feature map大小:25*25

 2)假定原图中有一region proposal,大小为665*665,这样,映射到特征图中的大小:665/32=20.78,即20.78*20.78,此时,没有像RoiPooling那样就行取整操作,保留浮点数

 3)假定pooled_w=7,pooled_h=7,即pooling后固定成7*7大小的特征图,所以,将在 feature map上映射的20.78*20.78的region proposal 划分成49个同等大小的小区域,每个小区域的大小20.78/7=2.97,即2.97*2.97

 4)假定采样点数为4,即表示,对于每个2.97*2.97的小区域,平分四份,每一份取其中心点位置,而中心点位置的像素,采用双线性插值法进行计算,这样,就会得到四个点的像素值,如下图

上图中,四个红色叉叉‘×’的像素值是通过双线性插值算法计算得到的

 最后,取四个像素值中最大值作为这个小区域(即:2.97*2.97大小的区域)的像素值,如此类推,同样是49个小区域得到49个像素值,组成7*7大小的feature map

 总结:知道了RoiPooling和RoiAlign实现原理,在以后的项目中可以根据实际情况进行方案的选择;对于检测图片中大目标物体时,两种方案的差别不大,而如果是图片中有较多小目标物体需要检测,则优先选择RoiAlign,更精准些....

RoIPooling                               RoIAlign

 

 

### ROI PoolingROI Align 的概念 #### ROI Pooling ROI (Region of Interest) Pooling 是一种用于将不同大小的输入转换成固定尺寸输出的技术。该方法通过将候选区域划分为相同数量的小块,然后对每一小块执行最大池化操作来获取固定维度的特征向量。这种方法确保了无论原始候选框的实际大小如何,最终得到的特征映射都具有相同的宽度和高度。 然而,在实际应用中发现,由于采用了量化的方式确定子区域边界,这可能会引入一些误差,因为这些边界的坐标通常是浮点数而被强制转成了整数值[^1]。 ```python def roi_pooling(feature_map, rois, pooled_height, pooled_width): """ 实现简单的ROI Pooling算法 参数: feature_map -- 特征图 rois -- 候选区域列表 pooled_height -- 输出的高度 pooled_width -- 输出的宽度 返回: pooled_rois -- 经过pool后的rois """ num_rois = len(rois) channels = feature_map.shape[-1] pooled_rois = np.zeros((num_rois, pooled_height, pooled_width, channels)) for i in range(num_rois): h_start, w_start, h_end, w_end = map(int, rois[i]) # 将roi划分成pooled_height * pooled_width个小格子 bin_size_h = (h_end - h_start) / float(pooled_height) bin_size_w = (w_end - w_start) / float(pooled_width) for ph in range(pooled_height): for pw in range(pooled_width): h1 = int(np.floor(ph * bin_size_h + h_start)) w1 = int(np.floor(pw * bin_size_w + w_start)) h2 = int(np.ceil((ph + 1) * bin_size_h + h_start)) w2 = int(np.ceil((pw + 1) * bin_size_w + w_start)) # 执行max pooling pooled_rois[i, ph, pw, :] = np.max( feature_map[h1:h2, w1:w2], axis=(0, 1)) return pooled_rois ``` #### ROI Align 为了克服上述提到的问题,ROI Align 被设计出来作为改进方案。与传统的ROI Pooling不同的是,ROI Align 不会简单地取最接近的位置来进行采样,而是采用双线性插值的方法精确计算出对应位置上的像素值。具体来说,对于每一个bin内的四个最近邻点,根据它们之间的相对距离加权求得目标位置处的真实响应值。这样做的好处是可以更准确地保留物体的空间信息而不受网格化的负面影响。 ```python def bilinear_interpolate(im, y, x): """Bilinear interpolation function.""" height, width = im.shape[:2] if y < 0 or y > height - 1 or x < 0 or x > width - 1: return 0 y_low = int(math.floor(y)) x_low = int(math.floor(x)) y_high = min(height - 1, math.ceil(y)) x_high = min(width - 1, math.ceil(x)) ly = y - y_low lx = x - x_low hy = 1. - ly hx = 1. - lx v1 = im[y_low, x_low] v2 = im[y_low, x_high] v3 = im[y_high, x_low] v4 = im[y_high, x_high] w1 = hy * hx w2 = hy * lx w3 = ly * hx w4 = ly * lx val = w1*v1 + w2*v2 + w3*v3 + w4*v4 return val def roi_align(feature_map, rois, pooled_height=7, pooled_width=7, sampling_ratio=-1): """ 实现简单的ROI Align算法 参数: feature_map -- 输入特征图 rois -- 区域建议框 pooled_height -- 池化后高度,默认为7 pooled_width -- 池化后宽度,默认为7 sampling_ratio -- 抽样的比例因子,默认自适应调整(-1) 返回: aligned_features -- 对齐后的特征矩阵 """ batch_size, _, feat_height, feat_width = feature_map.size() num_rois = rois.size()[0] device = feature_map.device aligned_features = torch.zeros([num_rois, feature_map.size(1), pooled_height, pooled_width]).to(device=device) for n_roi in range(num_rois): start_y, start_x, end_y, end_x = rois[n_roi].tolist() roi_width = max(end_x - start_x, 1.) roi_height = max(end_y - start_y, 1.) bin_size_h = 1. * roi_height / pooled_height bin_size_w = 1. * roi_width / pooled_width sample_num_h = ( sampling_ratio if sampling_ratio > 0 else ceil(bin_size_h)) + 1 sample_num_w = ( sampling_ratio if sampling_ratio > 0 else ceil(bin_size_w)) + 1 for ph in range(pooled_height): for pw in range(pooled_width): # 计算当前bin中心点相对于原图的比例偏移 yc = (start_y + ph * bin_size_h + ((sample_num_h - 1.) / 2.) * (bin
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值