AdaMPI:单图新视点合成

Single-View View Synthesis in the Wild with Learned Adaptive Multiplane Images, SIGGRAPH 2022.

Yuxuan Han, Ruicheng Wang and Jiaolong Yang

Project Page | Video | Paper

Multiplane Images(MPI)是一种场景表示方法,其在先前的工作中已经证明具有出色的表示能力。MPI通常由多个平面组成,每个平面都具有不同的颜色、密度和深度值。以前的方法通常将平面设置在固定位置,并通过卷积神经网络(CNN)预测纹理。然而,MPI是一种高度过参数化的表示方法,对于神经网络来说很难学习,因为需要大量输出通道。因此,当平面数量增加时,性能甚至可能会降低。

该网络旨在从输入图像和其深度图中预测N个平面,每个平面都有颜色通道ci、密度通道σi和深度di。该网络由两个子网络组成:平面调整网络Fd和颜色预测网络Fr。首先,使用现成的单目深度估计网络[Ranftl et al. 2021]获取深度图。然后,将Fd应用于推断平面深度{di}N_i=1,并将Fr应用于预测每个di处的颜色和密度{ci, σi}N_i=1。因此,该网络可以生成多平面图像,其中每个平面都具有不同的颜色、密度和深度值。

Figure 2显示了使用该方法在每个平面上预测的颜色掩码。该图中展示了16个平面,每个平面都有不同的颜色和密度值。这些颜色掩码是通过网络预测得出的,用于生成多平面图像。

该方法包括两个子网络:平面深度调整网络和深度感知颜色预测网络。 平面深度调整网络由三个主要部分组成:RGBD上下文特征提取器、平面位置调整器和注意力机制。该网络的输入是RGBD图像,其中包含彩色图像和深度图像。首先,RGBD上下文特征提取器从输入中提取特征,并将其传递给平面位置调整器。然后,平面位置调整器使用这些特征来推断每个平面的深度,并将其与初始估计值进行比较。最后,注意力机制用于确定哪些区域需要更多的细节,并在这些区域上进行更精细的调整。 深度感知颜色预测网络由两个主要部分组成:颜色掩码生成器和MPI合成器。该网络的输入是RGBD图像和一个表示目标视角的向量。首先,颜色掩码生成器使用输入来预测每个平面处的颜色掩码。然后,MPI合成器使用这些颜色掩码以及每个平面处的深度值来合成MPI表示,并将其渲染为新视点图片。 总体而言,该方法采用了一种端到端的学习方法,通过联合训练两个子网络来实现多平面图像的生成。

训练方法:

Fig. 3是有关视角合成训练对生成的示意图。该图显示了如何在训练过程中生成立体图像对。首先,从深度图中采样一个图像Is,并生成一个合理的内部参数K和相机运动(R,t)。然后,渲染目标彩色图像It和深度图Dt,并应用已经训练好的修补程序G来填充空洞,从而产生̄It和̄Dt。为了确保网络接收到来自真实图像分布的监督信号,我们将(̄It,̄Dt)作为F的输入,并将(Is,Ds)作为目标视角的地面真实值。

3D-Machine-Learning相关资源集合

项目地址:https://github.com/timzhang642/3D-Machine-Learning

3D Machine Learning

In recent years, tremendous amount of progress is being made in the field of 3D Machine Learning, which is an interdisciplinary field that fuses computer vision, computer graphics and machine learning. This repo is derived from my study notes and will be used as a place for triaging new research papers.

I’ll use the following icons to differentiate 3D representations:

  • 📷 Multi-view Images
  • 👾 Volumetric
  • 🎲 Point Cloud
  • 💎 Polygonal Mesh
  • 💊 Primitive-based

To find related papers and their relationships, check out Connected Papers, which provides a neat way to visualize the academic field in a graph representation.

Get Involved

To contribute to this Repo, you may add content through pull requests or open an issue to let me know.

⭐ ⭐ ⭐ ⭐ ⭐ ⭐ ⭐ ⭐ ⭐ ⭐ ⭐ ⭐
We have also created a Slack workplace for people around the globe to ask questions, share knowledge and facilitate collaborations. Together, I’m sure we can advance this field as a collaborative effort. Join the community with this link.
⭐ ⭐ ⭐ ⭐ ⭐ ⭐ ⭐ ⭐ ⭐ ⭐ ⭐ ⭐

Table of Contents

Available Courses

Stanford CS231A: Computer Vision-From 3D Reconstruction to Recognition (Winter 2018)

UCSD CSE291-I00: Machine Learning for 3D Data (Winter 2018)

Stanford CS468: Machine Learning for 3D Data (Spring 2017)

MIT 6.838: Shape Analysis (Spring 2017)

Princeton COS 526: Advanced Computer Graphics (Fall 2010)

Princeton CS597: Geometric Modeling and Analysis (Fall 2003)

Geometric Deep Learning

Paper Collection for 3D Understanding

CreativeAI: Deep Learning for Graphics

3d-photography-papers

3D机器学习相关合集:https://github.com/timzhang642/3D-Machine-Learning

A paper list of 3D photography and cinemagraph.

This list is non-exhaustive. Feel free to pull requests or create issues to add papers.

Following this repo, I use some icons to (imprecisely) differentiate the 3D representations:

  • 🍃 Layered Depth Image
  • 💎 Mesh
  • ✈️ Multiplane Images
  • 🚕 Nerf
  • ☁️ Point Cloud
  • 👾 Voxel

3D Photography from a Single Image

Here I include the papers for novel view synthesis with a single input image based on 3D geometry.

Binocular-Input Novel View Synthesis

Not a complete list.

Landscape Animation

Animating landscape: running water, moving clouds, etc.

Some Other Papers

Some other interesting papers for novel view synthesis or cinemagraph.

3D Photography –新视点合成

[CVPR 2020] 3D Photography using Context-aware Layered Depth Inpainting

Code地址: https://github.com/vt-vl-lab/3d-photo-inpainting

项目主页: https://shihmengli.github.io/3D-Photo-Inpainting/

