Zero123 论文学习

news2024/12/26 11:00:49

论文链接:https://arxiv.org/abs/2303.11328
代码链接:https://github.com/cvlab-columbia/zero123

解决了什么问题?

人类通常能够仅凭一个相机视角来想象物体的三维形状和外观。这种能力对于日常任务非常重要,例如物体操纵和在复杂环境中导航。此外,这种能力对于视觉创造力也很关键,如绘画艺术。这种能力可以部分通过依赖于几何先验(如对称性)来解释。人类似乎能够轻松地推广到更具挑战性的物体上,这些物体打破了物理和几何约束。事实上,我们甚至能够预测那些在物理世界中不存在(或根本无法存在)的物体的3D形状,如下图的第三列所示。为了达到这种泛化程度,人类依赖于通过一生的视觉探索积累的先验知识。

然而,大多数现有的3D图像重建方法都是在封闭世界(closed-world)设置中操作的,这是因为它们依赖于昂贵的3D注释,例如CAD模型或特定类别的先验知识。最近,一些方法通过在大规模、多样化的数据集(如CO3D)上进行预训练,在开放世界3D重建方面取得了重大进展。然而,这些方法通常仍然需要几何相关的信息来进行训练,例如立体视图或相机姿态。因此,它们所使用的数据规模和多样性与最近能够使大型扩散模型成功的互联网规模的文本-图像集合相比仍然不够显著。已经证明,互联网规模的预训练赋予了这些模型丰富的语义先验。但是,这些模型在多大程度上捕获了几何信息,在很大程度上仍是未知的。

封闭世界设置通常指的是方法只能在有限的数据集或特定类别上工作,而开放世界设置则指的是方法能够处理更广泛、更多样化的数据。

本文中,作者展示了如何学习控制机制,操作大规模扩散模型的相机视点,从而进行零样本的新视图合成和 3D 形状重建。从单个RGB图像重建3D形状,这是一个在信息不足的情况下进行的任务。但是,因为生成模型可用的训练数据规模非常大(超过50亿张图像),人们开始用扩散模型来表示自然图像的分布,支持从多个视角捕捉大量不同物体的表示。尽管它们是在 2D 单目图像上训练的,缺乏相机的对应关系,但可以微调模型以学习生成过程中相对相机旋转和平移。这样就可以使模型学会在生成过程中控制相机视角,从而对任意图像进行编码,并将其解码为我们选择的不同相机视点。

零样本学习指的是在没有直接训练数据的情况下执行任务。新视角合成是指从新的视角生成图像。

3D generative models

结合大规模图像-文本数据集的使用,生成图像架构已经取得了显著进展,能够合成高保真的多样化场景和对象。扩散模型在学习可扩展的图像生成器方面表现出色,它们使用去噪目标来训练。但是,将扩散模型扩展到3D领域将需要大量的昂贵的带注释的3D数据。相反,最近的方法依赖于将预训练的大型2D扩散模型转移到3D领域,而不需要使用任何真实的3D数据。NeRF作为一种强大的表示形式,因其能够高保真地编码场景而受到关注。通常,NeRF用于单场景重建,它提供了许多覆盖整个场景的带位姿的图像。该任务然后预测未知视角的新视图。DreamFields 证明 NeRF 非常有用,可以作为3D生成系统的主要组成部分使用。各种后续的工作通过使用2D扩散模型的蒸馏损失替代CLIP,用于从文本输入生成高保真的3D对象和场景。

作者的工作探索了一种非传统的视角合成方法,这种方法不同于传统的3D重建或视角合成技术。该方法将视角合成建模为一个图像到图像的翻译任务,其中图像的生成受到视角条件的约束。学到的模型还可以与3D蒸馏(3D distillation)结合使用,从单个图像中重建3D形状。与之前的工作不同,本文方法展示了零样本泛化能力,即在没有见过的图像上也能进行有效的视角合成。先前的工作采用了类似的流程,但没有展示出零样本泛化能力。同时期的方法提出了使用语言引导的先验和 textual inversion 来执行图像到3D的生成。本文方法使用合成数据集学习视点控制,模型能够学习如何在没有直接3D信息的情况下,根据视角变化来调整图像的生成。

