作者:Longway
Date:2020-04-25
代码网址: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

 

单图像三维重建、2D到3D风格迁移和3D DeepDream的更多相关文章

  1. Distill详述「可微图像参数化」:神经网络可视化和风格迁移利器!

    近日,期刊平台 Distill 发布了谷歌研究人员的一篇文章,介绍一个适用于神经网络可视化和风格迁移的强大工具:可微图像参数化.这篇文章从多个方面介绍了该工具. 图像分类神经网络拥有卓越的图像生成能力 ...

  2. Keras实现风格迁移

    风格迁移 风格迁移算法经历多次定义和更新,现在应用在许多智能手机APP上. 风格迁移在保留目标图片内容的基础上,将图片风格引用在目标图片上. 风格本质上是指在各种空间尺度上图像中的纹理,颜色和视觉图案 ...

  3. ng-深度学习-课程笔记-14: 人脸识别和风格迁移(Week4)

    1 什么是人脸识别( what is face recognition ) 在相关文献中经常会提到人脸验证(verification)和人脸识别(recognition). verification就 ...

  4. 2D图形如何运动模拟出3D效果

    一.先看看实现效果图 (左边的2d图片如何运动出右边3d的效果)                                      引言: 对于这个题目,真的很尴尬,不知道取啥,就想了这个题目 ...

  5. 图像风格迁移(Pytorch)

    图像风格迁移 最后要生成的图片是怎样的是难以想象的,所以朴素的监督学习方法可能不会生效, Content Loss 根据输入图片和输出图片的像素差别可以比较损失 \(l_{content} = \fr ...

  6. keras图像风格迁移

    风格迁移: 在内容上尽量与基准图像保持一致,在风格上尽量与风格图像保持一致. 1. 使用预训练的VGG19网络提取特征 2. 损失函数之一是"内容损失"(content loss) ...

  7. Gram格拉姆矩阵在风格迁移中的应用

    Gram定义 n维欧式空间中任意k个向量之间两两的内积所组成的矩阵,称为这k个向量的格拉姆矩阵(Gram matrix) 根据定义可以看到,每个Gram矩阵背后都有一组向量,Gram矩阵就是由这一组向 ...

  8. 『cs231n』通过代码理解风格迁移

    『cs231n』卷积神经网络的可视化应用 文件目录 vgg16.py import os import numpy as np import tensorflow as tf from downloa ...

  9. fast neural style transfer图像风格迁移基于tensorflow实现

    引自:深度学习实践:使用Tensorflow实现快速风格迁移 一.风格迁移简介 风格迁移(Style Transfer)是深度学习众多应用中非常有趣的一种,如图,我们可以使用这种方法把一张图片的风格“ ...

随机推荐

  1. 带权并查集 HDU - 3047

    题意: 一圈座位有n个,给出m组序号之间的关系,比如,1 2 150 代表2号坐在1号位置序号+150,看m组数据有多少组冲突的. 思路: 带权并查集模板. #include<stdio.h&g ...

  2. nginx使用手册+基本原理+优缺点

    一.nginx优点 1.反向代理 1.正向代理: 客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原 ...

  3. iOS 预渲染加速图像显示

    使用 UITableView 时,发现滚动时的性能还不错,但来回滚动时,第一次显示的图像不如再次显示的图像流畅,出现前会有稍许的停顿感. 于是猜想显示过的图像肯定是被缓存起来了,查了下文档后发现果然如 ...

  4. IE不支持sessionStorage问题

    IE8及以上版本是支持的,如果你的项目在IE8及以上打开报错: 那是因为:页面要放在服务器上才能有效!!!!!!!!!!!!!!!!!!!!!!!!

  5. Please enter a commit message to explain why this merge is necessary, # especially if it merges an updated upstream into a topic branch. # # Lines starting with '#' will be ignored, and an empty messa

    1.git提交的时候遇到: # Please enter the commit message for your changes. Lines starting with '#' will be ig ...

  6. 第一讲:Git分区,配置与日志

    前言 曾经听到过这样一句话:不会git就不要敲代码了.细细品味确实有其中的道理,可能是当事人代码被强行覆盖后的叹息吧! 因此,为了避免这种情况,接下来我们就一起来好好学习git的相关知识吧!不怕你不会 ...

  7. Go语言笔记(1)变量的定义与赋值

    变量的定义与赋值 在go笔记系列开始之前,我强烈建议大家使用Goland的IDM,配合vscode使用真的非常亲民. 1.go程序基本结构 首先,是go程序的基本结构,主要有package引入包.im ...

  8. Kylin 初入门 | 从下载安装到体验查询

    本文旨在为 Kylin 新手用户提供一份从下载安装到体验亚秒级查询的完整流程.文章分为两个部分,分别介绍了有 Hadoop 环境(基于 Hadoop 环境的安装)和没有 Hadoop 环境(从 Doc ...

  9. 部署MYSQL高可用集群

                                                  mysql-day08     部署MYSQL高可用集群 u 集群架构                   ...

  10. MyBatis(七):使用注解替代xml文件

    本文是按照狂神说的教学视频学习的笔记,强力推荐,教学深入浅出一遍就懂!b站搜索狂神说或点击下面链接 https://space.bilibili.com/95256449?spm_id_from=33 ...