多视图几何三维重建实战系列- Cascade-MVSNet
作者:浩南
点击上方“计算机视觉工坊”,选择“星标”
干货第一时间送达
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体现。
图1 效果比较图
不同于R-MVSNet,本篇文章(以下简称“Cascade-MVSNet”)则仍旧使用了MVSNet网络框架中的3D卷积神经网络对深度代价体进行正则化,但不同于其代价体的构造,Cascade-MVSNet利用链式代价体构造的策略,先估计较为粗糙的深度值,然后再进一步缩小深度估计范围,提高深度估计精度,实现了在较小的GPU消耗的条件下,得到较高分辨率和较高精度的深度图,经过稠密重建后,Cascade-MVSNet的结果也比之前所提到的方法要更为完整(图2)。
图2 稠密重建结果比较
2、代价体构造回顾沿用立体匹配的视差估计框架,通常深度学习方法都会构造一个沿深度方向的代价体,例如MVSNet借鉴平面扫描算法的原理,构造由沿不同深度而前视平行的平面组成一个相机椎体,然后每一个相机椎体经过采样,变成长宽一致的特征体,通过可微分化的单应性变换将不同视角下的特征扭曲到参考视角上,构成代价体。一般来说,代价体的长宽则是由输入影像分辨率提供的,深度范围则是通过稀疏重建后的结果提供先验条件。这样的构造方式,使得代价体正则化时,三维代价体的内存消耗会以三次指数的速率增长(图3)。
图3 代价体构造示意图
上一篇文章中R-MVSNet使用循环神经网络,对将代价体沿深度切成不同的深度图,利用GRU结构进行正则化处理,相比较MVSNet,能减少GPU的消耗。可是循环神经网络会涉及一个遗忘的过程,导致网络不能很好地保留像素周围的纹理信息,所以点云完整度不能得到很好地保留(图4)。
图4 RNN代价体正则化过程
3、Cascade-MVSNet为了解决信息保留和GPU消耗的两个问题,Cascade-MVSNet提出一种级联的代价体构造方法,并输出从粗到细的深度估计值。首先来看其整个网络的架构(图5)。
图5 Cascade网络框架示意图
可以看到,整个网络的结构还是沿袭了MVSNet框架(图6),还是以多视图的影像作为输入,然后经过可微分单应性变换形成不同视角下的特征体,在通过代价体构造,形成一个代价体,之后通过回归估计深度值。这里不再对MVSNet作更多的赘述,感兴趣的朋友可以回顾之前的文章:MVSNet。
图6 MVSNet深度估计框架
此篇文章不同的是:整个网络利用级联式代价体的构造策略。首先,原始输入影像,利用特征金字塔网络先对原始影像进行降采样,降低特征体的分辨率,使得可以拥有较为精确的深度估计范围。通过初始的MVSNet框架估计出低分辨率下的深度图后,进入下一阶段。下一阶段开始时,先进行上采样,然后以上一层的深度估计范围作为参考,确定改成的深度估计范围和深度估计间隔。最后输出一个较高分辨率的深度图。如图7,根据稀疏重建给予的先验深度范围,第一阶段的深度估计范围将包含整个场景。所以,会和低分辨率影像建立一个体量较小的代价体(图5)。在之后的阶段中,深度估计范围会进一步缩小。
图7 不同阶段的深度估计范围变化
除了深度估计范围的缩小,深度估计间隔也会进一步缩小,越小的深度估计间隔代表着越精细的深度估计精度。在第k个阶段,假设当前的深度估计范围Rk和深度平面估计间隔Ik,所以对应的深度估计平面数可以计算。当该阶段的图像分辨率固定后,一个更大的深度估计范围会产生更为精确的深度估计结果,但同时也会提升GPU的消耗。同时根据特征金字塔网络的特点,在级联式代价体构造过程中,每个阶段将按照上一阶段的两倍数量,即在每个阶段的图像的分辨率分别是之前的两倍。4、Loss的设置Cascade-MVSNet仍旧是监督学习下的网络结构,同时,因为仍旧沿用MVSNet的网络架构,所以Loss的构造和MVSNet的loss构造形式类似,不同的是,Cascade-MVSNet使用的是级联式的学习策略,所以Loss构造定义为:
其中,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的文件夹。
图8 CasMVSNet目录
具体的配置这里不再重复,Github上的README.md介绍已经十分详尽。运行之后可以得到的结果如下:·Scan10 数据库
a)原图 b) 深度图 c) 深度置信度图图
9 深度图估计结果
图10 稠密重建结果
3)具体分析代码分析:Github上提供了一个shell的脚本,在终端直接运行即可,以下对代码进行简要介绍:
1 #!/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这个库,这个在https://github.com/YoYo000/fusibile可以下载,然后在终端输入:
Mkdir build
Cd build
Cmake ..
Make
之后将 --fusibile_exe_path的地址设置为可执行文件所在的地方。第三个要注意的flag是—prob_threshold,这个表示gipuma算法中利用置信度过滤深度图的阈值,如图11)所示,如果当前像素的置信度较高(c-上部),则说明当前像素的深度估计比较准确,若置信度较低,则说明当前像素上,深度估计有多个峰值,不能确定哪一个是最优深度,也表示当前像素估计的深度不准。因此,利用该阈值对深度图进行过滤,在稠密重建的时候,置信度较低的像素就不进行深度融合。
图11 置信度解释示意图[2]
结果分析:通过输出多个中间结果,对Cascade结果进行分析,首先是跑分结果,通过表1可得,利用Cascade的代价图构造方式在精度和完整度上都比之前的方法更优,比传统方法提升了近15个点,比R-MVSNet方法提升了近10个点。
表1 跑分比较结果表
其次,从深度图估计结果看(图12),深度图较为平滑、完整,且估计精度比较高,估计错误的大多数是背景或者白色无纹理地区。通过对当前深度图的点云映射(图13),当前网络在原图视角下可以保持较高的分辨率,当在meshlab中旋转视角,可以看到当前视角估计出来的稠密点云效果完整,主体部分基本正确,背景部分存在偏差是正常的体现,在整体融合的时候可以滤除掉。
图12 scan15深度估计结果
图13 单图恢复点云结果更多结果:
图14 深度估计结果
图15 稠密重建结果
以上结果均由笔者亲自试验,效果能达到论文中描述的水平,且GPU消耗基本在7GB以内,可行性比较高。
6、总结
Cascade-MVSNet是一种利用级联式代价体构造,解决MVSNet在深度估计过程中的GPU消耗过大问题、点云完整度不高的深度学习方法。通过实验,该方法在现有的MVSNet框架下,能以较小的GPU消耗,得到较高精度的深度估计结果,同时也能保留较高的完整度。MVS的深度学习实战系列到目前为止就先告一段落,本系列我们首先回顾了MVS的传统原理和传统方法,并介绍了COLMAP等软件的具体操作,之后,介绍了MVSNet、R-MVSNet和Cascade-MVSNet三个深度学习框架和三维重建的pipeline,希望大家通过本系列的分享,加深对MVS三维重建的理解。附录开源数据集下载链接:在公众号「计算机视觉工坊」,后台回复「mvsnet」,即可直接下载。我们需要下载的是用于测试的数据集,所以打开百度云链接时,点击 “mvsnet”,再点击“preprocessed_inputs”,下载其中的“dtu.zip”和“tankandtemples.zip”即可(图16)。
图16 开源数据集下载
感谢香港科技大学姚遥开源的数据集链接。
本文仅做学术分享,如有侵权,请联系删文。
下载1在「计算机视觉工坊」公众号后台回复:深度学习,即可下载深度学习算法、3D深度学习、深度学习框架、目标检测、GAN等相关内容近30本pdf书籍。
下载2在「计算机视觉工坊」公众号后台回复:计算机视觉,即可下载计算机视觉相关17本pdf书籍,包含计算机视觉算法、Python视觉实战、Opencv3.0学习等。
下载3在「计算机视觉工坊」公众号后台回复:SLAM,即可下载独家SLAM相关视频课程,包含视觉SLAM、激光SLAM精品课程。
重磅!计算机视觉工坊-学习交流群已成立
扫码添加小助手微信,可申请加入3D视觉工坊-学术论文写作与投稿 微信交流群,旨在交流顶会、顶刊、SCI、EI等写作与投稿事宜。
同时也可申请加入我们的细分方向交流群,目前主要有3D视觉、CV&深度学习、SLAM、三维重建、点云后处理、自动驾驶、CV入门、三维测量、VR/AR、3D人脸识别、医疗影像、缺陷检测、行人重识别、目标跟踪、视觉产品落地、视觉竞赛、车牌识别、硬件选型、学术交流、求职交流等微信群,请扫描下面微信号加群,备注:”研究方向+学校/公司+昵称“,例如:”3D视觉 + 上海交大 + 静静“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进去相关微信群。原创投稿也请联系。
▲长按加微信群或投稿
▲长按关注公众号