Single-view object reconstruction

从单一视角重建 3D 物体是非常有挑战性的,需要很强的先验信息。一种研究思路是通过依赖于3D信息(如网格、体素或点云)集合来构建先验,这些信息用于表示 3D 的形状,并使用图像编码器进行条件化。这些模型受到所使用的3D数据集多样性的限制,并且由于这种全局性质的条件化,表现出较差的泛化能力。这些方法还需要一个额外的姿态估计步骤,以确保估计的形状与输入图像之间的对齐。另一方面,局部条件模型旨在直接使用局部图像特征进行场景重建,并展示出很强的跨域的泛化能力,但是局部条件模型通常受限于近距离视角的重建。

本文中,作者展示了如何直接从预训练的扩散模型中提取丰富的几何信息,减轻了对额外深度信息的需求。

提出了什么方法?

本文核心的贡献就是展示了大规模扩散模型可以学到世界的丰富 3D 先验知识,尽管它们是在 2D 图像上训练的。论文也展示了新视角合成领域的最新成果,即从单个RGB图像生成新视角图像的能力。论文还展示了零样本3D重建领域的最新成果,即从单个RGB图像重建物体的3D形状。

Zero-1-to-3是一个新颖的框架,它可以根据单个RGB图像改变相机视点,即使只有一个图像作为输入。 在这种约束不足的情况下进行新视角合成是一个挑战,但Zero-1-to-3框架通过利用大规模扩散模型学习到的自然图像的几何先验来实现这一点。该框架使用条件扩散模型,它利用合成数据集来学习相对相机视点的控制,从而能够生成同一对象在特定相机变换下的新图像。尽管Zero-1-to-3模型是在合成数据集上训练的,但它保持了强大的零样本泛化能力,能够很好地适应分布外数据集的图像,包括印象派绘画。Zero-1-to-3框架的视点条件扩散方法也可以用于从单个图像进行3D重建的任务。定性和定量的实验表明,Zero-1-to-3方法通过利用互联网的大规模数据的预训练,显著优于现有的单视图3D重建和新视角合成模型。Zero-1-to-3通过使用大规模扩散模型,能够从大量数据中学习到丰富的先验知识,这使得它在处理单图像任务时表现出色。

给定某物体的一张 RGB 图像 x ∈ R H × W × 3 x\in \mathbb{R}^{H\times W\times 3} xRH×W×3,目的是合成出该物体在不同相机视点下的图像。设 R ∈ R 3 × 3 R\in \mathbb{R}^{3\times 3} RR3×3 T ∈ R 3 T\in\mathbb{R}^3 TR3 是期望视点下的相对相机旋转和平移矩阵。我们要学习一个模型 f f f,在该相机变化下合成出一张新图像:

x ^ R , T = f ( x , R , T ) \begin{equation} \begin{split} \hat{x}_{R,T} = f(x,R,T) \end{split} \end{equation} x^R,T=f(x,R,T)

其中 x ^ R , T \hat{x}_{R,T} x^R,T 是合成的图像。我们想要 x ^ R , T \hat{x}_{R,T} x^R,T 感官上足够接近真实但全新的视角 x R , T x_{R,T} xR,T

从单目RGB图像进行新视角合成是一个“严重约束不足”的问题,意味着仅凭单个图像很难确定场景的所有3D信息。作者提出利用大型扩散模型,例如Stable Diffusion,来执行新视角合成任务。扩散模型在文本描述生成多样化图像方面展现出了非凡的零样本(zero-shot)能力。零样本意味着模型能够在没有直接训练数据的情况下执行任务。预训练的扩散模型是当前最先进的自然图像分布表示方法,这使得它们能够生成高质量、多样化的图像。

