三维重建的方法SFM

这是3.23组会的汇报内容

 

看了一些关于三维重建的博客,深入了解了一下点云、体素、网格的区别等。

3D重建的进阶了解---深度图,网格,体素,点云是什么

https://www.cnblogs.com/lainey/p/8547056.html

 

还有3D建模的一些初步了解:

 

用一组图片来做3D reconstruction需要的算法: SFM(Structure from motion),也就是从时间系列的2D图像中推算3D信息。

使用这种方法的软件有: Pix4Dmapper, Autodesk 123D Catch, PhotoModeler, VisualSFM

 

大多数三维重建的数据源是RGB图像,或者RGBD这种带有图像深度信息的图像(用kinect之类的特殊特备拍出来的)。

 

SFM是最经典的三维重建方案:

1.特征提取(SIFT, SURF, FAST等一堆方法)

2.配准(主流是RANSAC和它的改进版

3.全局优化bundle adjustment   用来估计相机参数

4.数据融合

 

SFM算法是一种基于各种收集到的无序图片进行三维重建的离线算法。在进行核心的算法structure-from-motion之前需要一些准备工作,挑选出合适的图片。

 

 

三维重构算法得看试用的是什么传感器,如果是双目相机,一般是极线几何加视觉特征配准的算法,优化就是bundle adjustment; 如果是单目相机,较早的有PTAM,DTAM,, 近几年就是SFM比较火,如果是Kinect之类的RGBD相机,比较好的就是微软的KinectFusion, PCL的开源KinFu,以及MIT加强版Kintinuous; 如果是用激光,一般就是SLAM做了。

 

基于rgb单目主要就是基于multiview geometry(SFM) ,比较经典的是DTAM和微软的monofusion, 缺点是没法做稍大场景的重建以及重建精度不高。

 

双目的话就认为是rgbd相机的重建,底层可以得到深度图的原理就是结构光,双目,激光,或者tof(结构光方法适合室内高精度重建,商业产品较多, sfm方法比结构光方法更方便,无需事先标定相机,但精度差些,很多无人机对大型建筑建模就是用的sfm方法)

 

 

3D重构算法可以描述为当给定某个物体或场景的一组照片时,在一些假定条件下,比如物体材料,观测视角和光照环境等,通过估计一个最相似的3D shape来解释这组照片。一个完整的3D重构流程通常包含以下几个步骤:

1. 收集场景图片

2. 计算每张图片的相机参数

3. 通过图组来重构场景的3D shape以及对应的相机参数

4. 有选择的重构场景的材料等

 

 

最核心步骤就是第三步: 3D shape的重构算法

 

常规的3D shape representation主要有四种: 深度图(depth), 点云(point cloud), 体素(voxel), 网格(mesh)

 

近年来也出现了很多基于deep learning的方法:

 

David Eigen NIPS2014:   Depth Map Prediction from a Single Image using a Multi-Scale Deep Network

 

Fayao Liu CVPR2015  Deep Convolutional Neural Fields for Depth Estimation from a Single Image

 

这两篇论文都是利用CNN网络结构预测 a single image与其对应的depth map之间的关系。

 

但是depth image还不足以解释重构原始input的信息,它只能作为3D scene understanding的一个辅助信息。所以开始研究利用一组二维图来重构3D点云图或voxel以及mesh图。

 

基于deep learning的3D点云和mesh重构是较难以实施的,因为DL学习一个物体完整的架构需要大量数据的支持。然后传统的3D模型是由vertices和trangulation mesh组成的,因此不一样的data size造成了training的困难。所以后续大家都用voxelization(Voxel)的方法把所有CAD model转成binary voxel模式(有值为1, 空缺为0)这样保证了每个模型都是相同的大小。最近的一篇论文: Choy ECCV2016:    3D-R2N2:A Unified Approach for Single and Multi-view 3D Object Reconstruction

 

采用深度学习从2D图像到其对应的3D voxel模型的映射:首先利用一个标准的CNN结构对原始input image进行编码,然后用Deconv进行解码,最后用3D LSTM的每个单元重构output voxel.

 

3D voxel是三维的,它的resolution成指数增长,所以它的计算相对复杂,目前的工作主要采用32*32*3以下的分辨率以防止过多的占用内存。但是也使得最终重构的3D model分辨率并不高。所以科研道路道阻且长。

 

mesh和point cloud是不规则的几何数据形式,因此直接使用CNN是不可行的。但是可以考虑将3D mesh data转化成graphs形式,再对3D曲面上的2D参数进行卷积。具体有Spatial construction(Geodesic CNN)和Spectral construction(Spectral CNN)

 

基于point cloud的方法,看Hao Su的CVPR2017论文 PointNet: Deep learning on Point Sets for 3D Classification and Segmentation以及 A Point Set Generation Network for 3D Object Reconstruction from a Single Image.

 

基于mesh和point cloud的方法总的来讲数学东西多,而且细节回复上效果欠佳。不过可以考虑voxel来提高重构精度。

posted @ 2018-05-09 16:22  feifanren  阅读(6813)  评论(0编辑  收藏  举报