博客专栏

EEPW首页 > 博客 > 多视图几何三维重建实战系列- Cascade-MVSNet

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

发布人:计算机视觉工坊 时间:2020-10-20 来源:工程师 发布文章

MVSNet在2018年提出后,在估计深度图的应用中取得了非常好的结果。应用CNN于立体匹配的技术也使得传统的匹配效率整体提高。但是因为使用3D卷积神经网络进行深度正则化处理,所以即便在比较低的分辨率(900*600)下,也需要比较高的GPU消耗。针对该问题,该团队在CVPR2019上提出利用循环神经网络对3D代价体进行切片处理,大幅度减少GPU消耗,使得该网络框架不仅可以估计更大范围的场景,且估计精度更高。

本篇文章仍将就MVSNet内存消耗大的问题,介绍CVPR2020的一篇文章:Cascade Cost Volume for High-Resolution Multi-View Stereo and Stereo Matching. 该文章沿用MVSNet深度估计的框架,具体创新在于改进Cost Volume的构造方式,使得利用深度学习估计深度时,在较低GPU消耗上估计高分辨率、大场景的深度。

1、背景介绍

基于深度学习的多视图立体,例如经典的MVSNet网络架构,通常会构造一个三维的代价体去回归场景的深度值,但MVSNet常受限于显存限制而无法对高分辨率的影像进行深度估计。

在MVSNet框架的基础上,多种方法对显存增长问题提出了改进方案,上一篇文章我们介绍了R-MVSNet,该方法利用循环神经网络GRU,对三维代价体进行切片,这样不仅保留了靠前的深度和纹理信息,也减少了GPU的消耗,深度估计精度和深度估计范围要优于MVSNet,不同方法的比较结果可通过图1体现。

1603162695315375.png

图1 效果比较图

不同于R-MVSNet,本篇文章(以下简称“Cascade-MVSNet”)则仍旧使用了MVSNet网络框架中的3D卷积神经网络对深度代价体进行正则化,但不同于其代价体的构造,Cascade-MVSNet利用链式代价体构造的策略,先估计较为粗糙的深度值,然后再进一步缩小深度估计范围,提高深度估计精度,实现了在较小的GPU消耗的条件下,得到较高分辨率和较高精度的深度图,经过稠密重建后,Cascade-MVSNet的结果也比之前所提到的方法要更为完整(图2)。

1603162718696099.png

图2 稠密重建结果比较

2、代价体构造回顾

沿用立体匹配的视差估计框架,通常深度学习方法都会构造一个沿深度方向的代价体,例如MVSNet借鉴平面扫描算法的原理,构造由沿不同深度而前视平行的平面组成一个相机椎体,然后每一个相机椎体经过采样,变成长宽一致的特征体,通过可微分化的单应性变换将不同视角下的特征扭曲到参考视角上,构成代价体。

一般来说,代价体的长宽则是由输入影像分辨率提供的,深度范围则是通过稀疏重建后的结果提供先验条件。这样的构造方式,使得代价体正则化时,三维代价体的内存消耗会以三次指数的速率增长(图3)。

1603162744651613.png

图3 代价体构造示意图

上一篇文章中R-MVSNet使用循环神经网络,对将代价体沿深度切成不同的深度图,利用GRU结构进行正则化处理,相比较MVSNet,能减少GPU的消耗。可是循环神经网络会涉及一个遗忘的过程,导致网络不能很好地保留像素周围的纹理信息,所以点云完整度不能得到很好地保留(图4)。

1603162763668368.png

图4 RNN代价体正则化过程

3、Cascade-MVSNet

为了解决信息保留和GPU消耗的两个问题,Cascade-MVSNet提出一种级联的代价体构造方法,并输出从粗到细的深度估计值。

首先来看其整个网络的架构(图5)。

1603162804768120.png

图5 Cascade网络框架示意图

可以看到,整个网络的结构还是沿袭了MVSNet框架(图6),还是以多视图的影像作为输入,然后经过可微分单应性变换形成不同视角下的特征体,在通过代价体构造,形成一个代价体,之后通过回归估计深度值。这里不再对MVSNet作更多的赘述,感兴趣的朋友可以回顾之前的文章:MVSNet。

17.png

图6 MVSNet深度估计框架

此篇文章不同的是:整个网络利用级联式代价体的构造策略。首先,原始输入影像,利用特征金字塔网络先对原始影像进行降采样,降低特征体的分辨率,使得可以拥有较为精确的深度估计范围。通过初始的MVSNet框架估计出低分辨率下的深度图后,进入下一阶段。

下一阶段开始时,先进行上采样,然后以上一层的深度估计范围作为参考,确定改成的深度估计范围和深度估计间隔。最后输出一个较高分辨率的深度图。

如图7,根据稀疏重建给予的先验深度范围,第一阶段的深度估计范围将包含整个场景。所以,会和低分辨率影像建立一个体量较小的代价体(图5)。在之后的阶段中,深度估计范围会进一步缩小。

16.jpg

1603162865334553.png

图7 不同阶段的深度估计范围变化

除了深度估计范围的缩小,深度估计间隔也会进一步缩小,越小的深度估计间隔代表着越精细的深度估计精度。