但是要想得到 f f f,我们有两个挑战必须去克服。首先,尽管大规模生成模型是在不同视点的物体上训练得到,但表征并没有显式地编码不同视点之间的对应关系。其次,生成模型继承了互联网数据的视角偏见,如下图所示。Stable Diffusion 倾向于生成标准位姿的面朝前的椅子。这两个问题严重制约了模型从扩散模型提取 3D 知识的能力。

Learning to Control Camera Viewpoint

由于扩散模型是在互联网大规模数据训练得到的,这些图像的分布基本覆盖了大多数物体的大多数视点,但是这些视点不受预训练模型控制。一旦我们能教会模型控制相机的外参,我们就解锁了模型进行新视角合成的能力。

如上图所示,给定一个由图像对以及它们的相对相机外参组成的数据集 { ( x , x R , T , R , T ) } \{(x, x_{R,T}, R, T)\} {(x,xR,T,R,T)} R R R是旋转矩阵, T T T是平移),本方法微调了一个预训练扩散模型,从而学习控制相机参数,同时不破坏模型的其它表示能力。使用了一个隐扩散架构,包括一个编码器 E \mathcal{E} E、一个去噪器 U-Net ϵ θ \epsilon_\theta ϵθ、一个解码器 D \mathcal{D} D。编码器 E \mathcal{E} E用于将输入图像和相机外参编码为潜在空间中的表示。去噪器 ϵ θ \epsilon_\theta ϵθ是一个常见的神经网络结构,用于在扩散过程中逐步去除噪声,恢复图像。解码器 D \mathcal{D} D用于将潜在空间的表示转换回图像空间。在扩散时间步 t t t(通常在1到1000之间), c ( x , R , T ) c(x, R, T) c(x,R,T) 表示输入视图和相对相机外参的 embedding。然后,我们可以用下面的目标函数来微调模型:

min ⁡ θ E z ∼ E ( x ) , t , ϵ ∼ N ( 0 , 1 ) ∥ ϵ − ϵ θ ( z t , t , c ( x , R , T ) ) ∥ 2 2 \begin{equation} \begin{split} \min_{\theta}{\mathbb{E}_{z\sim \mathcal{E}(x),t,\epsilon \sim \mathcal{N}(0,1)}\left\| \epsilon - \epsilon_\theta (z_t, t, c(x,R,T)) \right\|_2^2} \end{split} \end{equation} θminEzE(x),t,ϵN(0,1)ϵϵθ(zt,t,c(x,R,T))22
模型 ϵ θ \epsilon_\theta ϵθ 训练完后,推理模型 f f f 就能由高斯噪声图像,以 c ( x , R , T ) c(x,R,T) c(x,R,T) 为条件,通过逐步去噪的方式以生成图像了。

论文的核心成果是展示了如何通过微调预训练的扩散模型,使其能够学习控制相机视点的通用方法。这种微调方法允许模型在微调数据集之外的对象上进行外推(extrapolate),即模型能够处理在微调过程中未见过的对象。微调使模型能够学习控制相机视点的机制,这意味着模型可以根据需要生成不同视点的图像,同时保留了模型生成逼真图像的能力。这种能力表明模型具有组合性,即能够将学习到的视点控制与图像生成能力结合起来。微调后的模型在零样本情况下也具有合成新视图的能力,即对于在微调集中从未出现过的对象类别,模型也能够合成它们的新视图。即使对于那些在微调数据集中没有3D资产且从未出现过的对象类别,最终的模型也能够合成它们的新视图。

View-Conditioned Diffusion

