多视图几何三维重建实战系列- Cascade-MVSNet( 二 )


下一阶段开始时 , 先进行上采样 , 然后以上一层的深度估计范围作为参考 , 确定改成的深度估计范围和深度估计间隔 。 最后输出一个较高分辨率的深度图 。
如图7 , 根据稀疏重建给予的先验深度范围 , 第一阶段的深度估计范围将包含整个场景 。 所以 , 会和低分辨率影像建立一个体量较小的代价体(图5) 。 在之后的阶段中 , 深度估计范围会进一步缩小 。
多视图几何三维重建实战系列- Cascade-MVSNet文章插图
多视图几何三维重建实战系列- Cascade-MVSNet文章插图
图7 不同阶段的深度估计范围变化
除了深度估计范围的缩小 , 深度估计间隔也会进一步缩小 , 越小的深度估计间隔代表着越精细的深度估计精度 。
多视图几何三维重建实战系列- Cascade-MVSNet文章插图
在第k个阶段 , 假设当前的深度估计范围Rk和深度平面估计间隔Ik , 所以对应的深度估计平面数可以
多视图几何三维重建实战系列- Cascade-MVSNet文章插图
计算 。 当该阶段的图像分辨率固定后 , 一个更大的深度估计范围会产生更为精确的深度估计结果 , 但同时也会提升GPU的消耗 。 同时根据特征金字塔网络的特点 , 在级联式代价体构造过程中 , 每个阶段将按照上一阶段的两倍数量 , 即在每个阶段的图像的分辨率分别是之前的两倍 。
4、Loss的设置
Cascade-MVSNet仍旧是监督学习下的网络结构 , 同时 , 因为仍旧沿用MVSNet的网络架构 , 所以Loss的构造和MVSNet的loss构造形式类似 , 不同的是 , Cascade-MVSNet使用的是级联式的学习策略 , 所以Loss构造定义为:
多视图几何三维重建实战系列- Cascade-MVSNet文章插图
其中 , Lk指的是第k个阶段的总Loss , λk则表示当前阶段的权重 。 一般来说 , 分辨率越高 , 设置的权重越大 。
【多视图几何三维重建实战系列- Cascade-MVSNet】5、Cascade-MVSNet实战操作
首先 , 再次感谢Yaoyao(香港科技大学)给出已经预处理好的数据 , 感谢Alibaba集团提供的开源代码 。 因为Cascade-MVSNet的深度估计框架沿用MVSNet , 所以其输入和MVSNet要求一致 , 这里不再重复说明 , 详细数据处理内容 , 请大家回顾实战系列-MVSNet 。
1)环境配置
参考Alibaba的github主页中的installation , 即可完成环境配置 。
()
2)深度估计
环境配置结束后 , 需要打开CasMVSNet文件夹(图8) , 整个cascade-stereo包含多视图立体和双目立体 , 本篇文章只关注多视图立体方面的应用 。 所以进入CasMVNSet的文件夹 。
多视图几何三维重建实战系列- Cascade-MVSNet文章插图
图8 CasMVSNet目录
具体的配置这里不再重复 , Github上的README.md介绍已经十分详尽 。 运行之后可以得到的结果如下:
·Scan10 数据库
多视图几何三维重建实战系列- Cascade-MVSNet文章插图

原图 b) 深度图 c) 深度置信度图
图9 深度图估计结果
多视图几何三维重建实战系列- Cascade-MVSNet文章插图
图10 稠密重建结果
3)具体分析
代码分析:
Github上提供了一个shell的脚本 , 在终端直接运行即可 , 以下对代码进行简要介绍:
#!/usr/bin/env bashTESTPATH="data/DTU/dtu_test_all"TESTLIST="lists/dtu/test.txt"CKPT_FILE=$1python test.py --dataset=general_eval --batch_size=1 --testpath=$TESTPATH --testlist=$TESTLIST --loadckpt $CKPT_FILE ${@:2}上述bash中 , 需要首先设置Test图片的位置 , 这里设置为下载好的数据集即可 , TestList表示设置需要对那几个数据进行深度处理和重建 , 例如 , 我想对10,15,24号数据集重建 , 那Testlist中只要包含scan10, scan15, scan24即可 。
CKPT_FILE是训练好的网络的地址 , 通过官网可以下载预训练的模型 。
在test.py中 , 主要有几个flag需要注意 , 代码如下:
parser.add_argument('--max_h', type=int, default=864, help='testing max h')parser.add_argument('--max_w', type=int, default=1152, help='testing max w')parser.add_argument('--filter_method', type=str, default='normal', choices=["gipuma", "normal"], help="filter method")parser.add_argument('--fusibile_exe_path', type=str, default='../fusibile/fusibile')parser.add_argument('--prob_threshold', type=float, default='0.9')parser.add_argument('--num_consistent', type=float, default='4')注意 , 可以改变测试分辨率的大小 , 但需要为32的倍数 , 且最好保证为16:9的长宽比例 。 其次 , 使用gipuma进行稠密重建时 , 需要预下载fusion这个库 , 这个在可以下载 , 然后在终端输入: