作者: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. 结合生活,剖析《生产者消费者模型》-java多线程(一)

    博客园的园友们好,看博客园上各位大佬的文章,已陪伴了我程序员职业的三年, 如今自己同样希望能把自己从小白到菜鸟的成长过程分享给大家.不定期更新!!! 首先我本人智商不高,理解问题十分吃力,完全不属于天 ...

  2. 图像配准:从SIFT到深度学习

      图像配准(Image Registration)是计算机视觉中的基本步骤.在本文中,我们首先介绍基于OpenCV的方法,然后介绍深度学习的方法. 什么是图像配准 图像配准就是找到一幅图像像素到另一 ...

  3. 【Pytest04】全网最全最新的Pytest框架fixture应用篇(2)

    一.Fixture参数之params参数可实现参数化:(可以为list和tuple,或者字典列表,字典元祖等) 实例如下: import pytest def read_yaml(): '] @pyt ...

  4. Spring - 事务管理概述

      什么是事务管理? 第一个问题:什么是事务? 事务一般是相对数据库而言的,对于数据库一次操作就属于一个事务, 一次操作可以是几句 SQL 语句,也可以是若干行 JDBC 的 Java 语句.事务既然 ...

  5. AQS源码解析

    文大篇幅引用自HongJie大佬的一行一行源码分析清楚AbstractQueuedSynchronizer,这只是一篇简单的个人整理思路和总结(倒垃圾),如果觉得有些难懂的话,不要犹豫也不要疑惑,很明 ...

  6. bitset 相关题目

     std::bitset 的语法就不搬运了, 直接看题吧   #515. 「LibreOJ β Round #2」贪心只能过样例 题意: 给出 n 个数 \(x_i\), 每个数的取值范围为 \([a ...

  7. 关于 JavaScript 的 精度丢失 与 近似舍入

    一.背景 最近做 dashborad 图表时,涉及计算小数且四舍五入精确到 N 位.后发现 js 算出来的结果跟我预想的不一样,看来这里面并不简单-- 二.JS 与 精度 1.精度处理 首先明确两点: ...

  8. 牛客寒假基础集训营 | Day1 D-hanayo和米饭

    D-hanayo和米饭 题目描述 hanayo很喜欢吃米饭. 有一天,她拿出了 nnnnnnnnn 个碗,第一个碗装了 111111111 粒米饭,第二个碗装了 222222222 粒米饭,以此类推, ...

  9. Base64编码与解码原理

    Base64编码是使用64个可打印ASCII字符(A-Z.a-z.0-9.+./)将任意字节序列数据编码成ASCII字符串,另有“=”符号用作后缀用途. base64索引表 base64编码与解码的基 ...

  10. PTA数据结构与算法题目集(中文) 7-37 模拟EXCEL排序 (25 分)

    PTA数据结构与算法题目集(中文)  7-37 模拟EXCEL排序 (25 分) 7-37 模拟EXCEL排序 (25 分)   Excel可以对一组纪录按任意指定列排序.现请编写程序实现类似功能. ...