3D重建算法原理

三维重建(3D Reconstruction)技术一直是计算机图形学和计算机视觉领域的一个热点课题。早期的三维重建技术通常以二维图像作为输入,重建出场景中的三维模型。但是,受限于输入的数据,重建出的三维模型通常不够完整,而且真实感较低。随着各种面向普通消费者的深度相机(depth camera)的出现,基于深度相机的三维扫描和重建技术得到了飞速发展。以微软的Kinect,华硕的XTion以及因特尔的RealSense等为代表的深度相机造价低廉,体积适当,操作方便,并且易于研究者和工程师进行开发。三维重建技术也是增强现实(Augmented Reality,简称AR)技术的基础,经过扫描重建后的三维模型可以直接应用到AR或VR的场景中。本文将简单介绍基于深度相机的三维重建技术的基本原理及其应用。

背景

  • 对几何3D模型不断增长的需求:电影 游戏 虚拟环境等行业
  • VR&AR的火爆
  • 房地产 三维地图等领域的需求
  • 中国古代建筑三维数字化保护
  • 三维数字化城市
  • 三维地图
  • VR&&AR游戏,电影等
  • 医疗行业:三维心脏
  • 教育行业等

应用

方法介绍

传统的三维重建主要是依靠昂贵的三维扫描设备,并且需要被扫描的目标保持一段时间的稳定。近年来,由于计算机硬件大规模计算能力的发展,特别是GPU和分布式计算的发展,实时高效的解决方案成为了可能。目前主流的方法主要分为以下两类:

  • 基于深度相机的三维重建
  • 基于图像的三维重建

原理 主要有以下三种:结构光,这个技术的代表产品是 Kinect 一代,它的传感器芯片用的是 PrimeSense 家的。PrimeSense 现在是苹果旗下的公司。

  • TOF,time-of-flight,代表产品是 Kinect 二代,由于微软对于 One 这个单词的热爱,它的官方名字是 Kinect One。
  • 双目摄像头,代表产品是 Google Tango 以及 Leap Motion,前者配有四台摄像头,后者有两个

三维重建算法广泛应用于手机等移动设备中,常见的算法有SfM,REMODE和SVO等。

  • 2.2 双目/多目视觉

双目视觉主要利用左右相机得到的两幅校正图像找到左右图片的匹配点,然后根据几何原理恢复出环境的三维信息。但该方法难点在于左右相机图片的匹配,匹配地不精确都会影响最后算法成像的效果。多目视觉采用三个或三个以上摄像机来提高匹配的精度,缺点也很明显,需要消耗更多的时间,实时性也更差。

这两种方法理论上都可较精确恢复深度信息,但实际上受拍摄条件的影响,其精度往往无法得到保证。常见的有SGM和SGBM算法等,其中自动驾驶数据集KITTI中,排名前五十的算法几乎有一半都是对SGM的改进。

3
基于消费级RGB-D相机

相机可以基于主动式、被动式不同原理,优点在于基于这些设备的算法更具备实用性。

近年来,也有不少研究直接基于消费级的RGB-D相机进行三维重建,如在微软的Kinect V1、V2产品上,取得了不错的效果。最早,由帝国理工大学的Newcombe等人于2011年提出的Kinect
Fusion开启了RGB相机实时三维重建的序幕。此后有 Dynamic Fusion和Bundle Fusion等算法。
这些方法它们各自有着各自的优点和缺点,同样有各自所适用的应用范围。以上为想要入门基于深度学习进行三维重建领域的同学简要介绍了这些方法,如需要深入了解,请仔细阅读相关文献,SfM和多视图几何等经典算法作为入门三维重建领域的基础永远都不会过时。

基于深度学习的三维重建算法

我们将基于深度学习的三维重建算法简要地分为三部分,更详细的文献综述将会在后续的系列文章中做介绍:

  • 在传统三维重建算法中引入深度学习方法进行改进
  • 深度学习重建算法和传统三维重建算法进行融合,优势互补
  • 模仿动物视觉,直接利用深度学习算法进行三维重建

1 在传统三维重建算法中引入深度学习方法进行改进



因为CNN在图像的特征匹配上有着巨大优势,所以这方面的研究有很多,比如:

  • DeepVO

其基于深度递归卷积神经网络(RCNN)直接从一系列原始RGB图像(视频)中推断出姿态,而不采用传统视觉里程计中的任何模块,改进了三维重建中的视觉里程计这一环。

  • BA-Net

其将 SfM 算法中的一环集束调整(Bundle Adjustment, BA)优化算法作为神经网络的一层,以便训练出更好的基函数生成网络,从而简化重建中的后端优化过程。• Code SLAM,通过神经网络提取出若干个基函数来表示场景的深度,这些基函数可以简化传统几何方法的优化问题。

