Gbi-MVSNet

基本信息

项目 内容
论文标题 Generalized Binary Search Network for Highly-Efficient Multi-View Stereo
作者 作者:Zhenxing Mi, Chang Di, Dan XuXiaoyang Guo、Kai Yang、Wukui Yang、Xiaogang Wang、Hongsheng Li
作者单位 第一单位:The Hong Kong University of Science and Technology (香港科技大学)The Chinese University of Hong Kong(香港中文大学)、SenseTime Research(商汤科技研究院)
时间 2022 年
发表会议/期刊 IEEE Conference on Computer Vision and Pattern Recognition (CVPR)

方法概览

特点 文章性质
输入 校正图像对
输出 视差图
所属领域 双目stereo

摘要

本文提出了一种高效的MVS方法,将MVS问题建模为二分搜索问题,显著减少了内存消耗。传统方法需要密集采样深度假设并构建高内存消耗的3D代价体,而本文提出的GBi-Net通过二分搜索策略,每次只采样极少量的深度假设,并结合三种机制(误差容忍桶、梯度掩码、高效梯度更新)来避免错误累积,实现了在保持高精度的同时大幅降低内存使用。


引言动机

image-20251126235735507

现有学习型 MVS 方法的核心问题是 3D 代价体内存消耗巨大:

  1. 传统方法(如 MVSNet)需密集采样深度假设构建 5D 代价体,即使粗到精策略(如 CasMVSNet),每个阶段仍需密集采样,内存开销未得到根本优化;

  2. 密集搜索导致预测空间过大,增加模型训练难度,易出现优化不稳定。

    作者指出 MVS 本质是 “已知相机参数下的 1D 深度范围搜索问题”,而二分搜索可通过每次排除一半搜索空间快速收敛到精细粒度,仅需少量深度假设即可构建代价体。但纯二分搜索存在分类误差积累、真值超出 bin 范围、训练内存积累等问题,因此提出广义二分搜索网络,在保留效率优势的同时解决上述缺陷。


3. 创新点

3.1 二分搜索建模(Bi-Net)

  • 突破传统密集采样思路,将 MVS 转化为离散二分搜索任务:每个阶段将当前深度范围划分为 2 个等宽 bin,采样 bin 中心点作为深度假设,构建仅含 2 个深度维度的代价体,将内存消耗压至极低水平。
  • 每次搜索通过分类判断真值所在 bin,下一阶段仅在该 bin 内继续二分,bin 宽度随阶段数指数减小(第 k 阶段 bin 宽度为R/(2k)),快速收敛到精细深度。

3.2 广义二分搜索三大机制(GBi-Net)

  • 误差容忍桶(Error Tolerance Bins, ETB):在每个阶段的二分桶两侧各添加一个误差容忍桶,增强网络的容错能力。在 2 个主 bin 的左右两侧各添加 1 个小 bin,总深度假设数 D=4,允许网络修正前一阶段的分类误差,减少误差积累,同时不显著增加内存(内存仍由 2D 编码器主导)。
  • 梯度掩码优化(Gradient-Masked Optimization):仅对当前桶范围内有效的像素计算梯度,避免无效像素干扰训练。生成掩码图标记 “真值在当前 bin 范围内” 的有效像素,仅使用有效像素的损失梯度更新网络,避免无效像素的噪声梯度干扰,类似自步学习,逐步提升模型对难样本的预测能力。
  • 高效梯度更新(Efficient Gradient Updating):每阶段立即反向传播梯度,不跨阶段累积,大幅减少训练内存。每个搜索阶段计算损失后立即反向传播,不积累跨阶段梯度,最大内存开销不超过单个阶段,大幅降低训练内存消耗(较梯度积累策略减少 57.1%)。

3.3 强表达特征提取

  • 结合特征金字塔网络(FPN)与可变形卷积(DCN),提取 4 个尺度的特征图,可变形卷积增强对场景上下文和几何结构的捕捉能力,为精准匹配提供高质量特征支持。

网络架构

image-20251126235810746

  1. GBi-Net 采用多阶段迭代架构,整体分为两部分,共 K 个搜索阶段(每 2 个阶段共享参数):

    1. 2D 图像编码:2DCNN提取多尺度图像特征,为代价体构建提供输入;

    2. 广义二分搜索网络:每个阶段执行 “代价体构建→代价体正则→深度预测→假设更新” 流程,逐步缩小深度范围,提升深度精度。

      输入为 1 张参考图像 + N 张源图像及相机参数,输出最终深度图,经过滤融合生成 3D 稠密点云。


特征提取

  • 使用FPN提取4个不同尺度的特征金字塔。
  • 每个尺度输出层使用一个可变形卷积层(DCN)以更好地捕捉场景上下文。

代价体构建