14.jpg

在第k个阶段,假设当前的深度估计范围Rk和深度平面估计间隔Ik,所以对应的深度估计平面数可以1603162916415711.jpg计算。当该阶段的图像分辨率固定后,一个更大的深度估计范围会产生更为精确的深度估计结果,但同时也会提升GPU的消耗。同时根据特征金字塔网络的特点,在级联式代价体构造过程中,每个阶段将按照上一阶段的两倍数量,即在每个阶段的图像的分辨率分别是之前的两倍。

4、Loss的设置

Cascade-MVSNet仍旧是监督学习下的网络结构,同时,因为仍旧沿用MVSNet的网络架构,所以Loss的构造和MVSNet的loss构造形式类似,不同的是,Cascade-MVSNet使用的是级联式的学习策略,所以Loss构造定义为:

13.jpg

其中,Lk指的是第k个阶段的总Loss,λk则表示当前阶段的权重。一般来说,分辨率越高,设置的权重越大。

5、Cascade-MVSNet实战操作

首先,再次感谢Yaoyao(香港科技大学)给出已经预处理好的数据,感谢Alibaba集团提供的开源代码。因为Cascade-MVSNet的深度估计框架沿用MVSNet,所以其输入和MVSNet要求一致,这里不再重复说明,详细数据处理内容,请大家回顾实战系列-MVSNet。

1)环境配置

参考Alibaba的github主页中的installation,即可完成环境配置。

(https://github.com/alibaba/cascade-stereo)

2)深度估计

环境配置结束后,需要打开CasMVSNet文件夹(图8),整个cascade-stereo包含多视图立体和双目立体,本篇文章只关注多视图立体方面的应用。所以进入CasMVNSet的文件夹。

1603162966592683.png

图8 CasMVSNet目录

具体的配置这里不再重复,Github上的README.md介绍已经十分详尽。运行之后可以得到的结果如下:

·Scan10 数据库

1603162999809631.png

1603163023185655.png

                 原图                             b) 深度图                       c) 深度置信度图

图9 深度图估计结果

1603163047215827.png

图10 稠密重建结果

3)具体分析

代码分析:

Github上提供了一个shell的脚本,在终端直接运行即可,以下对代码进行简要介绍:

#!/usr/bin/env bash

TESTPATH="data/DTU/dtu_test_all"

TESTLIST="lists/dtu/test.txt"

CKPT_FILE=$1

python 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这个库,这个在https://github.com/YoYo000/fusibile可以下载,然后在终端输入:

Mkdir build

Cd build

Cmake ..

Make

之后将 --fusibile_exe_path的地址设置为可执行文件所在的地方。第三个要注意的flag是—prob_threshold,这个表示gipuma算法中利用置信度过滤深度图的阈值,如图11)所示,如果当前像素的置信度较高(c-上部),则说明当前像素的深度估计比较准确,若置信度较低,则说明当前像素上,深度估计有多个峰值,不能确定哪一个是最优深度,也表示当前像素估计的深度不准。因此,利用该阈值对深度图进行过滤,在稠密重建的时候,置信度较低的像素就不进行深度融合。

1603163104827507.png

图11 置信度解释示意图[2]

结果分析:

通过输出多个中间结果,对Cascade结果进行分析,首先是跑分结果,通过表1可得,利用Cascade的代价图构造方式在精度和完整度上都比之前的方法更优,比传统方法提升了近15个点,比R-MVSNet方法提升了近10个点。

表1 跑分比较结果表

1603163136503734.png

其次,从深度图估计结果看(图12),深度图较为平滑、完整,且估计精度比较高,估计错误的大多数是背景或者白色无纹理地区。通过对当前深度图的点云映射(图13),当前网络在原图视角下可以保持较高的分辨率,当在meshlab中旋转视角,可以看到当前视角估计出来的稠密点云效果完整,主体部分基本正确,背景部分存在偏差是正常的体现,在整体融合的时候可以滤除掉。

1603163159516042.png

图12 scan15深度估计结果

1603163189138490.png

图13 单图恢复点云结果

更多结果:

1603163218749941.png

1603163237749509.png

1603163258598688.png

图14 深度估计结果

1603163278635675.png

图15 稠密重建结果

以上结果均由笔者亲自试验,效果能达到论文中描述的水平,且GPU消耗基本在7GB以内,可行性比较高。

6、总结

Cascade-MVSNet是一种利用级联式代价体构造,解决MVSNet在深度估计过程中的GPU消耗过大问题、点云完整度不高的深度学习方法。通过实验,该方法在现有的MVSNet框架下,能以较小的GPU消耗,得到较高精度的深度估计结果,同时也能保留较高的完整度。

MVS的深度学习实战系列到目前为止就先告一段落,本系列我们首先回顾了MVS的传统原理和传统方法,并介绍了COLMAP等软件的具体操作,之后,介绍了MVSNet、R-MVSNet和Cascade-MVSNet三个深度学习框架和三维重建的pipeline,希望大家通过本系列的分享,加深对MVS三维重建的理解。

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。



关键词:

相关推荐

技术专区

关闭