三维重建的方法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来提高重构精度。