作者:Longway
Date:2020-04-25
来源:单图像三维重建、2D到3D风格迁移和3D DeepDream

项目网址:http://hiroharu-kato.com/projects_en/neural_renderer.html

代码网址:https://github.com/hiroharu-kato/neural_renderer

论文名称:Neural 3D Mesh Renderer(CVPR2018)

概述

对于二维图像背后的三维世界建模,哪一种三维表示最合适?现在常见的表示方法有点云、体素和网格,其中多边形网格具有良好的紧致性和几何性质。但是使用神经网络直接由多边形网格生成图像比较困难,因为光栅化的过程阻止了反向传播。因此,作者提出了一个近似的梯度栅格化,使渲染集成到神经网络。使用这个渲染器,可以执行带有轮廓图像监督的单图像三维网格重建,并且该系统比现有的基于体素的方法更好。此外,作者还首次在2D监督下执行基于梯度的3D网格编辑操作,如2D到3D风格迁移和3D DeepDream。

简介

从二维图像理解三维世界是计算机视觉的基本问题之一。人类在大脑中使用视网膜上的图像来模拟3D世界,机器也可以通过在2D图像背后显式地建模3D世界来更智能地工作。从3D世界生成图像的过程叫做渲染,这在计算机视觉里面非常重要。哪种3D表示方法是最适合建模3D世界?通常有体素、点云和多边形网格。体素难以生成高质量的体素,因为他们是在三维空间有规律地进行采样,并且记忆效率比较低。点云存在纹理和照明难以应用的问题,因为点云没有表面。多边形网格由一系列顶点和表面组成,因此它们是可伸缩的,并且有面,进而作者采用了这种方式。

使用网格这种表示方式有两个好处,第一个是表示三维模型时,需要的参数少,模型和数据集也相应比较小。第二个就是它适合几何变换。对象的旋转、平移和缩放由顶点上的简单操作表示。这篇文章提出了两个应用,如下图所示。第一个是单图像三维网格重建,第二个是基于梯度的3D网格编辑,包括风格迁移和DeepDream。

这篇论文主要有三个方面的贡献:

1.提出了一个近似的梯度网格渲染,使渲染集成到神经网络;

2.实现了从单图像实现三维网格重建,并且没有3D监督;

3.实现了基于梯度的三维网格编辑操作,例如风格迁移和3D DeepDream。

相关工作

1.神经网络中的三维表示:三维表示有很多方法,比如前面提到的体素、点云等,但是它们都有一定的不足,或者不适合三维重建。其中,多边形网格具有存储效率高、适用于几何变换且具有曲面等特点,因此它实际上是计算机图形学(CG)和计算机辅助设计(CAD)中的标准形式。然而,由于多边形网格的数据结构是一个复杂的图形,很难集成到神经网络中。

2.单图片三维重建:从图像中估计三维结构是计算机视觉中的一个传统问题,大多数方法使用真实的三维模型来学习2D到3D的映射函数,有些作品通过深度预测重建三维结构,有些则直接预测三维形状。实际上,无需3D监督即可实现三维预测,只需要待重建物体的轮廓即可。

3.通过梯度下降编辑图像:利用可微特征提取器和损失函数,通过反向传播和梯度下降,可以生成损失最小的图像,DeepDream就是这样一个例子。初始图像被反复更新,使得其图像特征的大小变得更大,通过这个过程,像狗和汽车这样的物体逐渐出现在图像中,图像风格转换可能是最熟悉和最实际的例子了,给定内容图像和样式图像,将生成具有指定内容和样式的图像。

该渲染器提供图像相对于网格顶点和纹理的渐变。因此,利用二维图像的损失函数就可以实现网格的DeepDream和风格转换。

渲染的近似梯度

1.渲染通道及其派生:一个3D网格由一组顶点和面组成,每个顶点No是一个三维向量,表示这个顶点在3D物体空间中的坐标,每个面F是由三个顶点所围成的三角形。为了生成这个对象,物体空间中的顶点No被转化为屏幕空间中的顶点Ns,这个顶点Ns是一个二维向量。

通过采样从屏幕空间的顶点Ns和面F生成图像,这个过程叫做光栅化。下图说明了单个图像的光栅化:

Vi是面的一个顶点,Ij是像素Pj的颜色值。Xi现在的位置是x0。当Xi向右移动,面的边与Pj的中心碰撞时,X1是Xi的位置。当Xi=X1时,Ij变成Iij

2.单面光栅化:这一部分主要讲解了当像素点在里面或者外面时,如何定义偏导函数。涉及到的公式比较多,后面将以视频的方式呈现,如果想要提前了解的可以联系我。

3.多面光栅化:如果有多个面,光栅化器只在每个像素处绘制最前面的面,这与标准方法相同。在向后传递的过程中,首先检查是否绘制了交叉点Iij、Iaij和Ibij,如果它们被不包括Vi的表面遮挡,则不流动梯度。

4.纹理:纹理可以映射到面上。在这个项目中,每个面都有自己的大小为St×St×St的纹理图像。使用质心坐标系确定纹理空间中对应于三角形{V1,V2,V3}上位置P的坐标。换句话说,如果P表示为P=W1V1+W2V2+W3V3,则让(w1,w2,w3)成为纹理空间中的相应坐标。

5.照明:照明系统可以直接应用于网格上,在这项工作中,使用了简单的环境光和无阴影的平行光。设la和ld分别为环境光和平行光的强度,nd为指示平行光方向的单位矢量,nj为面的法向矢量。然后,将表面像素Ilj的修改颜色定义为:

神经渲染器的应用

1.单图像三维重建:基于体素的方法能够直接生成一个3D模型,但是对于网格来说比较困难。因此,在这项工作中,作者不是从头生成网格,而是将预定义网格变形以生成新网格。具体地说,使用一个有642个顶点的各向同性球体,并使用局部偏置向量Bi和全局偏置向量C将每个顶点Vi变成Vi+Bi+C的形式。分别定义轮廓损失Lsl和平滑度损失Lsm如下所示:

轮廓损失中的S表示的是二进制mask,平滑度损失中的θ表示相邻两个面的夹角度数,两个损失函数分别保证了渲染后的效果和模型的光滑。

2.基于梯度的三维网格编辑:在这项工作中,基于其渲染图像R来优化由顶点Vi、面Fi和纹理Ti组成的3D网格m,而不是生成图像进行编辑。

2D到3D的风格迁移:在本节中,作者提出了一种将图像Xs的样式传输到网格Mc上的方法。对于二维图像,风格迁移是通过同时最小化内容损失和风格损失来实现的。在这里,作者把内容指定为三维网格Mc。为了使生成的网格形状与Mc相似,假设两个网格的顶点到面的关系相同,我们重新定义了如下内容损失函数:

作者使用了与2D应用中相同的风格损失,如下所示:

同时使用正则化器来降低噪声,设P表示图像R中所有相邻像素对的一组颜色:

3D DeepDream:设f(x)为输出图像x特征图的函数。对于2D图像来说,通过从x=x0开始的梯度下降最小化-|f(x)|2F来实现图像x0的DeepDream。在类似的过程中,将-|f(R(m,φ))|2F相对于Vi和Ti最小化来实现DeepDream。

结果展示

从单个图像重建三维网格。第一列:输入图像;第二至第四列:网格重建;第五至第七列:体素重建。
通过体素IoU测量重建精度,越高越好。可以看到基于网格的方法在13个类别中有10个类别的性能优于基于体素的方法。
网格在风格转换和DeepDream中的初始状态
2D到3D风格迁移。风格图片有汤姆森5号(黄色日落)、巴别塔、尖叫和毕加索肖像
3D网格的DeepDream

往期干货资源:

汇总 | 国内最全的3D视觉学习资源,涉及计算机视觉、SLAM、三维重建、点云处理、姿态估计、深度估计、3D检测、自动驾驶、深度学习(3D+2D)、图像处理、立体视觉、结构光等方向!

汇总 | 3D目标检测(基于点云、双目、单目)

汇总 | 6D姿态估计算法(基于点云、单目、投票方式)

汇总 | 三维重建算法实战(单目重建、立体视觉、多视图几何)

汇总 | 3D点云后处理算法(匹配、检索、滤波、识别)

汇总 | SLAM算法(视觉里程计、后端优化、回环检测)

汇总 | 深度学习&自动驾驶前沿算法研究(检测、分割、多传感器融合)

汇总 | 相机标定算法

汇总 | 事件相机原理

汇总 | 结构光经典算法

汇总 | 缺陷检测常用算法与实战技巧

怎么把3d风格的图变成2d_单图像三维重建、2D到3D风格迁移和3D DeepDream相关推荐

  1. 众多碎石3d材质贴图素材一键即可获取

    天天各大网站找碎石3d材质贴图素材?最后空手而归?今天为大家推荐碎石3d材质贴图素材网站,质量上乘适合资源慌缺的你,话不多说准备开始收藏吧! 因为小编的工作原因,经常会使用到碎石3d材质贴图素材,所以 ...

  2. JFreeChart在Struts2中实现3D饼状图统计

    在Struts2中,用JFreeChart实现3D饼状图统计 前段时间学习了一下JFreeChart,现在来整理一下自己所作的实例. 下面分别用两种方式来实现: 一种是以java应用程序的方式,一种是 ...

  3. 三维球体换算到二维_单图像三维重建、2D到3D风格迁移和3D DeepDream

    项目网址:http://hiroharu-kato.com/projects_en/neural_renderer.html 代码网址:https://github.com/hiroharu-kato ...

  4. Python使用matplotlib进行3D可视化分析:3d柱状图、3d直方图、3d线框图、3d曲面图、3d翼面图(莫比乌斯环)

    Python使用matplotlib进行3D可视化分析:3d柱状图.3d直方图.3d线框图.3d曲面图.3d翼面图(莫比乌斯环) 目录

  5. 利用Python绘制 3D 体素色温图

    简 介: 测试了Matplotlib中的 体素绘制函数 voxels() ,但是无论是在 AI Studio中执行,还是直接在本地执行,都会出了错误.也就是无法通过 gca(projection='3 ...

  6. Python的可视化包 – Matplotlib 2D图表(点图和线图,.柱状或饼状类型的图),3D图表(曲面图,散点图和柱状图)...

    Python的可视化包 – Matplotlib Matplotlib是Python中最常用的可视化工具之一, 可以非常方便地创建海量类型地2D图表和一些基本的3D图表.Matplotlib最早是为了 ...

  7. 经纬度画轨迹图_实战Python制作炫酷的个人3D动态足迹图

    今天给大家带来一篇3D个人足迹图制作教程,先看看成果图: 下面给大家详细介绍一下制作步骤: 一.准备足迹城市数据 因为本次用pyecharts画3D足迹图的数据接口是列表形式: 所以我们要把城市的经纬 ...

  8. 【uniapp】3d轮播图/堆叠轮播图/层叠轮播图

    前言 uniapp 3d轮播图 uniapp实现3D轮播图 从uniapp插件市场下载插件:https://ext.dcloud.net.cn/plugin?id=243#detail 操作步骤 导入 ...

  9. Jpgraph php怎么变异,php使用Jpgraph绘制3D饼状图的方法

    此文实例介绍了php使用Jpgraph绘制3D饼状图的方法.分享给大伙供大家参考.具体实现方法如下: include ("src/jpgraph.php"); include (& ...

最新文章

  1. tomcat7 内存溢出 java.lang.OutOfMemoryError: Java heap space
  2. Java基础:成员变量的继承与覆盖
  3. PHP+MySQL登录注册,完整版,详细注释
  4. boost::mpl模块实现list_c相关的测试程序
  5. jzoj4016-圈地为王【状压,bfs,几何】
  6. 最新70佳单页网站设计案例欣赏(上篇)
  7. 【maven】新建一个maven项目的基本配置
  8. 解析Integer比较
  9. js 所有img隐藏_Handtrack.js 开源:3行JS代码搞定手部动作跟踪
  10. skyline 系列 1 - 简介、下载
  11. BAT批处理脚本案例--创建快捷方式
  12. CoreText(五):省略号
  13. vb html ie弹出窗口,vb操作ie浏览器
  14. 质量小议19 -- 熵
  15. 2天获订2万台,明明如此普通,自游家NV为何如此自信?
  16. 2022年上海市安全员C证考试内容及上海市安全员C证考试技巧
  17. Python获取所有股票代码以及股票历史成交数据分析(二)
  18. python 字符串方法总结
  19. matlab 画阻尼振荡信号及其包络线
  20. 神级编辑器 Vim 使用-基础篇

热门文章

  1. 利用Pin分析程序的动态行为特征
  2. 【个人笔记】OpenCV4 C++ 图像处理与视频分析 04课
  3. 人生苦短 须用Kotlin
  4. Linux基于v4l2的视频采集(可用)
  5. android jni socket
  6. android之日志库logger
  7. 深度学习自学(三十六):ABCNet实时自适应贝塞尔曲线场景文字检测识别网络
  8. LNMP环境SVN钩子脚本的使用
  9. apereo cas mysql_史上最详细的 Apereo CAS 5.3开发教程:二、Apereo CAS 5.3 Server环境搭建,登录名,密码从数据库中获取...
  10. python中的类及self详解_python中的self详解与对照与网站分享