3D重建需要同时处理低级感知信息(如深度、阴影、纹理等)和高级理解(如类型、功能、结构等)。为了应对这一挑战,作者采用了混合条件机制,将不同层次的信息结合起来。

  • 在第一个流程中,使用CLIP模型对输入图像进行嵌入,并将该嵌入与相机姿态 ( R , T ) (R, T) (R,T)结合,形成“posed CLIP”嵌入 c ( x , R , T ) c(x, R, T) c(x,R,T)。通过 cross attention 机制将这种 embedding 应用于去噪U-Net,提供输入图像的高级语义信息。
  • 第二个流程中,将输入图像与正在去噪的图像在通道上进行拼接,帮助模型保持合成物体的身份和细节。

为了应用 classifier-free guidance,在推理过程中,随机地将输入图像和 posed CLIP embedding 设置为 null 向量,并调整条件信息的缩放。

3D Reconstruction

在许多应用场景中,用户不仅仅需要对象的新视图合成,更期望得到一个全面的3D重建,这包括对象的外观和几何结构。为了实现这一目标,作者采用了一个最近开源的框架,即Score Jacobian Chaining(SJC),用于优化3D表示,并结合来自文本到图像扩散模型的先验知识。但是,扩散模型具有概率性质,这意味着在优化过程中,梯度更新具有高度的随机性。SJC框架中使用了一个关键技术,这项技术受到DreamFusion的启发,即设置分类器自由引导(classifier-free guidance)的值远高于通常的设置。这样做可以减少每个样本的多样性,但能提高重建的保真度。

如下图,与 SJC 相似,作者随机采样一些视点来做体积渲染,即模拟光线穿过3D体积并计算每个像素的颜色,以生成初始的3D视图图像。然后,用高斯噪声 ϵ ∼ N ( 0 , 1 ) \epsilon\sim \mathcal{N}(0,1) ϵN(0,1) 对体积渲染的图像做扰动。然后使用 U-Net ϵ θ \epsilon_\theta ϵθ 来去除图像中的噪声,该 U-Net 的输出依赖于输入图像 x x x、posed CLIP embedding c ( x , R , T ) c(x,R,T) c(x,R,T) 和时间步 t t t。这些条件信息帮助网络更好地理解图像内容和上下文。去噪过程的目标是将噪声图像恢复为接近原始无噪声输入 x π x_\pi xπ 的状态。这里的 x π x_\pi xπ 表示经过相机姿态变换后的输入图像。

∇ L S J C = ∇ I π log ⁡ p 2 ϵ ( x π ) \begin{equation} \begin{split} \nabla{\mathcal{L}_{SJC}} = \nabla_{I_\pi}{\log{p_{\sqrt{2}\epsilon}(x_\pi)}} \end{split} \end{equation} LSJC=Iπlogp2 ϵ(xπ)
其中 ∇ L S J C \nabla{\mathcal{L}_{SJC}} LSJC是 PAAS 得分。此外, 作者用 MSE 损失对输入视角做优化。为了进一步正则 NeRF 表示,作者对每个采样视点使用一个深度平滑损失,以及一个相邻视角的一致性损失对相邻的视图的外观变化做正则。

Dataset

作者使用 Objaverse 数据集来微调,它是一个由超过10万名艺术家制作的大规模开放的数据集,包括 80 万个 3D 模型。虽然它没有显式的类别标签,但涵盖了非常多样化、高质量的 3D 模型,具有丰富的几何信息和细粒度的纹理信息。对于数据集中的每个物体,随机采样 12 个相机外参矩阵 M \mathcal{M} M,这些矩阵指向物体的中心。使用光线追踪引擎渲染了12个视图。在训练时,对于每个物体,可以采样两个视图以形成图像对 ( x , x R , T ) (x,x_{R,T}) (x,xR,T)。可以很容易地从两个外参矩阵中派生出定义两个视角之间映射的相对视点变换 ( R , T ) (R,T) (R,T),这里 R R R是旋转矩阵, T T T是平移向量。

光线追踪是一种渲染技术,能够生成逼真的光照和阴影效果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1987120.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