本文作者来自弗吉尼亚理工学院、国立清华大学和 Facebook,作者提出了一种从 单张 RGB-D 图像生成 3D 照相 的方法,效果炫酷、惊艳,目前代码已开源。

3D相片的生成主要基于重建和渲染技术,传统的方法需要基线较长的精密的多视角图片捕捉设备或者其他特殊装置,如 Lytro Immerge 和 Facebook Manifold camera。最近有更多的工作尝试从智能相机来生成3D相片,如 Facebook 3D Photos 只需用双摄智能手机拍摄图片,生成RGB-D图像 (彩色图+深度图) 来制作3D相片。

本文同样考虑如何从输入的 RGB-D 图像来合成新的视角以生成3D照片。文章方法对深度图的质量要求并不高,只需要深度不连续处在彩色图和深度图中是合理对齐的即可。深度图可以从 双摄相机通过立体视觉的方式计算 得到,也可以借助 深度学习的方法从单张图片估计 得到,因此应用到智能手机完全没有问题,作者也对这两种来源的深度图进行了测试。

!!!重要:“ 对深度图的质量要求并不高,只需要深度不连续处在彩色图和深度图中是合理对齐的即可

Method

Layered Depth Image

文章方法输入一张 RGB-D 图像,输出分层的深度图像 (Layered Depth Image, LDI),在原始图像中被遮挡的部位填补了颜色和深度。

LDI 类似普通的图像,区别在于每个像素点可以容纳零个或多个像素值,每个 LDI 像素存储一个颜色和一个深度值。与原始论文介绍的 LDI 不同,本文作者显式地表示了像素的局部连通性:每个像素在左右上下四个方向上都存储了零个或最多一个直接相邻的像素指针。LDI 像素与普通图像一样在光滑区域内是四连通的,但是在深度不连续处没有邻接像素。

LDI 是一种对3D相片非常有用的表达,主要在三个方面

  1. 其可以处理任意数量的深度层,可以根据需要适应深度复杂的情况;
  2. 其表达是稀疏的,具有更高的内存和存储效率;
  3. 其可以转换为轻量级的纹理网格表示,直接用于快速渲染。

Method Overview

给定输入的 RGB-D 图像,首先初始化一个单层的四连通的简单 LDI。然后进入预处理阶段,检测深度不连续像素点,并将其分组成简单的相连的深度边。文章算法反复选择深度边来进行修复,先断开边缘上的 LDI 像素,仅考虑边缘处的背景像素进行修复,从边缘的 “已知” 侧提取局部语境区域 (context region),并在 “未知” 侧生成一个合成区域 (synthesis region),合成的区域是一个包含新像素的连续2D区域。作者使用基于学习的方法根据给定的上下文生成其颜色和深度值。修复完成后再将合成的像素合并回 LDI。整个方法以这种方式反复进行,直到所有的深度边缘都经过处理。

Image Preprocessing

初始化阶段首先将输入的 RGB-D 图的深度通道归一化到 0-1 之间,并对深度图进行双边中值滤波,以使得边缘更加明显,再基于此图片生成初始 LDI。然后再根据给定阈值判断相邻像素的视差,找到深度不连续像素,并经过一些简化、处理得到最终的深度不连续边。

初始化阶段首先将输入的 RGB-D 图的深度通道归一化到 0-1 之间,并对深度图进行双边中值滤波,以使得边缘更加明显,再基于此图片生成初始 LDI。然后再根据给定阈值判断相邻像素的视差,找到深度不连续像素,并经过一些简化、处理得到最终的深度不连续边。

Context and Synthesis Regions

接下来每次选择一条深度边借助填补算法来修复背景,首先在深度不连续处断开 LDI 像素连接,得到 (前景、背景) 轮廓像素,然后生成一个合成区域,使用洪水漫淹算法初始化颜色和深度值,再使用深度学习的方法填补该合成区域。

Context-aware Color and Depth Inpainting

给定语境区域和合成区域,这里的目标是合成颜色值和深度值。作者的网络与 EdgeConnect方法类似,将整个修复任务分解成三个子网络:

  • 边修复网络 (edge inpainting network)
  • 颜色修复网络 (color inpainting network)
  • 深度修复网络 (depth inpainting network)
Color & Depth Inpainting

首先将语境区域的边作为输入,使用边修复网络预测合成区域中的深度边,先预测边信息能够推断 (基于边的) 结构 信息,有助于约束 (颜色和深度的) 内容 预测。然后使用修复的边和语境区域的颜色作为输入,使用颜色修复网络预测颜色。最后再使用同样的方法预测深度信息。

下图展示了边指导的深度修复能够准确地延拓深度结构,并能减轻预测的彩色 / 深度不对齐的问题。

Converting to 3D Textured Mesh

通过将所有修复好的颜色和深度值重新集成到原始 LDI 中,形成最终的 3D 纹理网格。使用网格表示可以快速渲染新的视图,而无需对每个视角进行推理,因此文章算法得到的3D表示可以在边缘设备上通过标准图形引擎轻松渲染。

归纳过程:

开始修复之前,LDI上的每个像素都和上下左右的4个像素连通。AI每次选择一条深度边缘去修复,把空间上不相连的像素沿着边缘切开。这样,LDI就分成了前景和背景两个部分(b)。需要修复的部分,就在背景轮廓附近。因为,那里会有些原图上被挡的部分,需要在新视角里露出。前景就不用脑补了。至于怎样修复背景,方法是“联系上下文”,根据周围的像素来推测原本隐藏的部分。所以,首先要把背景分成“合成区”和“上下文区”:合成区是原本被前景挡住的部分,上下文区原本就是背景。

红为合成区,蓝为上下文区

分好两个区,修(nao)复(bu)环节就要开始了。

修复工作由三只小AI负责:先是边缘修复网络,它利用上下文区的边缘,来脑补被挡住的边缘;然后是色彩修复网络和深度修复网络,它们拿到了边缘修复网络提供的物体结构信息,便能更科学地脑补被遮挡的色彩和深度。

边缘修复网络,左为修复前,右为修复后

当三只AI脑补完成,只要把它们给出的结果融进当初的LDI里,新鲜的3D图像便出锅了。然后,把各种不同的视角集合起来,形成动态。

Experimental Results

Visual Comparisons

下图展示了文章方法与其他基于 MPI (Multi-Plane Representation) 方法的对比,文章方法能够合成较为合理的边缘结构,StereoMag 和 PB-MPI 方法在深度不连续处存在缺陷,LLFF 在生成新视角时会有鬼影现象。

参考

  1. 3D Photography using Context-aware Layered Depth Inpainting. Meng-Li Shih, Shih-Yang Su, Johannes Kopf, Jia-Bin Huang. CVPR, 2020.
  2. EdgeConnect: Generative Image Inpainting with Adversarial Edge Learning. Kamyar Nazeri, Eric Ng, Tony Joseph, Faisal Z. Qureshi, Mehran Ebrahimi. ICCV, 2019.

相机内参/外参–坐标转换

摘自:https://zhuanlan.zhihu.com/p/389653208

https://blog.csdn.net/zb1165048017/article/details/71104241

demo演示:http://ksimek.github.io/perspective_camera_toy.html

demo中提供了三种外参接口(世界坐标系,相机坐标系,look-at),三种交互效果不同,前两种的方向相反,世界坐标系中向左移动表示相机坐标系中向右移动,但是它们都有六个参数控制:

tx表示沿着水平方向移动相机
ty表示沿着垂直方向移动相机
tz表示沿着前后方向移动相机
px表示镜头不平移,但是绕x轴做俯仰旋转
py表示镜头不平移,但是绕垂直轴y轴做左右摇头旋转
pz表示镜头不平移,但是绕z轴做顺时针(或者逆时针)旋转
————————————————

demo也提供了内参的接口,包括四个参数控制:

焦距(Focal length):镜头的前后缩进(不是缩放)
轴倾斜(Axis Skew):可以导致球变形,平面上显示椭球形
x0表示主点偏移,相机不动,左右移动成像平面
y0 表示主点偏移,相机不动,上下移动成像平面
————————————————

相机参数都有哪些?估计它们需要的条件?评估所估算的相机参数好坏的标准?

①主要包含内参(intrinsics)、外参(extrinsics)、畸变系数(distortion coefficients)

②估计参数需要3D世界坐标及其对应的2D图像点。比如在重构3D姿态的时候,需要同时输入图片及图片中对应的人的骨骼2D坐标点。

③评估所估计相机参数的方法就是:首先画出相机和校准模式的相对位置;随后计算投影误差;最后计算参数的估算误差。在matlab中有Camera Calibrator来进行相机校准和评估参数精确度。

外参数([R|t])描述世界坐标系与相机坐标系的变换关系,参数包括:旋转R,平移T。

内参数(K)描述相机坐标系,图像坐标系,像素坐标系之间的变换关系,参数包括主点坐标,焦距,单位像素宽与高。

相机成像主要有4个坐标系:

成像的过程实质上是几个坐标系的转换。首先空间中的一点由世界坐标系转换到 摄像机坐标系 ,然后再将其投影到成像平面 ( 图像物理坐标系 ) ,最后再将成像平面上的数据转换到图像平面 (图像像素坐标系 ) 。

对应的左乘矩阵公式

摘要:本文介绍了相机的内参和外参以及推导过程,由三个部分组成:第一部分,相机内参; 第二部分,相机外参;第三部分,总结。

1 相机内参

在左图中,我们把相机看作是针孔,现实世界中的点P经过相机的光心O,投影到物理成像平面上,变为点P’。

在右图中,对这个模型进行了一个简化,将其看作是一个相似三角形。

下面我们来对这个模型进行建模。

设O−x−y−z为相机坐标系,习惯上我们把z轴指向相机前方,x向右,y向下。O为摄像机的光心,也是针孔模型中的针孔。

设真实世界点中的P的坐标为[X,Y,Z]T,成像的点P’的坐标为[X’, Y’, Z’]T, 物理成像平面和光心的距离为f(即为焦距)。

根据右图中的三角形相似关系,有:

其中,有负号是因为坐标轴方向,也就表示了成的像是倒立的。为了表示起来更方便,我们把成像平面从相机的后面对称到前面去,如下图所示。这样,负号就没有了。

在对称后,有:

整理解出P’的坐标:

上面两个式子就描述了P点与它所成像的坐标关系,可以看到,X对应的X’与焦距f有关,与距离Z有关。映射到成像平面上还不够,我们还需要将这个像给放到像素坐标系内。
我们设在物理成像平面上固定着像素平面o-u-v。

设P’在像素平面坐标系上的坐标是[u, v]T

像素坐标系通常定义方式是:原点o’位于图像的左上角,u轴向右与x轴平行,v轴向下与y轴平行。我们设像素坐标在u轴上缩放α倍,在v轴上缩放了β倍。同时,原点平移了[cx, cy]T

因此可以得到P’与像素坐标的关系:

用齐次坐标,把上式写出矩阵的形式:

上式中,K即为相机的内参矩阵(Intrinsics)。通常来说,相机的内参在出厂之后就是固定的了。

2 相机外参

相机外参的作用是把坐标从【世界坐标系】转换到【相机坐标系】中

在上面的推导中,我们用的是P在相机坐标系的坐标(也就是以相机为O点),所以我们应该先将世界坐标系中的Pw给变换到相机坐标系中的P。

相机的位姿由旋转矩阵R和平移向量t来描述,因此:

旋转矩阵:R欧拉角:wiki百科

Rot(x, θ)   表示绕X轴旋转  θ表示旋转的角度  其它同理。矩阵右下角的表示放大倍数,矩阵第4行和第4列可以不要

3 镜头畸变

透镜由于制造精度以及组装工艺的偏差会引入畸变,导致原始图像的失真。镜头的畸变分为径向畸变和切向畸变两类。

  1. 径向畸变