深度假设生成:每个阶段生成 D=4 个深度假设(2 个主 bin 中心点 + 2 个误差容忍 bin 中心点),深度范围由上一阶段的预测 bin 决定;

  1. 对每个像素p,根据深度假设d_j将其投影到源图像中得到p’:

    p=Ki(RF0FtK01pdj+tF0Ft)\mathbf{p}' = \mathbf{K}_i \cdot (\mathbf{R}_{\mathbf{F}_0 \rightarrow \mathbf{F}_t} \cdot \mathbf{K}_0^{-1} \cdot \mathbf{p} \cdot d_j + \mathbf{t}_{\mathbf{F}_0 \rightarrow \mathbf{F}_t})

  2. 将特征图通道分为N_g组,计算分组相关性:

    Vi(j,p,g)=NgNcF0g(p),Fig(p)\mathbf{V}_i(j, \mathbf{p}, g) = \frac{N_g}{N_c} \langle \mathbf{F}_0^g(\mathbf{p}), \mathbf{F}_i^g(\mathbf{p}') \rangle

    其中Nc为总通道数,F0g(p)F_0^g(p)为参考图第 g 组特征,j为深度假设索引;

  3. 融合多视角代价体:通过 3D CNN 预测像素级视图权重Wi§,加权融合所有两视图代价体,得到全局代价体:

    V(j,p,g)=i=1N1Wi(p)Vi(j,p,g)i=1N1Wi(p)\mathbf{V}(j, \mathbf{p}, g) = \frac{\sum_{i=1}^{N-1} \mathbf{W}_i(\mathbf{p}) \cdot \mathbf{V}_i(j, \mathbf{p}, g)}{\sum_{i=1}^{N-1} \mathbf{W}_i(\mathbf{p})}


代价体正则化

  • 使用3D UNet对融合后的代价体进行正则化。输出通道数降为1,得到尺寸为D×H×W的体积。
  • 沿深度维度D应用Softmax得到概率体P。其中P(j,p)表示像素 p 的真值属于第 j 个 bin 的概率。

深度图生成

  1. 阶段内深度预测:对概率体执行 argmax 操作,选择概率最大的 bin 作为真值所在 bin,记录该 bin 的范围;
  2. 深度假设更新:下一阶段将该 bin 划分为新的 2 个主 bin+2 个误差容忍 bin,重新生成 4 个深度假设,重复代价体构建与正则流程;
  3. 最终深度生成:经过 K 个阶段迭代后,取最后阶段 bin 的中心点作为像素最终深度,或通过概率加权得到更精细深度;
  4. 后处理:过滤低置信度像素,采用动态一致性检查融合所有视图的深度图,生成 3D 稠密点云。

损失函数

使用交叉熵损失,仅对有效像素(即真实深度在当前桶范围内的像素)计算损失:

Loss=qΩqj=1DG(j,q)logP(j,q)Loss = \sum_{\mathbf{q} \in \Omega_{\mathbf{q}}} \sum_{j=1}^{D} -\mathbf{G}(j, \mathbf{q}) \log \mathbf{P}(j, \mathbf{q})

G(j,q)为真值的 one-hot 编码(真值在第 j 个 bin 时G(j,q)=1),P(j,q)为预测概率。


测试数据集

  • DTU:室内场景,用于定量评估。
  • Tanks and Temples:大规模室外场景,包含Intermediate和Advanced子集。
  • BlendedMVS:大规模室内外场景,仅用于训练。

消融实验

消融实验基于 DTU 数据集,验证各核心组件的有效性:

  1. 不同搜索策略:对比密集线性搜索(回归)、密集粗到精搜索(回归)、Bi-Net(二分搜索)、GBi-Net(广义二分搜索)的重建精度与内存消耗;
  2. 搜索阶段数:测试 6、7、8、9 个阶段对深度图和点云重建质量的影响,验证模型收敛特性;
  3. 误差容忍 bin(ETB)数量:对比 0、1、2 个 ETB(对应深度假设数 2、4、6)的性能与内存消耗,确定最优 ETB 数量;
  4. 梯度更新策略:对比 “梯度积累(跨阶段)” 与 “高效梯度更新(每阶段立即反向传播)” 的训练内存与重建精度。

其他创新点

  • 随机裁剪数据增强:在训练过程中随机裁剪图像,增强模型对不同尺度的适应能力。
  • 在线深度假设更新:每个阶段动态更新深度范围,实现自适应的深度细化。

GBi-Net 和 CasMVSNet/CVP-MVSNet 的核心区别(不是 “换采样” 这么简单)

传统粗到精方法(CasMVSNet/CVP-MVSNet)的逻辑是:

每个阶段(粗→细)都要密集采样一堆深度假设(比如粗阶段 32 个、细阶段 16 个),构建 “空间 × 深度” 的稠密代价体,然后通过回归(比如 soft-argmin)直接预测深度值。本质是 “每个阶段都在密集试错,用多假设覆盖可能的深度范围”,内存消耗随假设数增加而暴涨。

而 GBi-Net 的逻辑是:

每个阶段只采样 4 个深度假设(固定少),不直接预测深度值,而是先判断 “真值深度在哪个小范围内(bin)”,下一阶段只在这个小范围里继续细分 —— 像剥洋葱一样,从大范围逐步缩小到精确值。本质是 “用分类判断范围,用迭代缩小精度”,内存消耗极低(因为假设数固定 4 个)。

二、广义二分搜索的核心原理:解决 “纯二分搜索的坑”,实现高效 + 高精度

纯二分搜索(Bi-Net)的思路很简单:比如初始深度范围是 400-900mm,第 1 阶段分成 2 个 bin(400-650mm、650-900mm),采样每个 bin 的中心点(525mm、775mm)作为深度假设,构建代价体后分类判断 “真值在哪个 bin”;第 2 阶段把选中的 bin 再分成 2 个,重复操作。

但纯二分搜索有 2 个致命问题:

  1. 分类错了就全错:如果第 1 阶段误判真值在左 bin(实际在右 bin),后续阶段只会在左 bin 里细分,永远找不到真值;
  2. 真值可能 “出圈”:比如粗阶段预测的 bin 范围太小,真值不在任何一个 bin 里,无法计算有效损失。

GBi-Net 的 “广义” 就是通过 3 个机制解决这些问题,具体原理拆解:

1. 机制 1:误差容忍 bin(ETB)—— 给 “犯错” 留余地(核心改进)

  • 解决的问题:纯二分搜索的 “误判后无法修正”。
  • 具体做法:每个阶段不只分 2 个 “主 bin”,而是在主 bin 的左右两侧各加 1 个小的 “误差容忍 bin”(比如主 bin 是 400-650mm、650-900mm,左侧加 375-400mm、右侧加 900-925mm),总共 4 个 bin(对应 4 个深度假设,采样每个 bin 的中心点)。
  • 原理:如果前一阶段误判了 bin(比如本该选右 bin 却选了左 bin),右侧的误差容忍 bin 可能刚好覆盖真值;反之亦然。相当于给网络一个 “修正错误” 的机会,避免误差积累。
  • 例子:假设真值是 910mm(超出右主 bin900mm),右侧的误差容忍 bin(900-925mm)刚好覆盖,网络能选到这个 bin,下一阶段再细分这个容忍 bin,不会漏掉真值。

2. 机制 2:梯度掩码 —— 只练 “有用的像素”(避免噪声干扰)

  • 解决的问题:部分像素的真值不在当前 4 个 bin 里(比如初始阶段范围没覆盖到),计算这些像素的损失会产生噪声梯度,干扰训练。
  • 具体做法:每个阶段生成一张 “掩码图”,标记 “真值在当前 4 个 bin 范围内” 的像素为 “有效像素”,只计算这些像素的损失并反向传播;无效像素的梯度直接丢弃。
  • 原理:类似 “先练简单样本,再练难样本”—— 初期阶段范围大,大部分像素有效;后期阶段范围小,难样本逐渐被覆盖,模型稳步学习,不会被无效像素带偏。

3. 机制 3:高效梯度更新 —— 训练内存 “砍半”(工程优化)

  • 解决的问题:传统多阶段方法(如 CasMVSNet)会积累所有阶段的中间特征和梯度,训练内存随阶段数暴涨。
  • 具体做法:每个阶段计算完损失后,立即反向传播更新参数,不保留前一阶段的梯度和中间特征;下一阶段重新读取特征,从头计算。
  • 原理:训练时最大内存开销只来自 “单个阶段”,而不是所有阶段的总和,内存消耗直接减少 50% 以上(论文里从 12GB 降到 5GB)。

三、广义搜索的 “标识” 方式:怎么判断真值在哪个 bin?怎么训练?

“标识” 的核心是把 “深度回归” 变成 “bin 分类”,具体分 2 步:

1. 阶段内 “标识 bin”:用概率体选 bin

  • 每个阶段构建 4 个深度假设的代价体后,通过 3D UNet 正则化,再用 Softmax 生成 “概率体”(维度:H×W×4,每个通道对应 1 个 bin 的概率);
  • 对每个像素,取概率最大的通道索引(argmax 操作),这个索引就对应 “网络判断的真值所在 bin”(比如索引 3 对应第 4 个 bin);
  • 例子:概率体中像素 p 的 4 个概率是 [0.1, 0.2, 0.3, 0.4],argmax 取 3,说明网络认为真值在第 4 个 bin 里。

2. 训练时 “标识真值 bin”:用 one-hot 标签算损失

  • 已知像素的真值深度dgt,先判断dgt落在当前 4 个 bin 中的哪一个(比如落在第 2 个 bin);

  • 把这个 bin 的位置用 “one-hot 编码” 做成标签(比如 [0,1,0,0]);

  • 用交叉熵损失计算 “预测概率体” 和 “one-hot 标签” 的差异,只训练有效像素(掩码图标记的像素),公式如下:

    Loss=∑q∈Ωq∑j=14−G(j,q)logP(j,q)

    其中

    G(j,q)

    是 one-hot 标签(j 是 bin 索引,q 是有效像素),

    P(j,q)

    是预测概率。