【MVDiffusion】完美复刻场景,可多视图设计的生成式模型

文章目录

  • MVDiffusion
    • 1. 自回归 生成 全景图
      • 1.1 错误积累
      • 1.2 角度变换大
    • 2. 模型结构
      • 2.1 多视图潜在扩散模型(mutil-view LDM)
        • 2.1.1 Text-conditioned generation model
        • 2.1.2 Image&text-conditioned generation model
        • 2.1.3 额外的卷积层
      • 2.2 Correspondence-aware Attention(CAA)
    • 3. Train 阶段
      • 3.1 全景生成任务
      • 3.2 多视图图像生成任务
    • 4. 应用场景
    • 5. 代码部分

MVDiffusion

论文链接:https://arxiv.org/pdf/2307.01097.pdf

项目地址:https://huggingface.co/spaces/tangshitao/MVDiffusion

代码仓库:https://github.com/Tangshitao/MVDiffusion

MVDiffusion的目标是产生内容高度一致且全局语义统一的多视角图片,其方法的核心思想是同步去噪(simultaneous denoising)和基于图片之间对应关系的全局意识(global awareness)。

1. 自回归 生成 全景图

自回归生成过程时,可以将其类比为一种逐步构建图像的方式。其中第n个图像的生成取决于第n-1图像,通过图像变形和修复技术来实现。这种自回归方法会导致 错误的累积,并且 不能处理循环闭合

1.1 错误积累

构建一张全景图:

  1. 通过文本描述生成视图A
  2. 基于视图A的内容进行变形和修复,进而生成视图B
  3. 参照前一张图片,持续过程2

例如,在视图A中有一张桌子;生成B时,可能会将桌子的一部分移到另一个位置,以模拟从不同角度看到的效果。这个过程会一直持续,生成视图C、D、E,以及其他可能的视图,每次都依赖于前一个视图。如果在视图A中对桌子的变形不准确,那么这个错误将在生成视图B、C、D等时逐渐累积,导致最终的多视图图像可能看起来不真实或不连贯。这就是所谓的"错误累积"问题。

1.2 角度变换大

视图之间的角度变化很大,比如从一个房间的一侧到另一侧,那么自回归方法可能会遇到困难。

因为它依赖于前一个视图,要正确地生成从一个角度到另一个角度的视图,需要处理复杂的角度变化和背景内容的改变,这可能会导致生成的结果不准确。

2. 模型结构

全景图像是由8张重叠的透视图像组成的。每一对相邻的图像之间,像素之间的对应关系是通过一个3x3的单应矩阵来确定的。在全景图像中,不同的透视图像需要通过这个矩阵来进行像素级的对应,以便它们能够正确地拼接在一起,形成一个连续的全景图。

在文中,水平视场角为90度,这意味着每两张连续的图像之间有45度的重叠。这种设置通常用于全景图像拼接,其中每张图像捕获了一个广阔的水平视野,并且为了确保图像之间的连续性,它们有一定的重叠部分,以便在拼接时能够正确对齐。

在这里插入图片描述

  1. 多视图图像的潜变量同时(即并行)通过共享的UNet进行去噪。
  2. 将新的对应感知注意(CAA)块插入到UNet中,学习跨视图几何一致性,实现全局感知。

2.1 多视图潜在扩散模型(mutil-view LDM)

MVDiffusion设计了两种模型变体。文本条件的生成模型将文本提示作为条件;图像和文本条件的生成模型将文本提示以及一个或两个附加源图像作为条件。

全景图生成

根据用户输入的类型,将只使用两个模型中的一个。

  • 如果只提供文本,文本条件模型将并行生成八个多视图
  • 如果提供了附加的源视图,则文本和图像条件模型可以考虑图像和文本条件,从而生成七个多视图

多视图深度到图像生成
文本条件生成模型首先 将稀疏的深度图集子采样为“关键帧” 并生成纹理图像。然后,图像和文本条件模型 就像 插值模型一样,它以两个连续的关键帧图像作为附加条件,生成中间的图像。这些生成的图像应该与深度图和两个条件图像一致,同时还与文本提示对齐。

2.1.1 Text-conditioned generation model

对于全景图像生成任务,图像分辨率为512×512,而对于多视图深度到图像的任务,图像分辨率为192×256。

全景图生成

