8

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

 3 years ago
source link: https://mp.weixin.qq.com/s/1sU4lxo1MSN2kdDrTMif9A
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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

Original 浩南 计算机视觉工坊 10/16
收录于话题
#立体匹配

点击上方“计算机视觉工坊”,选择“星标”

干货第一时间送达

Image

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体现。
640?wx_fmt=png
图1 效果比较图不同于R-MVSNet,本篇文章(以下简称“Cascade-MVSNet”)则仍旧使用了MVSNet网络框架中的3D卷积神经网络对深度代价体进行正则化,但不同于其代价体的构造,Cascade-MVSNet利用链式代价体构造的策略,先估计较为粗糙的深度值,然后再进一步缩小深度估计范围,提高深度估计精度,实现了在较小的GPU消耗的条件下,得到较高分辨率和较高精度的深度图,经过稠密重建后,Cascade-MVSNet的结果也比之前所提到的方法要更为完整(图2)。
640?wx_fmt=png
图2 稠密重建结果比较2、代价体构造回顾沿用立体匹配的视差估计框架,通常深度学习方法都会构造一个沿深度方向的代价体,例如MVSNet借鉴平面扫描算法的原理,构造由沿不同深度而前视平行的平面组成一个相机椎体,然后每一个相机椎体经过采样,变成长宽一致的特征体,通过可微分化的单应性变换将不同视角下的特征扭曲到参考视角上,构成代价体。一般来说,代价体的长宽则是由输入影像分辨率提供的,深度范围则是通过稀疏重建后的结果提供先验条件。这样的构造方式,使得代价体正则化时,三维代价体的内存消耗会以三次指数的速率增长(图3)。
640?wx_fmt=png
图3 代价体构造示意图上一篇文章中R-MVSNet使用循环神经网络,对将代价体沿深度切成不同的深度图,利用GRU结构进行正则化处理,相比较MVSNet,能减少GPU的消耗。可是循环神经网络会涉及一个遗忘的过程,导致网络不能很好地保留像素周围的纹理信息,所以点云完整度不能得到很好地保留(图4)。
640?wx_fmt=png
图4 RNN代价体正则化过程
3、Cascade-MVSNet为了解决信息保留和GPU消耗的两个问题,Cascade-MVSNet提出一种级联的代价体构造方法,并输出从粗到细的深度估计值。首先来看其整个网络的架构(图5)。
640?wx_fmt=png
图5 Cascade网络框架示意图可以看到,整个网络的结构还是沿袭了MVSNet框架(图6),还是以多视图的影像作为输入,然后经过可微分单应性变换形成不同视角下的特征体,在通过代价体构造,形成一个代价体,之后通过回归估计深度值。这里不再对MVSNet作更多的赘述,感兴趣的朋友可以回顾之前的文章:MVSNet。
640?wx_fmt=png
图6 MVSNet深度估计框架此篇文章不同的是:整个网络利用级联式代价体的构造策略。首先,原始输入影像,利用特征金字塔网络先对原始影像进行降采样,降低特征体的分辨率,使得可以拥有较为精确的深度估计范围。通过初始的MVSNet框架估计出低分辨率下的深度图后,进入下一阶段。下一阶段开始时,先进行上采样,然后以上一层的深度估计范围作为参考,确定改成的深度估计范围和深度估计间隔。最后输出一个较高分辨率的深度图。如图7,根据稀疏重建给予的先验深度范围,第一阶段的深度估计范围将包含整个场景。所以,会和低分辨率影像建立一个体量较小的代价体(图5)。在之后的阶段中,深度估计范围会进一步缩小。640?wx_fmt=jpeg
640?wx_fmt=png
图7 不同阶段的深度估计范围变化除了深度估计范围的缩小,深度估计间隔也会进一步缩小,越小的深度估计间隔代表着越精细的深度估计精度。640?wx_fmt=jpeg在第k个阶段,假设当前的深度估计范围Rk和深度平面估计间隔Ik,所以对应的深度估计平面数可以640?wx_fmt=jpeg计算。当该阶段的图像分辨率固定后,一个更大的深度估计范围会产生更为精确的深度估计结果,但同时也会提升GPU的消耗。同时根据特征金字塔网络的特点,在级联式代价体构造过程中,每个阶段将按照上一阶段的两倍数量,即在每个阶段的图像的分辨率分别是之前的两倍。4、Loss的设置Cascade-MVSNet仍旧是监督学习下的网络结构,同时,因为仍旧沿用MVSNet的网络架构,所以Loss的构造和MVSNet的loss构造形式类似,不同的是,Cascade-MVSNet使用的是级联式的学习策略,所以Loss构造定义为:640?wx_fmt=jpeg其中,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的文件夹。
640?wx_fmt=png
图8 CasMVSNet目录具体的配置这里不再重复,Github上的README.md介绍已经十分详尽。运行之后可以得到的结果如下:·Scan10 数据库
640?wx_fmt=png
  • 640?wx_fmt=png
                 原图                             b) 深度图                       c) 深度置信度图图9 深度图估计结果
640?wx_fmt=png
图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这个库,这个在https://github.com/YoYo000/fusibile可以下载,然后在终端输入:
Mkdir buildCd buildCmake ..Make
之后将 --fusibile_exe_path的地址设置为可执行文件所在的地方。第三个要注意的flag是—prob_threshold,这个表示gipuma算法中利用置信度过滤深度图的阈值,如图11)所示,如果当前像素的置信度较高(c-上部),则说明当前像素的深度估计比较准确,若置信度较低,则说明当前像素上,深度估计有多个峰值,不能确定哪一个是最优深度,也表示当前像素估计的深度不准。因此,利用该阈值对深度图进行过滤,在稠密重建的时候,置信度较低的像素就不进行深度融合。
640?wx_fmt=png
图11 置信度解释示意图[2]结果分析:通过输出多个中间结果,对Cascade结果进行分析,首先是跑分结果,通过表1可得,利用Cascade的代价图构造方式在精度和完整度上都比之前的方法更优,比传统方法提升了近15个点,比R-MVSNet方法提升了近10个点。表1 跑分比较结果表
640?wx_fmt=png
其次,从深度图估计结果看(图12),深度图较为平滑、完整,且估计精度比较高,估计错误的大多数是背景或者白色无纹理地区。通过对当前深度图的点云映射(图13),当前网络在原图视角下可以保持较高的分辨率,当在meshlab中旋转视角,可以看到当前视角估计出来的稠密点云效果完整,主体部分基本正确,背景部分存在偏差是正常的体现,在整体融合的时候可以滤除掉。
640?wx_fmt=png
图12 scan15深度估计结果
640?wx_fmt=png
图13 单图恢复点云结果更多结果:
640?wx_fmt=png
640?wx_fmt=png
640?wx_fmt=png
图14 深度估计结果
640?wx_fmt=png
图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)。
640?wx_fmt=jpeg
图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视觉 + 上海交大 + 静静“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进去相关微信群。原创投稿也请联系。

640?wx_fmt=jpeg▲长按加微信群或投稿

640?wx_fmt=jpeg

▲长按关注公众号

觉得有用,麻烦给个赞和在看~640?wx_fmt=gif


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK