点击上方“3D视觉工坊”,选择“星标”

干货第一时间送达

作者丨lcl

来源丨 我爱计算机视觉

本文简单带大家看一下单图像三维重建相关的论文。写这篇文章算是对之前的一点总结。因为之前没有做过三维视觉,也没有钻研过生成对抗网络,中间实在是吃了不少苦,基本是边补基础知识边看论文,现在基本感觉看过一遍了,简单的把这些论文都拿出来说一说,算作有个收尾。如果说的不好,哪里理解错了,也请各位在评论区批评指教。

 单图像三维重建算法介绍

在开始讨论之前先说一下为什么要做单图像三维重建,原因其实很直观。总结起来就是两个字,“需要”。我们很需要这类应用,如果可以做出来,不论是学术上、产品上都有很大价值。

比如像是国外的英伟达(NVIDIA)、脸书,国内的阿里巴巴达摩院、快手做的虚拟人、虚拟场景等的应用。但是三维重建不好做,因为三维数据真值很难获得,或者收集起来很花钱。

所以这就带来一个问题,如何以成本更低的方式完成三维重建。其中的一个思想是,我们能不能使用二维数据来去做一个弱监督学习,曲线救国实现这个任务。这个方式被证明可以取得很好的效果,所以在接下来的讨论里面,我们会以此为基础,给大家介绍单图像做三维重建的一些方法。

 单图像三维重建算法是怎么实现的

从整体来看,最近两年顶会的三维重建算法绝大多数都是基于深度学习的。在深度学习中,又进一步分出了三条主要路径,这三条路径分别是

1)先对单图片中的目标物体进行建模,直接取得其三维形体(template), 之后再使用另一个模型去上色并处理光照。整个流程不是一个端到端的流程(这里并不是说不能做到单模型统一,只是目前没论文这样做),需要分开训练。

2)直接使用给定的先验形体(prior template)进行体态学习,同时进行采样(UV sampling)来学习色彩特征,全部叠加到一起就可以实现三维型体重建。

主要的实现方式是,使用可导渲染器(也叫神经渲染器,英文是neural rendering)去渲染然后再后处理,来生成某一个三维形态投射到二维的投影,拿到投影再生成分割图,关键点坐标,RGB像素等等,之后去优化分割、以及染色分支。这里提到的先验形体,一般指的是高对称性三维物体,比如球体。

3)使用神经辐射场(NERF)外加体素渲染进行三维结构的学习,可以直接学习到物体的形体以及色彩。使用这种方式进行三维重建是现在的学术界主流,很多去年相关的论文基本都是以此为技术核心发表。目前比较成型的探索结果包括虚拟人形象以及动物形象等。

相比较其他算法,基于NERF的算法一般可以生成更高像素质量、更高分辨率、更高清晰度的虚拟形象。但是这种算法也是有自带的问题,就是不能生成基于特定输入的图像(因为这类算法基于生成对抗网络),所以对于产品化而言,这种方案还是有进一步提升的需要。其中一种可能的方式就是去做3D GAN inversion,也就是进行图像编辑。

 单图像三维重建具体算法

以下篇幅我们来看一下这三种方案都对应有哪些论文,他们各自的都提出了什么方法来解决具体的问题。

路径一:形体建模+色彩渲染

这一套方案采用分阶段的方式,希望能够将三维重建分拆两个子任务,也就是形体建模+色彩渲染。每个子任务引入一个子模型来去建模,同时使用两个sota的算法分别把形体和色彩做到极致。

这样子的话既可以控制难度,对于各个模块又可以精调,可以做到合适的取舍。比如你更希望形体做的出色,那么对于色彩的要求可以降低,对应模型的复杂度也可以下调,反之亦然。

这里我们首先看一下WLDO[1]。这篇论文中作者研究了怎么重建动物(主要是狗)的形体,可以在不使用3d数据真值的情况下实现对动物形体的重建。模型重建过程基于SMAL的3d先验、二维的关键点与分割图来实现。

具体而言,作者使用了一个encoder进行特征学习,之后使用学习到的特征来拟合形体、姿态以及相机参数,三者结合就可以实现整体身形的学习。具体学习的时候,由于给定先验体态和数据集实际的形态不是很匹配,为了更精确的估计形体,作者使用EM算法。E阶段去估测期望形体参数并冻结其他形体参数的更新;M阶段来更新其他形体参数。最后通过迭代更新来实现整个形体的学习。

在完成形体的学习后,另外一个要解决的问题就是如何上色。这里我们介绍一下Texformer[2]是怎么做的。Texformer是来做人体建模的,可以通过使用输入图像的全局信息进行更加精细的学习,同时尝试融合输入图像与色彩信息来进行完整的染色。模型使用了SMPL来预测体态,同时采用Vision transformer来实现全局信息的学习。

具体来说,使用预计算色彩图作为query,图上每个像素对应于三维空间下的一个顶点;使用输入图像作为value;使用二维组件分割图(2D part segmentation map)作为映射图像到UV空间的载体。作者同时使用一个混合蒙版来合并texture flow与RGB色彩来生成效果更好的色彩预测结果。这里我们附上Texformer的结构图供大家参考。

Texformer 结构图,摘录自论文原文

类似方向的论文还有很多。比如使用基于SMPL的人体模型参数建模,或特别裁出人脸模型进行面部精细化建模等等。这里我们仅举两个例子(作者偷懒就看了这些),然后来总结一下这种方式的优劣。

优势

  • 先训练体态后训练色彩信息,分开双阶段之后,任务平摊到每个阶段,训练难度降低

  • 分阶段下理论上每个子模型都可以学到比较好的效果,整体的效果可以保证

缺点

  • 需要的输入多,包括输入图像、蒙版、关键点或part segmentation map,缺一类就无法训练;数据要求高。

  • 只能针对每类,输出体态估计值,所以输出的体态会非常接近,没有独特性

  • 多阶段导致训练、测试时间同步拉长

路径二:使用神经渲染器

在神经渲染器没出现之前,我们学习三维模型的基本方式是使用准备好的三维真值,比如给定一个玩具模型以及三维的坐标信息,我们直接去回归基于三维的参数来实现三维建模。

神经渲染器的出现则免去了这个麻烦,因为有办法直接用它获得二维投影,这样子的话用二维的真值就可以学习三维的模型特性了,相比较于使用三维真值,绝对是非常有价值而且能商业化的一条路。

使用神经渲染器可以实现端到端的学习,学习目标为姿态、身形、相机拍摄参数以及色彩信息等。神经渲染器通过优化像素采样过程支持可导。常见的有neural-render[10], soft-render[13]与Dib-R[12]等。

通过使用可导渲染器构建2D->3D的渲染结果,并使用投影投射回2D,可以计算生成的渲染结果与原始图像的差异,因而可以做到快速估计并学习关键的重建参数。

以下我们来看一些例子。

首先我们介绍CMR[3]。CMR这篇论文第一次提出通过学习类目模板来解决三维重建问题,但是模板需要使用运动推断结构(SFM)去计算初始化模板,并且使用蒙版和关键点进行弱监督学习;

同时使用球坐标转换的方式映射UV sampling结果,学习并进行渲染上色。具体的框架图请见下图。CMR是一篇非常经典的论文,后面我们提到的UMR[4]、SMR[5]以及我们没有提到的u-cmr都是以此为蓝本进一步提升的。尤其是染色的解决方案,基本上后面的论文都是仿照这种方案来做的。

CMR 结构图,摘录自论文原文

然后我们来看一下UMR[4]。这篇论文尝试使用part segmentation map来代替蒙版和关键点以简化三维重建问题。作者认为物体可以切分为多个子区域,每个区域相互连通,且区域内、区域间的色彩信息是连贯的。

因此2D、3D间相互的转换应能维持这种关系。借由这种思路,UMR算法不需要构造类目模板,因而没有类目的限制。同时UMR借助part-segmentation map进一步明晰了物体边界,这对于更加细节的学习物体的色彩有着十分重要的作用。我们之前提到的texformer,选择了part-segmentation map,便是有一部分原因来源于此。

UMR 结构图,摘录自论文原文

我们再来看一下SMR[5]。SMR通过插值三维重建过程中的关键属性来实现建模。由于物体重建后,身形、纹理以及身体关键部位对应关键点位置应尽量与原图保持一致,作者提出(c)、(d)两种限制来保持重建后物体的一致性。

此外通过保持2D->3D->2D的双向投影来确保2D输入与预测一致,并使用GAN来对相机拍摄角度、纹理信息、物体三维等信息进行插值,生成新的数据,补充训练集,以获得较好的效果。

SMR 结构图,摘录自论文原文

这里我们总结一下路线二的优点和劣势。

优势

  • 直接进行单阶段学习,框架更加简洁清晰

  • 所需的数据量逐步减少,最优情况下只使用蒙版即可生成期望结果

缺点

  • 数据假设训练物体是对称物体,训练需要初始化模板(球体),对于无模板、非刚体、非对称物体,学习难度显著增强

  • 由于是自监督学习,没有明确的真值定义,容易收敛到次优状态,或无法收敛

  • 受限于物体的体积、复杂程度。对于复杂物体效果不佳、对于学习物体的细节把握不佳。

路径三:使用神经辐射场(NERF)

神经辐射场[11]也是最近兴起的渲染器,和神经渲染器的功能类似,但是相比较而言,有其自身更独特的优点。神经辐射场的工作原理是,使用三维空间信息以及二维姿态信息,基于视图的辐射场以及体积密度,学习三维空间坐标与二维视角并投射到RGB颜色值上。

具体实现方式是使用固定的条件编码加上多层感知机(MLP)把输入翻译成像素值以及体素密度。之后进行体态重建将二维输入直接映射到三维。在神经辐射场之前,三维重建的做法是,使用基于voxel-grid的方法表示三维物体,或三维物体对应的特征;

前者极大地消耗了内存,因而只能用于低精准度的三维物体重建;后者需要额外的解码器去解码特征为RGB像素,使得多维度的一致性不够好。在使用神经辐射场之后,相比于基于网格的方法,这种方法不会空间离散、不限制拓扑形态,对于物体的学习有更好的效果。最后还是要提一下,NERF实现很多都是基于GAN的。其中的原因之一是,GAN对于训练数据不足有着很大的补充作用。

这里我们还是看一下相关论文是怎么使用NERF的。首先我们看一下Graf[6]。Graf基于神经辐射场,引入生成对抗网络,使用unpose图像进行训练。目的是生成未知视域下的三维重建结果。

其中生成器主要负责基于图像二维坐标进行采样,每次取得一个patch(K*K个点),然后从这些点里面使用分层采样的方式再采样出N个点进行精细化学习。生成器额外引入了Z_shape和Z_appearance两种隐层编码,可以直接学习体态和表观特征,同时将两种特征解耦,做到分别预测。判别器主要负责比较采样得到的patch与预测生成的patch。训练过程中从感知域比较大的patch开始,然后逐步缩小。

Pi-gan[7]基于Graf做了改进。它使用基于周期激发函数的正弦表示网络来加强神经辐射场中的位置编码效果,以生成更宽视角下的重建结果。相比较于graf,使用siren替代了位置编码,使用基于style-gan的映射网络使得形态和表观特征只依赖于给定输入。同时使用阶段训练以逐步收敛模型。

ShadeGAN[8]在pi-gan的基础上考虑了光照对于三维重建的影响,目的是去进一步解决三维重构场景下形态和颜色相互影响导致重建效果不佳的问题。作者认为,一个好的三维重建模型,在不同的光照条件下去渲染,形态应该相差不大。

同时,作者提出了表面追踪的方法来提升体素渲染的速度。相比于pi-gan的唯一不同是,作者引入了基于光照的限制,同时输出不再直接输出颜色,而是输出经过映射前的输入,目的是希望引入光照来进行后处理,具体处理方法为Lambertian shading。

ShadeGAN 结构图,摘录自论文原文

CIPS-3D[9]基于pi-gan进一步改进。作者发现现有方法(比如pi-gan)通过编辑浅层向量来隐性控制角度,然而并不能实现基于高分辨率下任意渲染角度的重建;同时在训练不完全的情况下会出现镜像对称的次优解。因此,作者提出调制SIREN模块来去处理生成的不同图像的尺度对于重建的影响。

同时,作者发现使用方向作为输入会导致不同维度成像不一致,因而采用输入点的方式来替代。另外,作者发现了生成结果有概率出现镜像对称问题。为了处理这个问题,使用隐式神经表达网络来把隐式特征化为对应的RGB像素,同时追加了一个附加判别器,以处理镜像对称问题。实验证明这种处理方式起到了很好的效果。

CIPS-3D 结构图,摘录自论文原文

聊完了相关例子之后,我们最后再来比较一下NERF自己的优点和劣势。

优势

  • 用gan去解决数据稀缺的问题,同时sota版本下只需要单一图像输入,便可以进行多角度重现。相比较上述两种方式,整体方案成本较低。

  • 神经辐射场本身使用隐性学习方式学习三维特征,相比较于基于三维模板的方式,无对称性要求,使用范围可拓展至非刚体类目,泛化能力更强。

  • 具有可解释性,生成的浅层特征经过加工后可以用来可视化学到的三维重建模板。

缺点

  • 只能拟合单轴下的单图像重建。

  • 无法基于给定图像重建。

 总结

这篇文章为大家重点介绍了一下单图像三维重建的一些最近顶会,并且分成了三组主流路径。大家可以对比一下看看,如果有哪里说的不清楚或者欠妥,欢迎在评论区讨论。感谢各位看官花时间阅读本文。

PS: 本文引用的所有论文都是已开源代码的,大家搜索论文标题就可以找到对应代

码。

参考文献:

[1] Biggs, B., Boyne, O., Charles, J., Fitzgibbon, A., and Cipolla, R., “Who Left the Dogs Out? 3D Animal Reconstruction with Expectation Maximization in the Loop”, arXiv e-prints, 2020.

[2] Xu, X. and Change Loy, C., “3D Human Texture Estimation from a Single Image with Transformers”, arXiv e-prints, 2021.

[3] Kanazawa, A., Tulsiani, S., Efros, A. A., and Malik, J., “Learning Category-Specific Mesh Reconstruction from Image Collections”, arXiv e-prints, 2018.

[4] Li, X., “Self-supervised Single-view 3D Reconstruction via Semantic Consistency”, arXiv e-prints, 2020.

[5] T. Hu, L. Wang, X. Xu, S. Liu and J. Jia, "Self-Supervised 3D Mesh Reconstruction from Single Images," 2021 IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR), 2021, pp. 5998-6007, doi: 10.1109/CVPR46437.2021.00594.

[6] Schwarz, K., Liao, Y., Niemeyer, M., and Geiger, A., “GRAF: Generative Radiance Fields for 3D-Aware Image Synthesis”, arXiv e-prints, 2020.

[7] Chan, E. R., Monteiro, M., Kellnhofer, P., Wu, J., and Wetzstein, G., “pi-GAN: Periodic Implicit Generative Adversarial Networks for 3D-Aware Image Synthesis”,arXiv e-prints, 2020.

[8] Pan, X., Xu, X., Change Loy, C., Theobalt, C., and Dai, B., “A Shading-Guided Generative Implicit Model for Shape-Accurate 3D-Aware Image Synthesis”, arXiv e-prints, 2021.

[9] Zhou, P., Xie, L., Ni, B., and Tian, Q., “CIPS-3D: A 3D-Aware Generator of GANs Based on Conditionally-Independent Pixel Synthesis”, arXiv e-prints, 2021.

[10] Kato, H., Ushiku, Y., and Harada, T., “Neural 3D Mesh Renderer”, arXiv e-prints, 2017.

[11] Mildenhall, B., Srinivasan, P. P., Tancik, M., Barron, J. T., Ramamoorthi, R., and Ng, R., “NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis”, arXiv e-prints, 2020.

[12] Chen, W., “Learning to Predict 3D Objects with an Interpolation-based Differentiable Renderer”, arXiv e-prints, 2019.

[13] Liu, S., Chen, W., Li, T., and Li, H., “Soft Rasterizer: Differentiable Rendering for Unsupervised Single-View Mesh Reconstruction”,arXiv e-prints, 2019.