顾名思义,径向畸变就是沿着透镜半径方向分布的畸变,产生原因是光线在原理透镜中心的地方比靠近中心的地方更加弯曲,这种畸变在普通廉价的镜头中表现更加明显,径向畸变主要包括桶形畸变和枕形畸变两种。以下分别是枕形和桶形畸变示意图:

成像仪光轴中心的畸变为0,沿着镜头半径方向向边缘移动,畸变越来越严重。畸变的数学模型可以用主点(principle point)周围的泰勒级数展开式的前几项进行描述,通常使用前两项,即k1和k2,对于畸变很大的镜头,如鱼眼镜头,可以增加使用第三项k3来进行描述,成像仪上某点根据其在径向方向上的分布位置,调节公式为:

公式里(x0,y0)是畸变点在成像仪上的原始位置,(x,y)是畸变较真后新的位置,下图是距离光心不同距离上的点经过透镜径向畸变后点位的偏移示意图,可以看到,距离光心越远,径向位移越大,表示畸变也越大,在光心附近,几乎没有偏移。

  1. 切向畸变
    切向畸变是由于透镜本身与相机传感器平面(成像平面)或图像平面不平行而产生的,这种情况多是由于透镜被粘贴到镜头模组上的安装偏差导致。畸变模型可以用两个额外的参数p1和p2来描述:

下图显示某个透镜的切向畸变示意图,大体上畸变位移相对于左下——右上角的连线对称的,说明该镜头在垂直于该方向上有一个旋转角度。

径向畸变和切向畸变模型中一共有5个畸变参数,在Opencv中他们被排列成一个5*1的矩阵,依次包含k1、k2、p1、p2、k3,经常被定义为Mat矩阵的形式,如Mat distCoeffs=Mat(1,5,CV_32FC1,Scalar::all(0));这5个参数就是相机标定中需要确定的相机的5个畸变系数。求得这5个参数后,就可以校正由于镜头畸变引起的图像的变形失真,下图显示根据镜头畸变系数校正后的效果:

3 总结

本文介绍了:

  1. 从相机坐标系转换到像素坐标系中,相机内参的作用
  2. 从世界坐标系转换到相机坐标系中,相机外参的作用

相机内参是这样的一个矩阵:

里面的参数一般都是相机出厂就定下来的,可以通过相机标定的方式人为计算出来。

相机外参是旋转矩阵R和平移向量t构成,一般来说写成:

这个矩阵决定了相机的位姿。

MVSNeRF:多视角立体图像的快速广义辐射场重建

MVSNeRF: Fast Generalizable Radiance Field Reconstruction
from Multi-View Stereo

https://github.com/apchenstu/mvsnerf

提出了一种新的神经渲染方法neural rendering approach  MVSNeRF,它可以有效地重建用于视图合成的神经辐射场。与先前关于神经辐射场的工作不同,这些工作考虑对密集捕获的图像进行逐场景优化,我们提出了一种通用的深度神经网络,该网络可以通过快速网络推理仅从三个附近的输入视图重建辐射场。我们的方法利用平面扫描成本体plane-swept cost volumes(广泛用于多视图立体multi-view stereo)进行几何感知场景推理,并将其与基于物理的体渲染相结合进行神经辐射场重建。我们在DTU数据集中的真实对象上训练我们的网络,并在三个不同的数据集上测试它以评估它的有效性和可推广性generalizability我们的方法可以跨场景(甚至室内场景,完全不同于我们的对象训练场景)进行推广generalize across scenes,并仅使用三幅输入图像生成逼真的视图合成结果,明显优于目前的广义辐射场重建generalizable radiance field reconstruction工作。此外,如果捕捉到密集图像dense images are captured,我们估计的辐射场表示可以容易地微调easily fine-tuned;这导致快速的逐场景重建fast per-scene reconstruction,比NeRF具有更高的渲染质量和更少的优化时间。

我们利用最近在深度多视图立体(MVS)deep multi- view stereo (MVS)上的成功[50,18,10]。这一系列工作可以通过对成本体积应用3D卷积applying 3D convolutions on cost volumes来训练用于3D重建任务的可概括的神经网络。与[50]类似,我们通过将来自附近输入视图的2D图像特征(由2D CNN推断)扭曲warping到参考视图的平截头体中的扫描平面上sweeping planes in the reference view’s frustrum,在输入参考视图处构建成本体。不像MVS方法[50,10]仅在这样的成本体积上进行深度推断depth inference,我们的网络推理关于场景几何形状和外观reasons about both scene geometry and appearance,并输出神经辐射场(见图2),实现视图合成。具体来说,利用3D CNN,我们重建(从成本体)神经场景编码体neural scene encoding volume,其由 编码关于局部场景几何形状和外观的信息的每个体素神经特征per-voxel neural features 组成。然后,我们利用多层感知器(MLP)在编码体积encoding volume内使用三线性插值神经特征tri-inearly interpolated neural features来解码任意连续位置处的体积密度volume density和辐射度radiance。本质上,编码体是辐射场的局部神经表示;一旦估计,该体积可以直接用于(丢弃3D CNN)通过可微分射线行进differentiable ray marching(如在[34]中)的最终渲染。

我们的方法结合了两个世界的优点,基于学习的MVS和神经渲染。与现有的MVS方法相比,我们实现了可微分神经渲染differentiable neural rendering,允许在没有3D监督和推理时间优化的情况下进行训练,以进一步提高质量。与现有的神经渲染作品相比,我们的类MVS架构可以自然地进行跨视图对应推理cross-view correspondence reasoning,有利于推广到未知的测试场景,也导致更好的神经场景重建和渲染。因此,我们的方法可以明显优于最近的并行可概括NeRF工作concurrent generalizable NeRF work[54,46],该工作主要考虑2D图像特征,而没有明确的几何感知3D结构(参见表。1和图4)。 我们证明,仅使用三个输入图像,我们从DTU数据集训练的网络可以在测试DTU场景上合成照片级逼真的图像,甚至可以在具有非常不同的场景分布的其他数据集上生成合理的结果。此外,我们估计的三个图像辐射场(神经编码体积)可以在新的测试场景上进一步轻松优化,以在捕获更多图像的情况下改善神经重建,从而产生与每个场景过拟合NeRF相当甚至更好的照片级逼真结果,尽管我们的优化时间比NeRF少得多。