多个图像的潜在表示(latent)使用独立的高斯噪声进行初始化。在每个去噪步骤中,这些带噪声的潜在表示被送入多分支的UNet,以同时对所有多视图的潜在表示进行去噪。
生成全景图像需要同时合成多个视图,以覆盖整个全景。这可能需要更高的图像分辨率512 ×512,以确保生成的图像在细节上足够清晰,并且不会出现明显的像素化。

CAA块的使用:
SD UNet包括多个下采样和上采样块,每个块都伴随着一个CAA块,用于强化多视图一致性。CAA块的作用是确保生成的多视图图像在外观和几何上保持一致。

CAA块初始化:
将CAA块的最终线性层初始化为零,这是根据ControlNet 的建议,以确保修改不会破坏SD模型的原始功能。

多视图深度到图像生成

从深度信息生成多个视图,通常用于文本生成多视图图像。相对于全景图像,这个任务可能对图像分辨率的要求较低,因为生成的图像通常不需要涵盖整个全景。

2.1.2 Image&text-conditioned generation model

全景图生成

在这个任务中,图像&文本条件生成模型的目标是基于单个透视图像(一个条件图像)和每个视角的文本提示生成完整的360度全景视图(七个目标图像)。

在生成全景图像时,模型需要使用一个条件图像作为参考,以便在生成新视角的图像时保留一些内容的一致性。
为了做到这一点,将一个由1组成的掩码连接到条件图像的通道中,这样掩码的像素值就变成了1,而条件图像的原始像素值则保持不变 (改变阿尔法通道)。这个操作将条件图像与生成的图像的一些像素对应起来,以确保在新生成的图像中保留了与条件图像相同的内容。

在目标图像的UNet分支中,我们将一个由零值像素组成的黑色图像与一个由零组成的掩码连接在一起作为输入,因此需要修复模型基于文本条件和与条件图像的对应关系生成全新的图像。

多视图深度到图像生成

这个任务中的目标是在文本条件生成模型生成的关键帧图像之间进行稠密化,并且附加条件是一对关键帧图像。由于SD的图像修复模型不支持深度条件,因此我们必须在这里采用不同的方法。

受到VideoLDM的启发,我们重用了深度条件UNet,该UNet带有CAA块,来自文本条件生成模型,已经训练用于生成给定深度图和相机姿态的稀疏关键帧图像。额外的卷积层被插入以注入两个条件图像的信息。

2.1.3 额外的卷积层

条件图像分支(两个条件图像)
首先,将条件图像本身与一个由1组成的掩码(总共4个通道)连接起来。然后,使用零卷积操作来降采样连接后的图像,使其与UNet块的特征图大小相匹配。降采样后的条件图像与UNet块的输入相加。这个过程的目的是训练模型,当掩码为1时,分支可以重新生成条件图像;而当掩码为0时,分支可以生成两者之间的目标图像。这种方法通过卷积层的操作,使模型能够根据掩码的不同值来执行不同的生成任务。

目标图像分支
对于目标图像分支,将一个由零值像素组成的黑色图像与一个由零组成的掩码连接在一起,然后使用相同的零卷积操作来降采样图像,使其与UNet块的特征图大小相匹配。降采样后的条件图像与UNet块的输入相加。这个过程的目的与条件图像分支类似,根据掩码的值来执行不同的生成任务,其中掩码为1时生成条件图像,为0时生成目标图像。

零卷积操作通常用于降采样或上采样中的填充操作,它的作用是将输入的特征图的分辨率减小到与UNet块期望的特征图大小相匹配。

2.2 Correspondence-aware Attention(CAA)

(CAA)机制是 MVDiffusion 在多视图特征图之间强制对应约束的关键。

在这里插入图片描述
相关原理这里就不过多解释了,直接看原文吧。这里举个简单易懂的例子吧。

