本文基于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行遍历每个阶段(从stage1
到stage3
),从 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
决定是否对角点进行对齐。

这是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
,该值用于后续的深度估计或立体匹配。
未完待续