该方法利用深度MVS的成功,在成本体上应用3D卷积来训练用于3D重建任务的可泛化神经网络。与MVS方法不同的是,MVS方法仅对这样的成本体进行深度推断,而该网络对场景几何和外观进行推理,并输出神经辐射场,从而实现视图合成。具体而言,利用3D CNN,重建(从成本体)神经场景编码体,由编码局部场景几何和外观信息的体素神经特征组成。然后,多层感知器(MLP)在编码体内用三线性插值的神经特征对任意连续位置处的体密度和辐射度进行解码。本质上,编码体是辐射场的局部神经表征;其一旦估计,可直接用于(丢弃3D CNN)可微分光线行进(ray-marching)进行最终渲染。

与现有的MVS方法相比,MVSNeRF启用可微分神经渲染,在无3D监督的情况下进行训练,并优化推断时间,以进一步提高质量。与现有的神经渲染方法相比,类似MVS的体系结构自然能够进行跨视图的对应推理,有助于对未见测试场景进行泛化,引向更好的神经场景重建和渲染。

如图1是MVSNeRF的概览:(a)基于摄像头参数,首先将2D图像特征warp(单应变换)到一个平面扫描(plane sweep)上,构建成本体;这种基于方差的成本体编码了不同输入视图之间的图像外观变化,解释了由场景几何和视图相关明暗效果引起的外观变化;(b)然后,用3D CNN重建逐体素神经特征的一个神经编码体;3D CNN 是一个3D UNet,可以有效地推断和传播场景外观信息,从而产生有意义的场景编码体;注:该编码体是无监督预测的,并在端到端训练中用体渲染进行推断;另外,还将原图像像素合并到下一个体回归阶段,这样可恢复下采样丢失的高频;(c)用MLP,通过编码体插值的特征,在任意位置回归体密度和RGB辐射度,这些体属性由可微分光线行进做最终的渲染。

裸眼3D–原理介绍

裸眼3D基本上都是针对双目视差来说的。

什么是双目视差:人有两只眼睛,它们之间大约相隔65mm。当我们观看一个物体,两眼视轴辐合在这个物体上时,物体的映像将落在两眼网膜的对应点上。这时如果将两眼网膜重叠起来,它们的视像应该重合在一起,即看到单一、清晰的物体。根据这一事实,当两眼辐合到空间中的一点时,我们可以确定一个假想的平面,这个平面上的所有各点都将刺激两眼网膜的对应区域。这个表面就叫做视觉单像区(horopter)。它可以定义为在一定的辐合条件下,在视网膜对应区域的成像空间中所有各点的轨迹。位于视觉单像区的物体,都将落在视网膜对应点而形成单个的映像。

如果两眼成像的网膜部位相差太大,那么人们看到的将是双像,即把同一个物体看成两个。例如,我们用右手举起一支铅笔,让它和远处墙角的直线平行。这时如果我们注视远处墙角的直线,那么近处的铅笔就将出现双像;如果我们注视近处的铅笔,远处的墙角直线就将出现双像。

正因为双目视差,才会让我们看到的物体有纵深感和空间感。

裸眼3D是怎么做到蒙骗双眼来营造空间和纵深感呢,现在的3D视频或者图像都是通过区分左右眼来拍摄的两幅图,视差距约为65mm,通过让你左眼看到左眼的图像,右眼看到右眼的图像就可以让你的大脑合成一副有纵深感的立体画面。

人的两只眼睛相距约6cm,就像两部相距6cm放置的照相机,拍出的照片角度会有一点点不同(侈开)。

这种侈开在大脑里就可以融合成立体的感觉。

我们再抽丝剥茧制作一个最简单的侈开立体图:

越简单的图越容易说明原理,但观看起来越消耗眼睛“内功”。请您用原理一的透视方法,让左眼看左图,右眼看右图,当您能看到三个双圈的时候,中间那个小圆就会凸出纸面呈现立体感

Geometry-Free View Synthesis:基于transformer的大尺度转换的新视角合成

Geometry-Free View Synthesis: Transformers and no 3D Priors

引入一种基于 transformers 的概率方法,用于从具有大视角变化的单一源图像中进行新视图合成。作者对transformers 的各种显式和隐式 3D 感应偏置进行比较,结果表明,在架构中显式使用 3D 变换对其性能没有帮助。此外,即使没有深度信息作为输入,模型也能学会在其内部表示中推断深度。这两种隐式 transformer 方法在视觉质量和保真度上都比目前的技术状态有显着的改进。

将开源:https://github.com/CompVis/geometry-free-view-synthesis

论文:https://arxiv.org/abs/2104.07652

自回归transformer模型
问题:大角度变换,CNNs需要几何模型。
解决:不需要任何手工设计的三维偏差:(i)一种隐式学习源视图和目标视图之间的远程三维对应关系的全局注意机制来实现。 (ii)捕捉从单个图像预测新视图所固有的歧义所必需的概率公式,从而克服了以前局限于相对较小的视角变化的方法的局限性。(iii)发现以显式深度图的形式提供它们几何信息的好处相对较小,并研究了从transformer的层中恢复显式深度表示的能力,它已经学会了隐式地表示几何变换,而无需任何深度监督,甚至可以学习以无监督的方式预测深度

相关工作:本文从GPT-2架构构建自适应transformer,即,多块多头自注意,层规范和位置向MLP。自回归两阶段方法:是基于在神经离散表示学习(VQVAE)中的工作,它旨在通过向量量化或离散分配的软松弛来学习一个离散的压缩表示。这种训练范式提供了一个合适的空间来训练潜在表示上的自回归似然模型,并已被用于训练生成模型来训练分层,类条件图像合成、文本控制图像合成和音乐生成。最近,证明了VQVAE的对抗性训练在保持高保真度重建的同时提高了压缩性能,随后,我们能够在学习的潜在空间上有效地训练自回归transformer模型,(产生一个所谓的VQGAN)。我们直接在这项工作的基础上,使用VQGANs来表示源视图和目标视图,并在需要时表示深度图。
方法:由于不确定性,我们遵循一种概率方法,并从以下分布中采样新视角。