本文仅做学术分享,如有侵权,请联系删文。

干货下载与学习

后台回复:巴塞罗自治大学课件,即可下载国外大学沉淀数年3D Vison精品课件

后台回复:计算机视觉书籍,即可下载3D视觉领域经典书籍pdf

后台回复:3D视觉课程,即可学习3D视觉领域精品课程

3D视觉精品课程推荐:

1.面向自动驾驶领域的多传感器数据融合技术

2.面向自动驾驶领域的3D点云目标检测全栈学习路线!(单模态+多模态/数据+代码)
3.彻底搞透视觉三维重建:原理剖析、代码讲解、及优化改进
4.国内首个面向工业级实战的点云处理课程
5.激光-视觉-IMU-GPS融合SLAM算法梳理和代码讲解
6.彻底搞懂视觉-惯性SLAM:基于VINS-Fusion正式开课啦
7.彻底搞懂基于LOAM框架的3D激光SLAM: 源码剖析到算法优化
8.彻底剖析室内、室外激光SLAM关键算法原理、代码和实战(cartographer+LOAM +LIO-SAM)

9.从零搭建一套结构光3D重建系统[理论+源码+实践]

10.单目深度估计方法:算法梳理与代码实现

11.自动驾驶中的深度学习模型部署实战

12.相机模型与标定(单目+双目+鱼眼)

13.重磅!四旋翼飞行器:算法与实战

14.ROS2从入门到精通:理论与实战

重磅!3DCVer-学术论文写作投稿 交流群已成立

扫码添加小助手微信,可申请加入3D视觉工坊-学术论文写作与投稿 微信交流群,旨在交流顶会、顶刊、SCI、EI等写作与投稿事宜。

同时也可申请加入我们的细分方向交流群,目前主要有3D视觉CV&深度学习SLAM三维重建点云后处理自动驾驶、多传感器融合、CV入门、三维测量、VR/AR、3D人脸识别、医疗影像、缺陷检测、行人重识别、目标跟踪、视觉产品落地、视觉竞赛、车牌识别、硬件选型、学术交流、求职交流、ORB-SLAM系列源码交流、深度估计等微信群。

一定要备注:研究方向+学校/公司+昵称,例如:”3D视觉 + 上海交大 + 静静“。请按照格式备注,可快速被通过且邀请进群。原创投稿也请联系。

▲长按加微信群或投稿

▲长按关注公众号

3D视觉从入门到精通知识星球:针对3D视觉领域的视频课程(三维重建系列三维点云系列结构光系列手眼标定相机标定、激光/视觉SLAM、自动驾驶等)、知识点汇总、入门进阶学习路线、最新paper分享、疑问解答五个方面进行深耕,更有各类大厂的算法工程人员进行技术指导。与此同时,星球将联合知名企业发布3D视觉相关算法开发岗位以及项目对接信息,打造成集技术与就业为一体的铁杆粉丝聚集区,近5000星球成员为创造更好的AI世界共同进步,知识星球入口:

学习3D视觉核心技术,扫描查看介绍,3天内无条件退款

圈里有高质量教程资料、答疑解惑、助你高效解决问题

觉得有用,麻烦给个赞和在看~  

浅谈单图像三维重建算法相关推荐

  1. 2-路插入排序c语言算法,浅谈2路插入排序算法及其简单实现

    2路插入排序算法是在直接插入排序算法的基础上增加了一个辅助数组,其目的是减少排序过程中的移动次数,需要增加n个记录的辅助空间. 难点可能在于对取余的考虑吧,可以把辅助数组看成一个环状空间,这样就能更好 ...

  2. python算法程序_浅谈python常用程序算法

    一.冒泡排序: 1.冒泡排序是将无序的数字排列成从小到大的有序组合: 过程:对相邻的两个元素进行比较,对不符合要求的数据进行交换,最后达到数据有序的过程. 规律: 1.冒泡排序的趟数时固定的:n-1 ...

  3. 技术分享:浅谈滴滴派单算法

    浅谈滴滴派单算法 原创: 王犇 刘春阳 徐哲 滴滴技术 桔妹导读:说到滴滴的派单算法,大家可能感觉到既神秘又好奇,从出租车扬召到司机在滴滴平台抢单最后到平台派单,大家今天的出行体验已经发生了翻天覆地的 ...

  4. **浅谈三角测距激光雷达测距算法**

    浅谈三角测距激光雷达测距算法 此篇文章主要对我这半年以来对激光雷达光斑定位算法上一些粗浅的见解,三角测距的基本原理在这里就不做基本的叙述,百度一下都有.本文主要对三角法激光雷达比较重要和比较难以匹配的 ...

  5. 浅谈网络流的基本算法

    引言 过去听起来高深莫测的网络流算法,现在已飞入寻常百姓家了,对于每一个OIER,网络流是一个神圣的东西(个人见解),但神圣的同时,它并不是那样抽象,最形象的模型就是水流,从长江源点无限的向外流水,而 ...

  6. 浅谈:斐波那契搜索算法(Fibonacci search)

    一:有趣的背景 ​ 谈到斐波那契查找算法,总是有一个神奇的数字与之紧密相连--黄金分割数(0.618).黄金分割数被公认为最具有审美意义的比例数字,这个数值的作用不仅仅体现在诸如绘画.雕塑.音乐.建筑 ...

  7. 浅谈游戏自动寻路A*算法

    寻路是游戏中非常重要的一个元素,如何找到一条最短的路径是程序需要设计的算法,现在最为流行的寻路算法是A*算法.A*算法与状态空间搜索结合的相当紧密. 状态空间搜索,就是将问题求解的过程表现为从初始状态 ...

  8. 浅谈分布式存储系统数据分布算法

    目录 前言 指标 演进 应用案例 前言 分布式存储系统面临着的首要问题,就是如何将大量的数据分布在不同的存储节点上.无论上层接口是 KV存储.对象存储.块存储.亦或是列存储,在这个问题上大体是一致的. ...

  9. 浅谈协同过滤推荐算法

    在现今的推荐技术和算法中,最被大家广泛认可和采用的就是基于协同过滤的推荐方法.本文将带你深入了解协同过滤的秘密. 1 什么是协同过滤 协同过滤是利用集体智慧的一个典型方法.要理解什么是协同过滤 (Co ...

最新文章

  1. 那些巨头公司的前端面试都喜欢问些什么?
  2. 菜鸟教程 php跨域,PHP Ajax 跨域问题最佳解决方案
  3. 死磕 java集合之TreeMap源码分析(一)——红黑树全解析
  4. golang 简单web服务
  5. 数字图像处理实验(1):PROJECT 02-01, Image Printing Program Based on Halftoning
  6. 一看就懂的极简MVVM
  7. group by很多字段是不是会很慢_面试官:数据量很大,分页查询很慢,有什么优化方案?...
  8. android关键应用程序,安卓开发:Android应用程序的四个关键点
  9. PowerDesigner 手记
  10. mysqlreport
  11. Supervisord管理
  12. AtCoder Grand Contest 018 A
  13. 「JCVI教程」使用JCVI进行基因组共线性分析(上)
  14. win10计算机联接多个网络,win10两台电脑连接局域网的详细操作教程
  15. 地质地貌卫星影像集锦(一 典型地貌篇)
  16. 自然语言处理系列十七》中文分词》分词工具实战》Python的Jieba分词
  17. 风决定要走,云如何挽留!程序员朋友离职有感
  18. putty下载链接提供
  19. 如何让tomcat告别频繁重启
  20. WPF学习开发客户端软件-任务助手(已上传源码)

热门文章

  1. 【lombok】使用lombok注解,在代码编写过程中可以调用到get/set方法,但是在编译的时候无法通过,提示找不到get/set方法...
  2. JS怎么刷新当前页面
  3. JavaScript学习--闭包
  4. Windows下一键搭建redmine
  5. VRRP和单臂路由的综合运用
  6. Scene Player初始版本完成
  7. 【原】开源——基于文件驱动的站点开发
  8. OAuth 2 实现单点登录,通俗易懂!
  9. 全局负载均衡与CDN内容分发
  10. 环形链表找入口,真的太妙了