2. 深度学习重建算法和传统三维重建算法进行融合,优势互补



CNN-SLAM13将CNN预测的致密深度图和单目SLAM的结果进行融合,在单目SLAM接近失败的图像位置如低纹理区域,其融合方案给予更多权重于深度方案,提高了重建的效果。

3. 模仿动物视觉,直接利用深度学习算法进行三维重建

三维重建领域主要的数据格式有四种:

  • 深度图(depth map)

2D图片,每个像素记录从视点到物体的距离,以灰度图表示,越近越黑;

  • 体素(voxel)

体积像素概念,类似于2D之于像素定义;

  • 点云(point cloud)

每个点包含有三维坐标,乃至色彩、反射强度信息;

  • 网格(mesh)

即多边形网格,容易计算。

依据处理的数据形式不同将研究简要分为三部分:1)基于体素;2)基于点云;3)基于网格。而基于深度图的三维重建算法暂时还没有,因为它更多的是用来在2D图像中可视化具体的三维信息而非处理数据。

(1)基于体素



体素,作为最简单的形式,通过将2D卷积扩展到3D进行最简单的三维重建:

  • Depth Map
    Prediction from a Single Image using a Multi-Scale Deep Network, 2014

该方法是用深度学习做三维重建的开山之作,基于体素形式,其直接用单张图像使用神经网络直接恢复深度图方法,将网络分为全局粗估计和局部精估计,并用一个尺度不变的损失函数进行回归。

  • 3D-R2N2: A
    unified approach for single and multi-view 3d object reconstruction, 2016

Christopher等人基于体素形式提出的3D-R2N2模型使用Encoder-3DLSTM-Decoder的网络结构建立2D图形到3D体素模型的映射,完成了基于体素的单视图/多视图三维重建(多视图的输入会被当做一个序列输入到LSTM中,并输出多个结果)。
但这种基于体素的方法存在一个问题,提升精度即需要提升分辨率,而分辨率的增加将大幅增加计算耗时(3D卷积,立次方的计算量)。

如何估计不同帧中的相机位置?

新的一帧数据的处理流程

(2)基于点云



相较而言,点云是一种更为简单,统一的结构,更容易学习,并且点云在几何变换和变形时更容易操作,因为其连接性不需要更新。但需要注意的是,点云中的点缺少连接性,因而会缺乏物体表面信息,而直观的感受就是重建后的表面不平整。

  • A Point Set
    Generation Network for 3D Object Reconstruction From a Single Image, 2017

该方法是用点云做三维重建的开山之作,最大贡献在于解决了训练点云网络时候的损失问题,因为相同的几何形状可能在相同的近似程度上可以用不同的点云表示,如何用恰当的损失函数来进行衡量一直是基于深度学习用点云进行三维重建方法的难题。

  • Point-Based
    Multi-View Stereo Network, 2019

该方法通过对场景的点云进行处理,融合三维深度和二维纹理信息,提高了点云的重建精度。

(3)基于网格



以前的方法的缺点:

  • 基于体素,计算量大,并且分辨率和精度难平衡
  • 基于点云,点云的点之间缺少连接性,重建后物体表面不光滑

相较而言,网格的表示方法具有轻量、形状细节丰富的特点,重要是相邻点之间有连接关系。因而研究者基于网格来做三维重建。网格是由顶点,边,面来描述3D物体的,这正好对应于图卷积神经网络的M=(V,E,F)所对应。

  • Pixel2Mesh

用三角网格来做单张RGB图像的三维重建,相应的算法流程如下:

Step1:对于任意的输入图像都初始化一个椭球体作为初始三维形状。

Step2:将网络分为两部分:一部分用全卷积神经网络来提取输入图像的特征,另一部分用图卷积网络来表示三维网格结构,

Step3:对三维网格不断进行变形,最终输出物体的形状。

模型通过四种损失函数来约束形状,取得了很好的效果。贡献在于用端到端的神经网络实现了从单张彩色图直接生成用网格表示的物体三维信息。

总结

传统的三维重建算法可以分为:

这些方法各自有各自优点和使用范围,简要概括一下:

而基于深度学习的三维重建算法研究主要有三种:
1.
在传统三维重建算法中引入深度学习方法进行改进;

2. 深度学习重建算法和传统三维重建算法进行融合,优势互补;

3. 模仿动物视觉,直接利用深度学习算法进行三维重建,包括基于体素、基于点云和基于网格。