潜在空间中的概率视图合成:
为了学习上式中分布,需要捕获源视图和目标视图之间的远程交互的模型,以隐式地表示几何变换。由于基于相似的模型已经被证明直接在像素空间中建模图像时,在像素的短程交互上花费了太多的容量,我们遵循VQGAN并采用了两个阶段训练。第一阶段执行反向(对抗性)引导的离散表示学习(VQGAN),获得一个抽象的潜在空间,已被证明非常适合有效地训练生成式transformer。
建模条件图像模型
VQGAN包括一个编码器E,解码器G和一个离散表征zi(dz)的codebook Z。训练后的VQGAN允许编码任意x(HxWx3)到离散隐空间E(x)(h x w x dz)。以栅格扫描的顺序展开,这个潜在的表示形式对应于一个序列s(h x w x dz),可以等价地表示为一个整数序列,索引已学习的码本。按照通常的名称,我们将序列元素称为“tokens”。一个嵌入函数g=g(s) (hw x de)将每个tokens映射到transformer的嵌入空间中,并添加了可学习的位置编码。类似地,为了编码输入视图xsrc和照相机转换T,两者都由一个函数f映射到嵌入空间中:

其中,n表示条件处理序列的长度。通过使用不同的函数不同的归纳偏差被纳入架构。然后,transformer T处理所连接的序列[f(xsrc,T),g(sdst)]去学习以xsrc和T为条件的合理的新观点的分布。

编码Inductive Biases:比较几何变换的方法被显式地构建到条件函数f中,和没有使用这种转换的方法。
几何图像扭曲:这一部分说明显式几何变换怎么运用。我们假设有一个针孔照相机模型,这样三维点到齐次像素坐标的投影通过相机固有矩阵K确定。源坐标和目标坐标之间的转换是由旋转R和平移t组成的刚性运动给出的。这些参数一起指定了对要生成的新视图的所需控制,如T=(K,R,T)。

此关系定义了一个从源到目标的前向流场作为深度和相机参数的函数。然后,流场可以通过扭曲操作S将源图像xsrc扭曲到目标视图中。由于从流中获得的目标像素不一定是整数值,因此我们遵循,并通过跨越四个最近的目标像素的双线性溅射特征来实现S。当多个源像素映射到相同的目标像素时,我们使用它们的相对深度给予离相机更近的点权重——这是z缓冲的软变体。
在最简单的情况下,我们现在可以描述显式方法和隐式方法在接收关于源图像和期望的目标视图的信息的方式之间的区别。此处,显式方法接收使用相机参数扭曲的源信息,而隐式方法接收原始源图像和相机参数本身,如:

显式几何变换
在下面,我们用transformer的条件函数f来描述所有被考虑的变体。此外,e还表示一个可学习的嵌入映射离散的VQGAN代码E(x)到转换器的嵌入空间。相似地,e pos(n x de)指一个可学习的位置编码。流场F总是从xsrc计算,以提高可读性,我们从扭曲操作的参数中忽略它,S(.)=S(Fsrc->dst(K,R,t,d)).
(1)我们的第一个显式变体,expl.-img,会扭曲源图像,并以与目标图像相同的方式对其进行编码:

(2)受之前的作品的启发,我们包含了一个expl.-feat变体,它首先编码原始源图像,然后在这些特征之上应用warp。我们再次使用了VQGAN编码器E,以获得:

(3)解释上式中扭曲的特征保持固定状态。

隐式几何变换:接下来,我们描述我们用来分析的隐式变量,transformer能否同样好地处理所有位置,是否需要在模型中内置一个显式的几何转换。我们使用与显式变体相同的符号。
(4)第一个变体impl.-catdepth为transformer提供了显式变体中使用的所有相同组件:相机参数K、R、t、估计深度d和源图像xsrc。相机参数被拉平并连接到T^,通过Wcam(de x 1)映射到嵌入空间。深度和源图像被VQGAN编码器Ed和E编码来获得

与其他变体相比,这个序列大约长32倍,这是计算成本的两倍。
(5)因此,我们还包括了一个impl.-depth变体,它连接了深度和源图像的离散代码,并用一个矩阵W(de x 2dz)映射它们到嵌入空间以避免序列长度增加:

(6)隐式方法提供了一个有趣的可能性:因为它们不需要明确地估计该深度来执行扭曲操作S,所以它们在没有这样的深度估计的情况下具有解决该任务的潜力。因此,输入深度仅使用相机参数和源图像-根据我们的任务描述的最低限度。Impl.nodepth:

(7)最后,我们分析了显式方法和隐式方法是否提供了互补的优势。因此,我们添加了一个混合变体,其条件函数是方法(3)中expl.-emb和方法(5)中impl.-depth的f的结合。
深度读数输出:为了研究学习不同视图之间几何关系的隐式模型的能力,我们建议从一个训练过的模型中提取一个深度的显式估计。为此,我们使用线性探测,通常用于研究无监督方法的特征质量。更具体地说,我们假设一个由L层和impl.nodepth类型组成的transformer模型,它仅基于源框架和变换参数。接下来,我们指定一个特定的层0≤l≤L(其中l=0表示输入),并提取它的潜在表示el,对应于所提供的源框架xsrc的位置。然后,我们训练一个逐位置线性分类器W来预测深度编码器Ed的离散的、潜在的表示,通过一个来自el的交叉熵目标。请注意,transformer和VQGAN的权重均保持不变。
隐式,显式transformer比较

数据集: RealEstate and ACID.
其他实验:比较密度估算的质量,实现预测的可视化熵,测量图像质量和保真度,与以前的方法进行比较,对几何图形的探测

