SPP-Net中的特征映射关系

本文详细阐述了卷积神经网络(CNN)中感受野的概念及其计算方法,并提供了感受野上坐标映射的具体公式。同时,文章还介绍了SPP-Net中ROI映射的做法以及如何理解Bounding box regression。

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

转载自https://zhuanlan.zhihu.com/p/24780433,原文作者讲解的很清晰。

一、什么是感受野?

答:卷积神经网络CNN中,某一层输出结果中一个元素所对应的输入层的区域大小,被称作感受野receptive field。感受野的大小是由kernel size,stride,padding , outputsize 一起决定的。下面这个图来感受一下!
这里写图片描述
卷积过程中的词语含义:
•28*28的输入图片—-(输入图片尺寸)W =28
•5*5的local receptive fields(局部感受野,也叫滑窗,卷积核)—–(卷积核大小)K=5
•滑动步长(stride)
当W=28,K=5,stride=1时,可以得到24*24的隐层神经元。
推出公式:隐藏层边长=(W-K)/S +1

注意:不过有时候为了控制输出的隐藏层空间分布会在输入层外围做零填充,假设填充P个像素,此时:边长=(W-K+2P)/S+1,特别的当S=1时,设置零填充为P=(K-1)/2,可以保证输入层与输出层有相同的空间分布 。

这里写图片描述

综上所述:隐藏层边长(输出的边长)= (W - K + 2P)/S + 1 (其中W是输入特征的大小,K是卷积核大小,P是填充大小,S是步长(stride))。

用英文表达:
output field size = ( input field size - kernel size + 2*padding ) / stride + 1
(output field size 是卷积层的输出,input field size 是卷积层的输入)
反过来问你:卷积层的输入(也即前一层的感受野)=?
答案必然是:input field size = (output field size - 1)* stride - 2*padding + kernelsize
再重申一下:卷积神经网络CNN中,某一层输出结果中一个元素所对应的输入层的区域大小,被称作感受野receptive field。感受野的大小是由kernel size,stride,padding , outputsize一起决定的。

二、感受野上的坐标映射

  通常,我们需要知道网络里面任意两个feature map之间的坐标映射关系(一般是中心点之间的映射),如下图,我们想得到map 3上的点p3映射回map 2所在的位置p2(橙色框的中心点)。

这里写图片描述

计算公式:
(1)对于Conv或pooling层:p(i)=s(i)*p(i+1)+[(k(i)-1)/2-padding]
(2)对于Neuronlayer(ReLU/Sigmoid/…):p(I)=p(i+1)
上面是计算任意一个layer输入输出的坐标映射关系,如果是计算任意feature map之间的关系,只需要用简单的组合就可以得到,下图是一个简单的例子:
这里写图片描述
对下面图的解释:
这里写图片描述
问题:如何计算感受野区域的中心?
一个简单的解决方案是:对每一层,填充零元素P=F/2向下取整,这样的话,在每一个特征图上坐标为(0,0)的响应点的感受野是以输入图像坐标为(0,0)的点为中心的,坐标为(x,y)的点的感受野是以(Sx,Sy)为中心的,S为步长。
这里写图片描述

三、SPP-Net中ROI映射做法详解
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

四、如何理解Bounding box regression?
输入的不是region proposal的坐标,而是该proposal窗口对应的CNN特征,也就是后面得到的特征向量,(训练阶段的输入还包括Ground truth),输出是需要进行的平移变换和尺度缩放(4个值),然后直接可以计算出精修后的预测边界框。
其实就是在全连接层后面加了一个含有4个神经元的输出层,每一个神经元的输出对应平移变换和尺度缩放参数。需要训练的只是全连接层与输出层之间的连接权重矩阵。利用梯度下降法或最小二乘法就可以得到。

Vgg16结构:
卷积层:K=3,padding=1,stride=1
池化层:K=2,padding=0,stride=2
都符合 这个计算坐标的映射公式。

长短期更新:
Long-term: 在固定的帧数进行训练更新
Short-term: 当估计的目标被分类成非跟踪目标,发生错误时,即候选中概率最大的那个也小于0.5时,需要更新模型参数。怎么更新呢?在估计的目标位置处,选取正负样本,与目标边界框的IOU分别为>0.7和<0.3。

### PSMNet中的代价体构建 在PSMNet中,为了实现高效的立体匹配并提高精度,采用了特定的方法来构建代价体。该过程涉及多个阶段的操作。 #### 特征提取 首先,在特征提取模块中,使用SPP(空间金字塔池化)结构来获取多尺度的特征信息[^1]。此步骤旨在捕捉不同层次的空间细节,从而增强模型对于复杂场景的理解能力。通过这种方式获得的左视图和右视图对应的特征映射会被进一步处理以形成代价体积。 #### 创建初始代价体 接着,基于上述提取到的特征表示创建初始的三维代价体。具体来说,就是将来自同一位置但在不同视角下的特征向量组合起来作为单个像素点处的成本估计值。这一过程中会考虑到左右图像间可能存在的位移情况——即视差范围内的所有潜在对应关系都被考虑进去,形成了一个具有宽度、高度以及深度维度的数据立方体[^4]。 #### 应用重叠沙漏模块进行正则化 随后引入了专门设计用来对这个初步形成的代价体实施正则化的重叠沙漏模块。这种架构有助于更好地捕捉全局上下文信息,并改善最终预测结果的质量。它通过对输入数据执行一系列下采样与上采样的操作来达到平滑效果的同时保留重要特性[^2]。 ```python def build_cost_volume(left_features, right_features, max_disparity): batch_size, channels, height, width = left_features.size() cost_volume = torch.zeros((batch_size, channels*2, max_disparity//4, height//4, width//4)).cuda() for disparity in range(max_disparity//4): if disparity > 0: cost_volume[:, :, disparity, :, disparity:] = \ torch.cat([left_features[:, :, :, disparity:], right_features[:, :, :, :-disparity]], dim=1) else: cost_volume[:, :, disparity, :, :] = \ torch.cat([left_features, right_features], dim=1) return cost_volume ``` 这段代码展示了如何根据最大视差参数`max_disparity`从一对特征图(`left_features`, `right_features`)中建立代价体的过程。这里假设输入已经过预处理并且尺寸相同;实际应用时还需要注意边界条件等问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值