3D重建算法原理的更多相关文章

  1. 裸眼3D立体显示技术原理详解

    众所周知,现实世界是一个三维空间,除去时间这一维度,现实世界是由长度.宽度和高度三个维度组成,我们每天就生活在这个三维世界中,而现有的显示设备大多数都只能显示二维信息,并不能带给人真实的三维感觉.为了 ...

  2. MySQL 索引背后的数据结构及算法原理

    本文转载自http://blog.jobbole.com/24006/ 摘要本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引 ...

  3. MySQL索引背后的数据结构及算法原理 (转)

    摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BT ...

  4. MySQL(二)索引背后的数据结构及算法原理

    本文转载自CodingLabs,原文链接 MySQL索引背后的数据结构及算法原理 目录 摘要 一.数据结构及算法基础 1. 索引的本质 2. B-Tree和B+Tree 3. 为什么使用B-Tree( ...

  5. CodingLabs - MySQL索引背后的数据结构及算法原理

    原文:CodingLabs - MySQL索引背后的数据结构及算法原理 首页 | 标签 | 关于我 | +订阅 | 微博 MySQL索引背后的数据结构及算法原理 作者 张洋 | 发布于 2011-10 ...

  6. JPEG压缩图像超分辨率重建算法

    压缩图像超分辨率重建算法学习 超分辨率重建是由一幅或多幅的低分辨率图像重构高分辨率图像,如由4幅1m分辨率的遥感图像重构分辨率0.25m分辨率图像.在军用/民用上都有非常大应用. 眼下的超分辨率重建方 ...

  7. MugLife静态照片变3D动画算法研究

    原文:MugLife静态照片变3D动画算法研究 MugLife app是一款可以将静态照片变成3D动画的手机应用,如下效果图所示: 大家可以看到,这个静态图具有了类3D的动画特效,是不是很好玩? 这种 ...

  8. MySQL索引之数据结构及算法原理

    MySQL索引之数据结构及算法原理 MySQL支持多个存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BTree索引,哈希索引,全文索引等等.本文只关注BTre ...

  9. Bagging与随机森林算法原理小结

    在集成学习原理小结中,我们讲到了集成学习有两个流派,一个是boosting派系,它的特点是各个弱学习器之间有依赖关系.另一种是bagging流派,它的特点是各个弱学习器之间没有依赖关系,可以并行拟合. ...

随机推荐

  1. input 的各种属性的验证 checkValidity兼容性

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  2. 一个DDOS病毒的分析(二)

    一.基本信息 样本名称:hra33.dll或者lpk.dll 样本大小: 66560 字节 文件类型:Win32的dll文件 病毒名称:Dropped:Generic.ServStart.A3D47B ...

  3. Android内核模块编译执行

    Author: GeneBlue 0X01 前言 内核驱动是漏洞的高发区,了解Android驱动代码的编写是分析.利用驱动漏洞的基础.本文以一个"hello"驱动为例,简单介绍内核 ...

  4. Shiro反序列化漏洞复现

    Apache Shiro是一个强大且易用的Java安全框架,执行身份验证.授权.密码和会话管理.使用Shiro的易于理解的API,可以快速.轻松地获得任何应用程序,从最小的移动应用程序到最大的网络和企 ...

  5. Docker仓库-Docker Hub

    Docker Hub Docker官方维护了一个公共仓库Docker Hub,其中已经包括了数量上百万的镜像,大部分需求都可以通过在Docker Hub 中直接下载镜像来实现. 注册: https:/ ...

  6. Day009 稀疏数组

    稀疏数组(数据结构) 场景 需求:编写五子棋游戏中,有存盘和续上盘的功能. 分析问题:因为该二维数组的很多值默认都是0,因此记录了很多没有意义的数据. 解决:稀疏数组 稀疏数组介绍 当一个数组大部分元 ...

  7. Linux yum 报错:One of the configured repositories failed (Unknown), and yum doesn't have.

    1.  请先确定你是无法联网还是配置问题. ping www.baidu.com 如果是正常ping那可以看这个帖子完成配置 https://blog.csdn.net/weicuidi/articl ...

  8. 游戏中的2D OBB碰撞模型的碰撞算法介绍和实践

    前言 上一篇博文说道,射线与场景中模型上的所有三角形求交时,会大幅度影响效率且花费比较多的时间,因此会采取使用包围盒的形式,进行一个加速求交.在此文中介绍OBB碰撞模型的碰撞算法 OBB的碰撞模型 有 ...

  9. 面试侃集合 | ArrayBlockingQueue篇

    面试官:平常在工作中你都用过什么什么集合? Hydra:用过 ArrayList.HashMap,呃-没有了 面试官:好的,回家等通知吧- 不知道大家在面试中是否也有过这样的经历,工作中仅仅用过的那么 ...

  10. ES6学习-3 const

    const声明一个只读的常量.一旦声明,常量的值就不能改变,所以在声名时就进行赋值. const的作用域与let命令相同,只在声明所在的块级作用域内有效. const命令声明的常量,同样存在暂时性死区 ...