3D Photography using Context-aware Layered Depth Inpainting

CVPR 2020 | 3D Photography:一张照片也能动起来

https://arxiv.org/abs/2004.04727

3D 相片是这两年比较热门的研究方向,Facebook App 已经支持分享 3D 相片,相信在不久的未来大家便可以在朋友圈、微博上分享炫酷的 3D 相片。

本文作者来自弗吉尼亚理工学院、国立清华大学和 Facebook,作者提出了一种从 单张 RGB-D 图像生成 3D 照相 的方法,效果炫酷、惊艳,目前代码已开源。

下面先展示一下本文的一些结果,镜头晃动、zoom-in 效果,毫无违和感。

人物、动物各种场景全都不在话下,一张照片也能立刻动起来!

3D相片的生成主要基于重建和渲染技术,传统的方法需要基线较长的精密的多视角图片捕捉设备或者其他特殊装置,如 Lytro Immerge 和 Facebook Manifold camera。最近有更多的工作尝试从智能相机来生成3D相片,如 Facebook 3D Photos 只需用双摄智能手机拍摄图片,生成RGB-D图像 (彩色图+深度图) 来制作3D相片

本文同样考虑如何从输入的 RGB-D 图像来合成新的视角以生成3D照片。文章方法对深度图的质量要求并不高,只需要深度不连续处在彩色图和深度图中是合理对齐的即可。深度图可以从 双摄相机通过立体视觉的方式计算 得到,也可以借助 深度学习的方法从单张图片估计 得到,因此应用到智能手机完全没有问题,作者也对这两种来源的深度图进行了测试。

Method

Layered Depth Image

文章方法输入一张 RGB-D 图像,输出分层的深度图像 (Layered Depth Image, LDI),在原始图像中被遮挡的部位填补了颜色和深度。

LDI 类似普通的图像,区别在于每个像素点可以容纳零个或多个像素值,每个 LDI 像素存储一个颜色和一个深度值。与原始论文介绍的 LDI 不同,本文作者显式地表示了像素的局部连通性:每个像素在左右上下四个方向上都存储了零个或最多一个直接相邻的像素指针。LDI 像素与普通图像一样在光滑区域内是四连通的,但是在深度不连续处没有邻接像素。

LDI 是一种对3D相片非常有用的表达,主要在三个方面

  1. 其可以处理任意数量的深度层,可以根据需要适应深度复杂的情况;
  2. 其表达是稀疏的,具有更高的内存和存储效率;
  3. 其可以转换为轻量级的纹理网格表示,直接用于快速渲染。

Method Overview

给定输入的 RGB-D 图像,首先初始化一个单层的四连通的简单 LDI。然后进入预处理阶段,检测深度不连续像素点,并将其分组成简单的相连的深度边。文章算法反复选择深度边来进行修复,先断开边缘上的 LDI 像素,仅考虑边缘处的背景像素进行修复,从边缘的 “已知” 侧提取局部语境区域 (context region),并在 “未知” 侧生成一个合成区域 (synthesis region),合成的区域是一个包含新像素的连续2D区域。作者使用基于学习的方法根据给定的上下文生成其颜色和深度值。修复完成后再将合成的像素合并回 LDI。整个方法以这种方式反复进行,直到所有的深度边缘都经过处理。

Image Preprocessing

初始化阶段首先将输入的 RGB-D 图的深度通道归一化到 0-1 之间,并对深度图进行双边中值滤波,以使得边缘更加明显,再基于此图片生成初始 LDI。然后再根据给定阈值判断相邻像素的视差,找到深度不连续像素,并经过一些简化、处理得到最终的深度不连续边。

Preprocessing

Context and Synthesis Regions

接下来每次选择一条深度边借助填补算法来修复背景,首先在深度不连续处断开 LDI 像素连接,得到 (前景、背景) 轮廓像素,然后生成一个合成区域,使用洪水漫淹算法初始化颜色和深度值,再使用深度学习的方法填补该合成区域。

LDI Inpainting

Context-aware Color and Depth Inpainting

给定语境区域和合成区域,这里的目标是合成颜色值和深度值。作者的网络与 EdgeConnect[2] 方法类似,将整个修复任务分解成三个子网络:

  • 边修复网络 (edge inpainting network)
  • 颜色修复网络 (color inpainting network)
  • 深度修复网络 (depth inpainting network)

首先将语境区域的边作为输入,使用边修复网络预测合成区域中的深度边,先预测边信息能够推断 (基于边的) 结构 信息,有助于约束 (颜色和深度的) 内容 预测。然后使用修复的边和语境区域的颜色作为输入,使用颜色修复网络预测颜色。最后再使用同样的方法预测深度信息。

下图展示了边指导的深度修复能够准确地延拓深度结构,并能减轻预测的彩色 / 深度不对齐的问题。

Converting to 3D Textured Mesh

通过将所有修复好的颜色和深度值重新集成到原始 LDI 中,形成最终的 3D 纹理网格。使用网格表示可以快速渲染新的视图,而无需对每个视角进行推理,因此文章算法得到的3D表示可以在边缘设备上通过标准图形引擎轻松渲染。

Experimental Results

Visual Comparisons

下图展示了文章方法与其他基于 MPI (Multi-Plane Representation) 方法的对比,文章方法能够合成较为合理的边缘结构,StereoMag 和 PB-MPI 方法在深度不连续处存在缺陷,LLFF 在生成新视角时会有鬼影现象。

作者将文章方法与 Facebook 3D Photos 进行了比较。通过 iPhone X 采集的彩色图和估计的深度图作为两种方法的输入,下图是部分对比结果展示,文章方法能够合成更为合理的内容和结构信息。

代码测试

参考官方GitHub仓库,步骤如下

# 创建pytorch虚拟环境

# 下载代码
git clone https://github.com/vt-vl-lab/3d-photo-inpainting.git
cd 3d-photo-inpainting
./download.sh  # 下载预训练模型
(pytorch) $ python main.py --config argument.yml # 运行代码