假设正在生成一个全景图像,其中包括 8 个透视图像。对于 CAA,我们关注其中一个像素位置( S S S)在源特征图中,现在我们想要计算这个像素与目标特征图(8 个透视图像的其中一个)之间的注意力。

  1. 首先,我们选择一个目标特征图( F l F^l Fl),然后选择目标图像中的一个像素位置( t l t^l tl
  2. 在这个位置附近形成一个局部邻域,假设 k = 3 k=3 k=3 考虑以目标像素 t l t^l tl 为中心的 3x3 邻域
  3. 对于源特征图中的像素位置( s s s)计算一个消息( m m m),该消息利用源特征图中的信息与目标特征图中的 t l t^l tl以及其周围的像素进行交互
  4. 消息 m 帮助我们确定在生成目标图像的过程中,如何受到源图像中相应位置的影响。

3. Train 阶段

在这里插入图片描述
ϵ θ i {\epsilon_\theta^i} ϵθi 表示第 i 个图像的估计噪声。 Z t i Z_t^i Zti是第 i 张图像的噪声潜在值。由于训练数据集远小于 SD 模型的预训练数据集,因此尽可能地冻结训练中的原始 SD 参数以保留原始泛化能力。

3.1 全景生成任务

只训练插入的 CAA 块。

3.2 多视图图像生成任务

(与原始 SD 的 512 × 512 相比,这部分任务的分辨率为192 × 256),SD 模型必须进行微调。

在第一阶段,我们使用所有ScanNet数据微调SD UNet模型,以调整分辨率。此阶段是没有 CAA 块的单视图训练(等式 1)。
在第二阶段,我们将CAA块和图像条件块集成到UNet中,只训练这些添加的参数。

4. 应用场景

全景生成 and 多角度深度图像生成

在使用过程中,推荐使用ChatGPT进行强化https://huggingface.co/spaces/tangshitao/MVDiffusion。

Text:

This bedroom is a harmonious fusion of classic and contemporary elements. It boasts a spacious reclaimed wood bed frame with a plush upholstered headboard, creating a cozy yet stylish centerpiece. On one side of the bed, there's a sleek modern nightstand with a minimalist lamp, while on the other side, a vintage-inspired dresser adds a touch of timeless charm. The color palette is soothing, with soft neutral tones that promote relaxation. Sunlight filters in through sheer curtains, casting a gentle glow on the room. This bedroom offers a perfect balance between comfort and elegance, making it an inviting space for rest and relaxation.

在这里插入图片描述

5. 代码部分

由于dropbox官网的预训练权重确实比较难下载,我将把权重放至网盘链接,稍后给出。

亮点工作的CAA机制代码详解后期更新……

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

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

相关文章

使用python-opencv检测图片中的人像

最简单的方法进行图片中的人像检测 使用python-opencv配合yolov3模型进行图片中的人像检测 1、安装python-opencv、numpy pip install opencv-python pip install numpy 2、下载yolo模型文件和配置文件: 下载地址: https://download.csdn.net/down…

参与现场问题解决总结(Kafka、Hbase)

一. 背景 Kafka和Hbase在现场应用广泛,现场问题也较多,本季度通过对现场问题就行跟踪和总结,同时结合一些调研,尝试提高难点问题的解决效率,从而提高客户和现场满意度。非难点问题(历史遇到过问题&#xf…

三模块七电平级联H桥整流器电压平衡控制策略Simulink仿真

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

[ubuntu]ubuntu设置虚拟内存

首先查看自己是否加过虚拟内存或者查看虚拟内存当前状态可以命令: free -mh 创建交换分区: sudo mkdir /swap cd /swap sudo dd if/dev/zero ofswapfile bs1024 count12582912 其中count是自己分配内存大小,上面为12GB,你可…

travel总结:

目录 1、前期准备: 2、项目期间: (1)注册功能的实现: 1、前端: 1、表单数据的校验:(js) 2、使用ajax完成表单提交 3、注册成功跳转页面 2、web: 1、获取表单数据、封装数据 2、调…

【Java8】线程问题排查分析

文章目录 thread dump简介JDK 工具jstackjattachjvisualvm Java程序CPU消耗较高,怎么快速看出是那个线程导致的呢?我们可以使用命令 jstack/jattach来快速定位问题 thread dump简介 thread dump 是 Java 进程的所有线程状态的快照。每个线程的状态都通过…

练[MRCTF2020]套娃

[MRCTF2020]套娃 文章目录 [MRCTF2020]套娃掌握知识解题思路代码分析1代码分析2 关键paylaod 掌握知识 ​ 参数的_符号的替换,正则和强等于联合绕过,jsfuck编码,bp请求方式的转变,本地ip的请求头,代码审计&#xff0c…

操作系统的五种IO模型

高级IO 阻塞IO 在内核将数据准备好之前,系统调用会一直等待,所有的套接字默认都是阻塞方式。 非阻塞IO 如果内核还未将数据准备好,系统调用仍然会直接返回,并且返回EWOULDBLOCK错误码。 非阻塞IO往往需要程序员循环的方式反复尝试…

TCP四次挥手

四次挥手发生在断开连接的时候,在程序中当调用了close()会使用TCP协议进行四次挥手。 客户端和服务器端都可以主动发起断开连接,谁先调用close()谁就是发起。 因为在TCP连接的时候,采用三次握手建立的的连接是双向的,在断开的时候…

电脑被删除的文件怎么恢复?2023年数据恢复方法分享

大多数人在使用电脑时都可能会遇到误删文件的情况。一不小心,重要的文件或数据就消失了,情急之下,大多会感到慌乱和无助。但其实,文件误删除并非不可挽回的灾难。本文将为大家介绍几种有效的文件恢复方法,以帮助大家在…

【力扣】42. 接雨水

这道题我卡了差不多1个小时,不是不会做,是不知道怎么能用栈来实现,后面看了一个博主的视频,豁然开朗,我主要的纠结点在于当指针指到7的时候,我计算出4到7的水块是2,但实际上是0,因为…

SpringBoot 可以同时处理多少请求

目录 一、前言 二、相关配置 1、配置信息 2、配置说明 3、案例说明 三、代码验证 1、测试代码 2、测试步骤 四、总结 一、前言 首先,在Spring Boot应用中,我们可以使用 Tomcat、Jetty、Undertow 等嵌入式 Web 服务器作为应用程序的运行容器。这…

Vue中如何进行拖拽与排序功能实现

在Vue中实现拖拽与排序功能 在Web应用程序中,实现拖拽和排序功能是非常常见的需求,特别是在管理界面、任务列表和图形用户界面等方面。Vue.js作为一个流行的JavaScript框架,提供了许多工具和库来简化拖拽和排序功能的实现。本文将介绍如何使…

抖捧自动直播市场火热,实体行业如何实现高效开播?

在AI数字人热度之后,最近抖捧场景自动直播开始火遍全网,因为操作简单成本极低,只需要一部手机放在店里,就可以高效开播,深受广大实体行业老板的认可,那么抖捧实景自动直播的方式,具体是怎么实现…

P1014 [NOIP1999 普及组] Cantor 表

#include <bits/stdc.h> using namespace std; int main() {int n,k1;cin>>n;while (n>k) {nn-k;k;}if(k%20) cout<<n<<"/"<<(k1-n);else cout<<k1-n<<"/"<<n;return 0; }

IDEA添加Vue文件模板

代码模板&#xff1a; <!-- *${COMPONENT_NAME} *author niemengshi *date ${DATE} ${TIME} --> <template> #[[$END$]]# </template> <script> export default { name: "${COMPONENT_NAME}", props: { }, components: {}, mounted: {}, d…

数据压缩与管理:掌握Linux VDO和LVM的力量

1.逻辑卷(LVM&#xff0c;Logical Volume Management) 动态的为服务器磁盘添加空间&#xff0c;而不会影响原磁盘的数据&#xff0c;也不需要对原始磁盘重新分区。 1.1 LVM介绍 以下是LVM的示意图&#xff1a; 我们拿到一块硬盘后首先对齐进行划分分区&#xff0c;也就得到…

CocosCreator3.8研究笔记(二十三)CocosCreator 动画系统-动画编辑器相关功能面板说明

国庆假期&#xff0c;闲着没事&#xff0c;在家研究技术~ 上一篇&#xff0c;我们介绍了动画剪辑、动画组件以及基本的使用流程&#xff0c;感兴趣的朋友可以前往阅读&#xff1a; CocosCreator 动画系统-动画剪辑和动画组件介绍。 今天&#xff0c;主要介绍动画编辑器相关功能…

FastThreadLocal 快在哪里 ?

FastThreadLocal 快在哪里 &#xff1f; 引言FastThreadLocalset如何获取当前线程私有的InternalThreadLocalMap &#xff1f;如何知道当前线程使用到了哪些FastThreadLocal实例 ? get垃圾回收 小结 引言 FastThreadLocal 是 Netty 中造的一个轮子&#xff0c;那么为什么放着…