RoI Pooling 和SPP 区别

本文详细介绍了SPP(Spatial Pyramid Pooling)和ROIPooling两种池化操作的区别。SPP允许在不同尺度上进行池化,输出固定尺寸的特征,而ROIPooling则针对特定区域进行单尺度池化。这两种技术常用于处理不同大小的输入特征,确保网络输出的一致性。

区别

两者起到的作用是相同的,把不同尺寸的特征输入转化为相同尺寸的特征输出。
SPP针对同一个输入使用了多个不同尺寸的池化操作,把不同尺度的结果拼接作为输出;
而ROI Pooling可看作单尺度的SPP,对于一个输入只进行一次池化操作。

详见此博客
spp 和RoI Pooling 差异

### SPP 层与 ROI Pooling区别 空间金字塔池化 (Spatial Pyramid Pooling, SPP) 感兴趣区域池化 (Region of Interest Pooling, ROI Pooling) 是两种用于处理可变尺寸输入图像的技术,在深度学习目标检测任务中广泛应用。 #### 空间金字塔池化(SPP) SPP 层允许任意大小的输入图片被送入神经网络,而不需要固定的输入尺寸。其核心思想是在多个尺度上提取特征图的不同层次的空间信息,并将其转换成固定长度的表示形式[^1]。具体来说: - **多级划分**:将最后一个卷积层产生的特征映射划分为若干个不同级别的子区域; - **不变形适应性**:无论原始图像有多大变化,经过此过程后都能获得相同维度的结果向量; - **灵活性高**:可以在整个网络结构之前加入该模块,使得前馈传播过程中能够接受任意分辨率的数据作为输入; ```python def spatial_pyramid_pool(previous_conv, num_sample, previous_conv_size, out_pool_size): """ 实现简单的空间金字塔池化函数 参数: previous_conv: 上一层输出的张量 num_sample: 样本数量 previous_conv_size: 输入特征图尺寸 out_pool_size: 输出池化级别列表 返回值: sppool_tensor: 经过SPP后的张量 """ for i in range(len(out_pool_size)): window_w = np.ceil(previous_conv_size[0] / out_pool_size[i]) window_h = np.ceil(previous_conv_size[1] / out_pool_size[i]) maxpool_out = tf.nn.max_pool( input=previous_conv, ksize=[1, int(window_w), int(window_h), 1], strides=[1, int(window_w), int(window_h), 1], padding='SAME' ) if(i==0): sppool_tensor=maxpool_out.reshape(num_sample,-1) else: sppool_tensor=tf.concat([sppool_tensor,maxpool_out.reshape(num_sample,-1)],axis=-1) return sppool_tensor ``` #### 感兴趣区域池化(ROI Pooling) 相比之下,ROI Pooling 主要应用于 Fast/Faster R-CNN 中的目标检测框架内,专门用来处理候选框(proposals)。对于每一个建议窗格(proposal),都会执行如下操作以获取固定大小的特征表达[^2]: - **单一定位**:针对特定位置的兴趣区进行裁剪缩放至预定规格; - **局部聚焦**:仅作用于由 Region Proposal Network 提供的具体矩形区域内; - **标准化输出**:确保最终得到的特征矩阵具有统一的高度宽度参数; ```python import tensorflow as tf def roi_pooling(input, rois, pooled_height, pooled_width): ''' 定义roi pooling 函数 参数: input: 卷积层输出的feature map rois: 建议框的位置坐标集合 pooled_height: 裁剪并调整大小后的高度 pooled_width: 裁剪并调整大小后的宽度 返回值: pool_result: 对应各个rois的pooled feature maps组成的tensor ''' batch_ids = [] xform_rois = [] for b in range(rois.shape[0]): for r in range(rois[b].shape[0]): h_start = rois[b][r][0] w_start = rois[b][r][1] h_end = rois[b][r][2] w_end = rois[b][r][3] height = h_end - h_start + 1 width = w_end - w_start + 1 bin_size_h = height / float(pooled_height) bin_size_w = width / float(pooled_width) for ph in range(pooled_height): for pw in range(pooled_width): hstart = h_start + ph * bin_size_h wstart = w_start + pw * bin_size_w hend = min(h_start+(ph+1)*bin_size_h,h_end) wend = min(w_start+(pw+1)*bin_size_w,w_end) batch_ids.append(b) xform_rois.append([hstart, wstart, hend, wend]) output = tf.image.crop_and_resize(image=input, boxes=xform_rois, box_ind=batch_ids, crop_size=(pooled_height,pooled_width)) return output ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值