这篇文章研究了一种将结构光与卷积神经网络(CNN)结合起来的三维重建算法。算法的输入是单张条纹图像,输出是深度图。训练和验证数据集是通过传统的条纹结构光算法得到的(数据有着高质量的3D ground truth labels)。为了得到深度信息,传统的方法使用复杂的算法计算相位或像素视差,而本文提出了一种end-to-end的方法,可以直接由2D图像得到3D深度图。本文提出并比较了三种基于CNN的模型,并且公开了一个高精度的结构光数据集。
结构光技术,根据所需要的图像张数,可以被分为两种, multi-shot和single-shot 。multi-shot精度高,被广泛用于工业领域。single-shot速度快,可以处理动态场景,在娱乐和机器人领域受到更多关注。
随着CNN的发展,在图像分割领域涌现出一些end-to-end的架构,比如UNet等。在三维重建领域,Eigen[22]和Liu[23]等学者提出了一种CNN模型,可以使用单张图像做深度估计。但是他们使用的是Kinect的RGB-D数据集,精度较差。受两人的工作启发,Choy[24]提出一种架构,将RNN引入到了具有自动编码器的CNN模型中(?????),来做单视图和多视图的三维重建。Duo[25]等提出一种CNN模型,可以从单张照片重建3D脸部模型。尽管在一个合成的公开数据集上表现很好,但该方法需要复杂的后处理步骤。最近Paschalidou 结合了CNN和马尔科夫随机场,提出了end-to-end的RayNet 来做多视图三维重建。以上方法的共同缺点是,没有使用高精度的训练数据。
在光学领域,涌现了很多使用CNN进行结构光条纹分析的工作。比如Feng,Yin[27-35]等结合CNN和相移技术来做相位解包裹。也有使用深度学习技术来做降噪的[36-38]。
由于CNN在图像分割,三维重建和条纹分析等领域的成功应用,使用CNN从单张结构光图像中重建高精度的三维模型也是值得尝试的。拥有巨量参数的深度CNN模型可被训练来拟合任何复杂的非线性回归模型,比如将一张传统的结构光图像映射到其对应的深度图上的模型。当前,CNN技术和传统结构光技术中应用最广泛的技术:FPP的结合,是研究的热点。本文提出了一种将两者结合的方法:使用一个具有encoder和decoder的CNN模型,将单张高频条纹图映射为一张3D图像。同传统的三维测量方法相比,本文的方法要简单很多,因为不需要任何几何信息,或者复杂的标定和三角计算。
精准的训练数据集对于机器学习模型的训练是非常重要的。本文使用FPP技术(16张图像)来制作ground truth, 用来做模型的训练和验证。
本文的2.1 节介绍了FPP技术,2.2节介绍模型的细节,3节是实验结果,4和5做了小结。
简要介绍了FPP技术的原理,包括相位计算,多频法相位解包裹技术,以及如何从相位分布得到深度信息[46,47],这里不再赘述。
使用FPP技术生成的data可以直接被喂给CNN模型来做训练。
模型由两部分组成,encoder和decoder. encoder 包括了convolution和pooling操作, 可以从输入图像中提取到重要的特征. decoder, 包括了transpose convolution 和unpooling操作, 可以将低维feature map通过stack和concatenate, 生成更高分辨率的layers.
本文使用了三种CNN架构, 比较了他们的效果:
FCN
FCN被应用于语义分割. FCN的encoder采用了同时期的分类网络, 并将全连接层转换为卷积层, 然后再将粗输出上采样到与输入同样的大小. 本文采用了FCN-8s 架构[19] ,该架构可以防止空间信息的丢失.
AEN
AEN有一个encoder和与之对称的decoder.本文提出的AEN共33层
UNet
UNet和AEN的架构很像.主要的区别在于,UNet中, 来自encoder的 local context information 被直接连接(concatenated)到了上采样输出. 这有助于提高输出的分辨率.
三种CNN架构图示如下:
训练和测试数据集是四维向量, 维度为 s × h × w × c s \times h \times w \times c s×h×w×c, s是样本个数, h和w是图像的空间分辨率, c是图像通道数. 网络包括了convolution, pooling, transpose convolution, 和unpooling 层, 但不包括任何全连接层. 卷积层用到的激活函数为Relu.
max pooling 层的size为 2x2, stride为2. 在AEN和UNet 中, 2D transpose convolution 被用在decoder中, 作用是将低分辨率的feature 转换为高分辨率的feature. 最后有个1x1 的卷积层, 可以将feature map 转为深度图.
硬件环境
深度学习环境
实验环境
使用FPP算法, 分别生成了1120, 140和140组真实数据作为训练集,验证集和测试集.数据集已开放下载https://figshare.com/articles/dataset/Single-shot_3D_shape_reconstruction_datasets/7636697
四步相移法中, 最高频的第一张图被作为输入图像.
(原文附件视频查看:https://www.mdpi.com/1424-8220/20/13/3718/s1)
data split ratio为(0.8,0.1,0.1) ,这对于小数据集来说足够了 ???
原始数据中的阴影区域不参与训练.
evaluation 的指标使用的是重建的3D shape 的 MRE和RMSE (???咋算的).
结果可以看出:
直观展示下结果
Figure5 是取了深度图的一行像素
可以看出AEN和UNet比FCN的结果要好, 主要原因是FCN 仅使用双线性上采样算子(???)从低分辨率来恢复高分辨率特征, 造成了很多细节丢失. AEN和UNet在decoder中包含了和其encoder对称的操作, 这有助于信息在各层之间更好的传递,从而保留了更多的细节.(???)
而与AEN相比, UNet拥有可以将local features直接传递到decoder的concatenation操作, 这使得它在三者中表现最好.
对于传统方法,由于条纹相位的不连续性, 使用一张条纹图来重建拥有不同深度的多个物体是不可行的. (???) 然而, 这对于深度学习方法不是个问题, 因为根本不需要计算相位.
最后比较了下传统的FPP, 3D-DIC技术 和UNet的结果. 技术上来说, 3D-DIC 使用两个相机同时成像, 仅使用一张图, 该技术需要area或block based image registration, 所以其一般来说分辨率比FPP要低(???)
下图展示了三种技术的重建效果, 精度方面, FPP最高, DIC次之, UNet最低.但是UNet计算时间要小于50ms. 而其他两种方法在0.1到2秒之间.
在精度方面,尽管本文提出的方法还有进一步提升的空间, 但是需要更多的训练数据(这很耗费时间)和更深层的神经网络模型(这在训练阶段很吃算力和内存). 未来的工作可以着眼在更好的模型, 更大的数据集以及寻求更好的硬件或云计算来加速模型的训练