FPN特征提取代码逐行解析

本文基于D-mvsnet的特征提取部分进行逐行解析

这段代码用于深度学习模型中进行前向传播计算。它包含对输入图像数据的处理步骤,尤其是针对多视角(nview)图像进行特征提取的过程

imgs: 形状为 (b, nview, c, h, w),其中:

b 是批量大小(batch size)。nview 是图像的视角数量。c 是每个图像的通道数(如RGB图像时为3)。h 和 w 分别是图像的高度和宽度。

proj_matrices: 投影矩阵,可能用于对图像进行投影或几何变换,通常出现在多视角或三维场景的处理流程中。

depth_values: 深度值,一般表示从某个视角看过去,物体在场景中的深度。形状通常为 (b, nview, d),其中 d 是深度的离散化点数。

depth_interval: 计算深度值的间隔。该语句计算的是每个深度值之间的间隔。depth_values[0, -1] - depth_values[0, 0] 表示深度值的最大值与最小值之间的差。depth_values.size(1) 是深度值的数量(即深度值的维度 d)。

这是一个循环,用来遍历每个视角(nview_idx)。对于每个视角,提取该视角的图像并进行特征提取。imgs[:, nview_idx]:从 imgs 中取出当前视角的所有图像,得到形状为 (b, c, h, w) 的张量,其中 b 是批量大小,c 是通道数,h 和 w 是图像的高度和宽度。self.feature(img):使用模型中的 feature 函数(通常是卷积层、特征提取层等)对每个视角的图像进行特征提取,并将提取到的特征添加到 features 列表中。

ori_shape: 获取每个图像的原始高度和宽度(h 和 w)。imgs[:, 0] 表示从批次中取出每个图像的第一个视角(nview=0)。.shape[2:] 获取图像的高度和宽度部分。shape[2:] 是因为 imgs 的形状为 (b, nview, c, h, w)[2:] 会跳过批量大小和通道数,返回图像的高度和宽度。

下一步我将探索self.feature(img)这一步 

当我们输入img时,首先会进行三层卷积,而这三层卷积的定义在上文中给出了。

我们先从conv0开始解析,nn.Sequential 是一个容器,允许按顺序组合多个层(模块)。在这里,conv0 由两个卷积层(Conv2d)构成,依次处理输入数据。

第一个卷积层,参数的含义如下:

  • 3: 输入通道数。这里是 3,表示输入图像有 3 个通道,通常对应于 RGB 彩色图像。

  • base_channels: 输出通道数,通常设置为一个变量(base_channels)。这个值控制卷积后输出特征图的通道数。在此,本文的 base_channels =8 ,则输出的特征图有 8个通道。

  • 3: 卷积核的大小。这里是 3,表示使用 3x3 的卷积核。

  • 1: 步长(stride)。步长设置为 1,表示卷积核在输入图像上滑动时每次移动 1 个像素。

  • padding=1: 填充(padding)。为了保持输入和输出的空间尺寸相同,使用了填充 1 像素的边界。这使得输入图像的尺寸在经过卷积后不会发生变化。

剩余卷积层与第一个卷积层类似,在此不做多余解释。不过值得注意的是conv1和conv2的第一次卷积会让尺寸减半。

我们对intra_feat的进行self.out1等操作

 经历这一系列变换后,

我们得到了stage1(b,32,h/4,w/4),stage1_c(b,32,h/4,w/4),

stage2(b,16,h/2,w/2),stage2_c(b,16,h/2,w/2),

stage3(b,8,h,w),stage3_c(b,8,h,w),返回outputs。

第211行遍历每个阶段(从stage1stage3),从 features 列表中的每个字典中获取当前阶段的特征数据,并将这些数据存储在 features_stage 列表中。

第212行根据当前阶段的编号,从 proj_matrices 字典中提取出对应阶段的矩阵(或其他数据),并将其存储在 proj_matrices_stage 变量中。

第213行为缩放因子stage1: 1/4, stage2: 1/2, stage3: 1

第216行为根据指定的缩放比例 stage_scale,计算出当前阶段的图像尺寸。则stage1(h/4,w/4)

 在第一个阶段时,将 depth_values 赋值给 last_depth

在后续阶段,last_depth 会被“断开”与计算图的联系,使其不再参与梯度计算(detach()

这段代码的作用是调用 get_depth_range_samples 函数,传递一系列参数(包括深度数据、深度数量、深度间隔、图像尺寸等),并获得当前阶段的深度范围样本和深度区间。 

 在第二个阶段及之后的阶段,使用双线性插值 (bilinear) 调整 depth_range_samples 的尺寸,使其符合当前阶段的 stage_shape,并根据 Align_Corners_Range 决定是否对角点进行对齐。

CostAgg.forward

这是forward函数的定义,它接收四个参数:

  • features: 包含参考视图特征和多个源视图特征的列表。
  • proj_matrices: 参考视图和源视图的投影矩阵列表。
  • depth_values: 深度值,用于后续计算深度匹配。
  • stage_idx: 当前阶段的索引

ref_feature:取出参考视图的特征,features[0]src_features:取出其余的源视图特征,features[1:]

proj_matrices:将投影矩阵沿第1维(视图维度)解绑定,得到一个列表。

ref_proj:取出参考视图的投影矩阵。src_projs:取出源视图的投影矩阵。

num_views:视图的数量(包括参考视图和所有源视图)。num_depth:深度值的数量,表示深度图的分辨率

ref_volume:将参考视图特征添加一个新的维度,使其形状变为 (b, c, 1, h, w),为后续的特征融合准备。

遍历源视图的特征和投影矩阵。src_proj_new:克隆源视图的投影矩阵。将源视图投影矩阵的前3行4列更新为源视图投影矩阵的组合矩阵,通过矩阵乘法计算。ref_proj_new同理。

调用 homo_warping 函数,通过源视图特征、源视图投影矩阵、参考视图投影矩阵和深度值进行图像配准,生成变换后的源视图特征体积 warped_volume

计算源视图和参考视图之间的相似度:warped_volume:重塑为 (b, c//2, 2, d, h, w)c//2 是通道数的一半,2表示两个通道。ref_volume:重塑为 (b, c//2, 2, 1, h, w),和 warped_volume 对齐。通过点积计算相似度,并取平均值。

如果是在训练模式下,将计算得到的相似度累加到 similarity_sum 中。

删除 warped_volume,释放内存。

最后返回所有源视图的匹配成本累加结果 similarity_sum,该值用于后续的深度估计或立体匹配。

未完待续 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值