共计 2300 个字符,预计需要花费 6 分钟才能阅读完成。
背景:传统 MVS 方法的局限性
多视图立体视觉(MVS)是三维重建中的核心技术,传统方法如 PMVS、COLMAP 等存在明显瓶颈:

- 内存消耗大 :全局匹配需要存储所有视图的代价体,显存占用随分辨率指数增长。例如 1024×768 图像在 256 层深度假设下,单代价体可达 3GB
- 深度估计不准 :固定深度假设区间导致近处物体采样不足,远处冗余计算。实测在 DTU 数据集上,传统方法在 0 -50cm 近景区域的深度误差达 6.2mm
- 视图选择依赖 :多数方法需要人工设定参考视图数量,MVSNet 的实验表明视图每增加 1 个,推理时间增加 23%
CASMVSnet 核心技术解析
级联代价体设计
数学原理:
$$
C_k(d) = \frac{1}{N}\sum_{i=1}^N | f_{ref} – f_i(d) |1 \quad d\in[D]
$$}^{min}, D_{k}^{max
实现特点:
- 三阶段级联 :
- 阶段 1:64×64 分辨率,深度假设 32 层(覆盖全场景)
- 阶段 2:128×128 分辨率,深度假设 16 层(聚焦前阶段高置信区域)
- 阶段 3:256×256 分辨率,深度假设 8 层(局部优化)
- 动态范围调整 :每个像素的深度范围根据上一阶段结果自适应收缩,相比 MVSNet 内存降低 78%
自适应视图聚合
关键实现步骤:
- 可学习权重矩阵 :通过小型 CNN 生成每个视图的置信度权重 $w_i$,网络结构如下:
class ViewWeightNet(nn.Module):
def __init__(self, feat_ch=32):
super().__init__()
self.conv = nn.Sequential(nn.Conv2d(feat_ch, 16, 3, padding=1),
nn.ReLU(),
nn.Conv2d(16, 1, 1))
def forward(self, x):
return torch.sigmoid(self.conv(x)) # 输出 0 - 1 的权重值
- 遮挡处理 :当 $w_i<0.2$ 时判定为遮挡视图,自动排除聚合计算
性能对比实验
在 DTU 数据集上的实测数据(Titan RTX 显卡):
| 指标 | MVSNet | RMVS | CASMVSnet |
|---|---|---|---|
| 内存占用 (GB) | 9.8 | 5.2 | 2.1 |
| 误差 (mm) | 0.45 | 0.38 | 0.33 |
| 耗时 (ms) | 620 | 580 | 430 |
关键代码实现
代价体构建核心代码(PyTorch):
def build_cost_volume(ref_feat, src_feats, depth_hypos):
"""
ref_feat: [B,C,H,W] 参考视图特征
src_feats: list[[B,C,H,W]] 源视图特征列表
depth_hypos: [B,D] 当前阶段的深度假设值
"""
B, C, H, W = ref_feat.shape
D = depth_hypos.shape[1]
# 构建代价体 [B,D,H,W]
cost_volume = torch.zeros(B, D, H, W).to(ref_feat.device)
for src_feat in src_feats:
# 计算单应性变换(简化版)warped_feat = homography_warp(src_feat, depth_hypos) # [B,C,D,H,W]
# 计算差异度
diff = torch.abs(warped_feat - ref_feat.unsqueeze(2)) # [B,C,D,H,W]
cost = torch.mean(diff, dim=1) # [B,D,H,W]
# 视图聚合(带自适应权重)weight = view_weight_net(src_feat) # [B,1,H,W]
cost_volume += weight.unsqueeze(1) * cost
return cost_volume / len(src_feats)
关键参数说明:
feat_ch=32:特征通道数,平衡计算量和特征表达能力depth_hypos:每阶段深度假设数递减(32→16→8)homography_warp:基于相机参数的可微分单应变换
实践优化指南
DTU 数据集训练技巧
- 学习率调度 :
- 初始 lr=0.001,每 10epoch 衰减 0.9
- 阶段 2 / 3 开始时重置为初始值 50%
- 数据增强 :
- 随机裁剪 512×640 区域
- 亮度扰动(±0.2)
- 对极几何约束增强:强制 20% 样本包含至少 60°大视角
工业部署显存优化
- 梯度检查点 :
from torch.utils.checkpoint import checkpoint class CascadeStage(nn.Module): def forward(self, x): return checkpoint(self._forward, x) # 分段计算梯度 - 动态分辨率 :根据 GPU 显存自动调整输入尺寸(公式):
$$
S = \lfloor \sqrt{\frac{M_{avail}}{M_{base}}} \times S_{base} \rfloor
$$
其中 $M_{base}$ 是 512×512 基准显存占用
典型问题排查
深度图断裂问题 :
- 检查项:
- 相机标定误差 >0.5 像素时会出现断层
- 纹理缺乏区域需增加正则化权重
- 解决方案:
- 添加梯度一致性损失:$\mathcal{L}{grad} = |\nabla d – \nabla d|_1$
- 在损失函数中增加权重至 0.3
拓展思考
- 无人机航拍适配 :
- 针对高度变化调整深度范围分布
- 加入 GPS/IMU 先验约束深度假设
- 动态场景改进 :
- 时序一致性约束(光流 + 深度联合优化)
- 运动物体检测模块(Mask R-CNN)辅助视图选择
CASMVSnet 通过级联结构和自适应机制实现了精度与效率的平衡,其设计思路对点云重建、SLAM 等领域都有借鉴价值。读者可尝试在 BlendedMVS 等更大规模数据集上验证其泛化能力。
正文完
