论文阅读_GbiMVSNet
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通过二分搜索策略,每次只采样极少量的深度假设,并结合三种机制(误差容忍桶、梯度掩码、高效梯度更新)来避免错误累积,实现了在保持高精度的同时大幅降低内存使用。
引言动机
现有学习型 MVS 方法的核心问题是 3D 代价体内存消耗巨大:
-
传统方法(如 MVSNet)需密集采样深度假设构建 5D 代价体,即使粗到精策略(如 CasMVSNet),每个阶段仍需密集采样,内存开销未得到根本优化;
-
密集搜索导致预测空间过大,增加模型训练难度,易出现优化不稳定。
作者指出 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 个尺度的特征图,可变形卷积增强对场景上下文和几何结构的捕捉能力,为精准匹配提供高质量特征支持。
网络架构
-
GBi-Net 采用多阶段迭代架构,整体分为两部分,共 K 个搜索阶段(每 2 个阶段共享参数):
-
2D 图像编码:2DCNN提取多尺度图像特征,为代价体构建提供输入;
-
广义二分搜索网络:每个阶段执行 “代价体构建→代价体正则→深度预测→假设更新” 流程,逐步缩小深度范围,提升深度精度。
输入为 1 张参考图像 + N 张源图像及相机参数,输出最终深度图,经过滤融合生成 3D 稠密点云。
-
特征提取
- 使用FPN提取4个不同尺度的特征金字塔。
- 每个尺度输出层使用一个可变形卷积层(DCN)以更好地捕捉场景上下文。
代价体构建
深度假设生成:每个阶段生成 D=4 个深度假设(2 个主 bin 中心点 + 2 个误差容忍 bin 中心点),深度范围由上一阶段的预测 bin 决定;
-
对每个像素p,根据深度假设d_j将其投影到源图像中得到p’:
-
将特征图通道分为N_g组,计算分组相关性:
其中Nc为总通道数,为参考图第 g 组特征,j为深度假设索引;
-
融合多视角代价体:通过 3D CNN 预测像素级视图权重Wi§,加权融合所有两视图代价体,得到全局代价体:
代价体正则化
- 使用3D UNet对融合后的代价体进行正则化。输出通道数降为1,得到尺寸为D×H×W的体积。
- 沿深度维度D应用Softmax得到概率体P。其中P(j,p)表示像素 p 的真值属于第 j 个 bin 的概率。
深度图生成
- 阶段内深度预测:对概率体执行 argmax 操作,选择概率最大的 bin 作为真值所在 bin,记录该 bin 的范围;
- 深度假设更新:下一阶段将该 bin 划分为新的 2 个主 bin+2 个误差容忍 bin,重新生成 4 个深度假设,重复代价体构建与正则流程;
- 最终深度生成:经过 K 个阶段迭代后,取最后阶段 bin 的中心点作为像素最终深度,或通过概率加权得到更精细深度;
- 后处理:过滤低置信度像素,采用动态一致性检查融合所有视图的深度图,生成 3D 稠密点云。
损失函数
使用交叉熵损失,仅对有效像素(即真实深度在当前桶范围内的像素)计算损失:
G(j,q)为真值的 one-hot 编码(真值在第 j 个 bin 时G(j,q)=1),P(j,q)为预测概率。
测试数据集
- DTU:室内场景,用于定量评估。
- Tanks and Temples:大规模室外场景,包含Intermediate和Advanced子集。
- BlendedMVS:大规模室内外场景,仅用于训练。
消融实验
消融实验基于 DTU 数据集,验证各核心组件的有效性:
- 不同搜索策略:对比密集线性搜索(回归)、密集粗到精搜索(回归)、Bi-Net(二分搜索)、GBi-Net(广义二分搜索)的重建精度与内存消耗;
- 搜索阶段数:测试 6、7、8、9 个阶段对深度图和点云重建质量的影响,验证模型收敛特性;
- 误差容忍 bin(ETB)数量:对比 0、1、2 个 ETB(对应深度假设数 2、4、6)的性能与内存消耗,确定最优 ETB 数量;
- 梯度更新策略:对比 “梯度积累(跨阶段)” 与 “高效梯度更新(每阶段立即反向传播)” 的训练内存与重建精度。
其他创新点
- 随机裁剪数据增强:在训练过程中随机裁剪图像,增强模型对不同尺度的适应能力。
- 在线深度假设更新:每个阶段动态更新深度范围,实现自适应的深度细化。
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 阶段误判真值在左 bin(实际在右 bin),后续阶段只会在左 bin 里细分,永远找不到真值;
- 真值可能 “出圈”:比如粗阶段预测的 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)
是预测概率。