参考

  1. 3D Photography using Context-aware Layered Depth Inpainting. Meng-Li Shih, Shih-Yang Su, Johannes Kopf, Jia-Bin Huang. CVPR, 2020.
  2. EdgeConnect: Generative Image Inpainting with Adversarial Edge Learning. Kamyar Nazeri, Eric Ng, Tony Joseph, Faisal Z. Qureshi, Mehran Ebrahimi. ICCV, 2019.

计算机图形学:变换矩阵

最近在研究3D建模和新视点合成,在渲染过程中需要选取新视点去合成新图。一般在接口处需要传递一个变换矩阵,用于控制视点的变化。

成像的过程实质上是几个坐标系的转换。首先空间中的一点由世界坐标系转换到 摄像机坐标系 ,然后再将其投影到成像平面 ( 图像物理坐标系 ) ,最后再将成像平面上的数据转换到图像平面 (图像像素坐标系 ) 。

以AdaMPI的代码为例:

# 定义新视角的角度和渲染的帧数
def gen_swing_path(num_frames=90, r_x=0.14, r_y=0., r_z=0.10):
    "Return a list of matrix [4, 4]"
    t = torch.arange(num_frames) / (num_frames - 1)
    poses = torch.eye(4).repeat(num_frames, 1, 1)
    poses[:, 0, 3] = r_x * torch.sin(2. * math.pi * t)
    poses[:, 1, 3] = r_y * torch.cos(2. * math.pi * t)
    poses[:, 2, 3] = r_z * (torch.cos(2. * math.pi * t) - 1.)
    return poses.unbind()

以Synsin代码为例:

# Parameters for the transformation
theta = -0.15
phi = -0.1
tx = 0
ty = 0
tz = 0.1

RT = torch.eye(4).unsqueeze(0)
# Set up rotation(旋转参数)
RT[0,0:3,0:3] = torch.Tensor(quaternion.as_rotation_matrix(quaternion.from_rotation_vector([phi, theta, 0])))
# Set up translation(平移参数)
RT[0,0:3,3] = torch.Tensor([tx, ty, tz])

一开始其实没有明白为什么需要对 r_x=0.14, r_y=0., r_z=0.10 进行处理,处理成4*4的矩阵形式,而不是直接使用,后来查阅资料发现应该是涉及到计算机图形学的变换矩阵的范畴。

计算机图形学中3D的变换是基于转换矩阵( 仿射空间 )进行的。那么为什么是4维的矩阵而不是3维:用第四维度标识向量 or 点。

模型的变换可以认为是空间中一堆点的变换,三维空间中,(x,y,z)可以认为是点,也可以认为是一个向量,因此,人们引入的第4个维度来标识是点还是向量,这个4维空间就叫 仿射空间,,在仿射空间中,(x,y,z,0)标识向量,而(x,y,z,1)表示点。

在图形学中,在做平移,旋转和缩放时,经常会用到矩阵,有缩放矩阵、平移矩阵和旋转矩阵。在三维空间中,变换矩阵都是一个四维矩阵,每一行分别表示x, y, z, w。

1. 缩放矩阵(scale)

上面的公式,左边的第一个操作数(四维矩阵)就是一个缩放矩阵,s1表示x轴的缩放倍数,s2表示y轴的缩放倍数,s3表示z轴的缩放倍数。第二个操作数表示空间中(x, y, z)点, w分量在缩放矩阵中没有用到,我们将其设为1。由右边的结果,可以看出(x, y, z)点经过缩放矩阵变换后,x、y、z分量都各自缩放了s(s1、s2、s3)倍。需要注意的是矩阵的乘法不具有交换律,这里点是用一维列矩阵表示的,作为矩阵乘法的右操作数。如果将其转换到乘法的左边,那么点应该用一维行矩阵表示:

缩放矩阵比较简单,不需要证明,只需要会简单的乘法,就可以看出x,y,z经过缩放矩阵的变换确实被缩放了。

2.平移矩阵(translation)

平移矩阵也称位移矩阵,平移矩阵用到了第四列(w列),这也是为什么三维空间变换矩阵为什么是四维的。平移矩阵也比较容易理解,因为可以通过结果看出想x 、y、z确实各自平移了T步。

3. 旋转矩阵

旋转矩阵,相对难一些,也不是那么容易理解,我们先看最基础的绕x、y、z轴旋转的旋转矩阵。

沿x轴:

沿y轴:

沿z轴:

引入了三角函数,我们无法从结果看出旋转矩阵是否正确,所以我们需要证明。下面我给出沿z轴旋转的变换矩阵证明过程,其他轴同理可证。

image-20210521112417466

假设有如图的点p1,因为绕z轴旋转,点的z值是不变的,我们将其设为0,这样可以将其模拟成二维平面xy中旋转。假设p1绕原点旋转b角度,初始角度为a。整个证明过程如下:

// 经过旋转后向量的长度不变为L(原点到p1和p2的距离相同)
// 由三角函数得到sin(a + b), cos(a + b)的值
cos(a + b) = x2 / L;
sin(a + b) = y2 / L;

// 展开sin(a + b)和cos(a + b)
cos(a) * cos(b) - sin(a) * sin(b) = x2 / L;
sin(a) * cos(b) + cos(a) * sin(b) = y2 / L;

// 用x和y表示cos(a)和sin(a)
x / L * cos(b) - y / L * sin(b) = x2 / L;
y / L * cos(b) + x / L * sin(b) = y2 / L;

// 等式两边同时乘以L
x * cos(b) - y * sin(b) = x2;
y * cos(b) + x * sin(b) = y2;

将x2和y2的结果与上面z轴旋转矩阵结果比较,发现是完全一样的。

按照上面的方法同理可证绕x轴旋转和绕z轴旋转的矩阵。

那么绕任意轴旋转的矩阵呢?learnOpengl_cn官网直接给出了绕任意轴旋转的矩阵,(Rx, Ry, Rz)表示任意轴,θ表示旋转的矩阵。这个矩阵证明比较复杂。