快速掌握Vue:基础命令详解

目录 1. Vue概述 2. 快速入门 3. Vue指令 3.1 v-bind 3.2 v-model 3.3 v-on 3.4 v-if 3.5 v-show 3.6 v-for 3.7 案例 4. 生命周期 1. Vue概述 Vue.js(读音 /vjuː/, 类似于 「view」) 是一套构建用户界面的 「渐进式框架」。与其他重量级框…

【EI会议征稿通知】第六届光电科学与材料国际学术会议 (ICOSM 2024)

会议主要围绕“光电技术应用”“光电科学材料”“光电信号处理”“低温等离子体技术与应用” “激光技术与应用”“材料科学”等研究领域展开讨论。旨在为光电学、电子工程学等专家学者、工程技术人员、技术研发人员提供一个交流平台。拓展国内外光电科学与材料技术方面的研究范…

科普文:微服务之全文检索ElasticSearch忝删改查详细操作说明

一、Restful简介 RESTFul:Representational State Transfer,中文意思:表现层状态转化。变现层指的是资源的表现层,这里的资源是指网络上的信息,比如一张图片,一段文本,一步电影,那么…

数据结构(学习)2024.8.6

今天开始学习数据结构的相关知识,大概分为了解数据结构、算法;学习线性表:顺序表、链表、栈、队列的相关知识和树:二叉树、遍历、创建,查询方法、排序方式等。 目录 一、数据结构 数据 逻辑结构 1.线性结构 2.树…

JavaEE: wait(等待) / notify (通知)

文章目录 wait(等待) / notify (通知)总结 wait(等待) / notify (通知) 线程在操作系统上的调度是随机的~ 那么我们想要控制线程之间执行某个逻辑的先后顺序,那该咋办呢? 可以让后执行的逻辑,使用wait, 先执行的线程,在完成某些逻辑之后,通过notify来唤醒对应的wait. 另外,通…

谈谈如何优雅地封装 el-table

效果 像这样的表格我们可以这样划分一下区域&#xff1a; 1区域的渲染是通过取反插槽的条件 2区域的渲染是写在 slot 插槽的内部的&#xff0c;直接显示行数据3区域的渲染是通过具名插槽 bind 渲染 直接上代码&#xff1a; 子组件&#xff1a; <template><el-tabl…

为什么要用分布式锁

单应用中,如果要确保多线程修改同一个资源的安全性 加synchronized就可以了 但是性能不高 而mybatis-plus的乐观锁就可以很好的解决这类问题 但是这样的锁机制,只在单应用中有效 试想,在分布式下,有没有可能出现多个应用中的线程同时去修改同一个数据资源的并发问题 例如A …

Golang | Leetcode Golang题解之第328题奇偶链表

题目&#xff1a; 题解&#xff1a; func oddEvenList(head *ListNode) *ListNode {if head nil {return head}evenHead : head.Nextodd : headeven : evenHeadfor even ! nil && even.Next ! nil {odd.Next even.Nextodd odd.Nexteven.Next odd.Nexteven even.N…

65 生成器函数设计要点

包含 yield 语句的函数可以用来创建生成器对象&#xff0c;这样的函数也称为生成器函数。yield 语句与 return 语句的作用相似&#xff0c;都是用来从函数中返回值。return 语句一旦执行会立刻结束函数的运行&#xff0c;而每次执行到 yield 语句返回一个值之后会暂停或挂起后面…

无人机无线电监测设备技术分析

随着无人机技术的飞速发展&#xff0c;其在民用、军事、科研及娱乐等领域的广泛应用&#xff0c;对无线电频谱资源的有效管理和监测提出了更高要求。无人机无线电监测设备作为保障空域安全、维护无线电秩序的重要工具&#xff0c;集成了高精度定位、频谱扫描、信号分析、数据处…

stm32应用、项目

主要记录实际使用中的一些注意点。 1.LCD1602 电路图&#xff1a; 看手册&#xff1a;电源和背光可以使用5v或者3.3v&#xff0c;数据和控制引脚直接和单片机引脚连接即可。 单片机型号&#xff1a;stm32c031c6t6 可以直接使用推完输出连接D0--D7,RS,EN,RW引脚&#xff0c;3…

大数据面试SQL(二):每天最高峰同时直播人数

文章目录 每天最高峰同时直播人数 一、题目 二、分析 三、SQL实战 四、样例数据参考 每天最高峰同时直播人数 一、题目 有如下数据记录直播平台主播上播及下播时间&#xff0c;根据该数据计算出平台当天最高峰同时直播人数。 这里用主播名称做统计&#xff0c;前提是主…

Flask+LayUI开发手记(一):LayUI表格的前端数据分页展现

用数据表格table展示系统数据&#xff0c;是LayUI的基本功能&#xff0c;编码十分简单&#xff0c;就是通过table.render()渲染&#xff0c;把属性配置好就OK了&#xff0c;十分方便&#xff0c;功能也十分强大。 不过&#xff0c;在实现时&#xff0c;把table的有个功能却理解…

WPF MVVM实现TreeView层级显示

最近在写一个小工具的时候&#xff0c;遇到TreeView的层级显示&#xff0c;刚好我又用了MVVM模式&#xff0c;所以这里做个总结。 以前我是直接绑定XML数据到TreeView的&#xff0c;使用的XmlDataProvider&#xff0c;这次的数据是直接来自数据库的。 用到的都是Hierarchical…

Element学习(入门)(1)

1、Element官网&#xff1a;https://element.eleme.cn/#/zh-CN 2、来源与用处 3、Element的快速入门 &#xff08;1&#xff09; &#xff08;2&#xff09;在入口文件&#xff08;main.js&#xff09;中引入 &#xff08;3&#xff09; 4、快捷键ctrlc&#xff0c;在当前的项目…

【SpringBoot】自定义注解 I18n <约定式>国际化 (源码分享直接Copy)

0. 已做全新升级版 链接&#xff1a;【SpringBoot】自定义注解终极升级版&#xff1c;i18n国际化&#xff1e;方案源码Copy 链接&#xff1a;【SpringBoot】自定义注解终极升级版&#xff1c;i18n国际化&#xff1e;方案源码Copy 链接&#xff1a;【SpringBoot】自定义注解终…

【电子电路学习笔记】——模电笔记

关于专栏&#xff1a;本专栏用于分享学习电子电路过程中记录的笔记。模电部分使用的教材是高等教育出版社&#xff0c;华成英主编的《模拟电子技术基础&#xff08;第六版&#xff09;》&#xff08;其他版本的内容差不多&#xff0c;建议使用最新版教材&#xff09;&#xff1…

【完全二叉树的权值】

题目 代码1&#xff08;队列&#xff09; #include<bits/stdc.h> using namespace std; #define x first #define y second typedef pair<int, int> PII;const int N 1e510; int n; long long a[N]; queue<PII> q; long long sum[25]; int main() {memset(…

Leetcode—233. 数字 1 的个数【困难】

2024每日刷题&#xff08;152&#xff09; Leetcode—233. 数字 1 的个数 算法思想 参考自k神 实现代码 class Solution { public:int countDigitOne(int n) {long digit 1;long high n / 10;long low 0;long cur n % 10;long ans 0;while(high ! 0 || cur ! 0) {if(cu…

Python Web开发之“基于flask的轻量级Web应用”

参考文章1&#xff1a;https://cloud.tencent.com/developer/article/2373503 参考文章2&#xff1a;基于Flask的自定义网站设计与实现&#xff08;代码全文讲解V1.0&#xff09;_flask框架制作网页-CSDN博客 参考文章3&#xff1a;PythonFlaskMysqL设计网页 - 李明惠 - 博客…