浅谈图像生成模型 Diffusion Model 原理

news2024/10/5 13:16:53

重磅推荐专栏: 《Transformers自然语言处理系列教程》
手把手带你深入实践Transformers,轻松构建属于自己的NLP智能应用!

可不可以先 点击下方链接,求赞 点击 like ❥(^_-) 一下我的 Model 和 Space,再看后面的正文~~:
Model 、 Space

………………………………………………………………

近年来,图像生成技术发展迅速,越来越多的人开始关注和探索各种图像生成模型。而 Diffusion Model 作为其中的一种,其在生成高质量图像方面具有重要意义。在本次分享中,我们将探讨 Diffusion Model 的原理和实现方式。希望本次分享能够帮助大家更深入地了解这一领域的技术和方法,以及启发您进一步探索和研究。

1. 什么是 Diffusion Model,它是如何生成图像的?

在介绍 Diffusion Model 之前,我们先来了解一下生成模型。通俗来说,生成模型是一种人工智能算法,其基本思想是让计算机自动学习一些数据的统计规律,并利用这些规律生成新的数据,比如图像、音频等。这种技术的应用非常广泛,比如可以用于文本生成、图像生成、视频生成等领域。
而 Diffusion Model 是一种比较新的图像生成模型,其最大的特点就是可以生成高质量的图像。它的生成原理非常有趣,实际上,Diffusion Model 是一种基于去噪技术的图像生成 Denoise Model。这就意味着,在生成图像的过程中,它实际上是在不断地去除噪声和随机性的影响,从而逐渐得到一个越来越真实、越来越精细的图像。

1.1 Diffusion Model 原理

  • 首先,Denoise Model 需要一个起始的噪声图像作为输入。这个噪声图像可以是完全随机的,也可以是一些特定的模式(如 高斯分布)或者形状。
  • 接下来,随着 denoise 的不断进行,图像的细节信息会逐渐浮现出来。这个过程有点像冲洗照片,每次冲洗都会逐渐浮现出照片中的细节和色彩。denoise 的次数越多,生成的图像就越清晰、越细腻。
  • 最后,Denoise Model 会根据用户的需求输出最终的图像。

    Denoise 过程中,用的都是同一个 Denoise Model为了让 Diffusion Model 知道当前是在哪个 Step 输入的图片,实际操作过程中会把 Step 数字作为输入传递给模型。这样,模型就能够根据当前的 Step 来判断图像的噪声程度,从而进行更加精细的去噪操作。

1.2 Denoise Model 的内部


实际上,Denoise Model 内部做了一些非常有趣的事情来生成高质量的图像。
首先,由于让模型直接预测出去噪后的图片是比较困难的事情,所以 Denoise Model 做了两件事情:

  • 首先,它会把噪音图片和当前的 Step 一起输入到一个叫做 Noise Predicter 的模块中,这个模块会预测出当前图片的噪音。
  • 接下来,模型会对初步的去噪图片进行修正,以达到去噪效果。具体来说,模型会通过像素值减去噪音的方式来进一步去除噪音。

1.3 如何训练 Noise Predictor?


要训练 Noise Predictor,我们需要有 Ground truth 的噪音作为 label 进行有监督的学习。那么,各个 Step 的 Ground truth 从哪里来呢?

我们可以通过随机产生噪音的方式来模拟扩散过程(Diffusion Process)。具体来说,我们从原始图像开始,不断地加入随机噪音,得到一系列加噪后的图像。这些加噪后的图像和当前的 Step 就是 Denoise Model 的输入,而加入的噪音则是 Ground truth。我们可以用这些 Ground truth 数据来训练 Noise Predictor,以便它能够更好地预测出当前图像的噪音。

1.4 Text-to-Image

有些同学问了:我见到的 Diffusion Model是Text-to-image Generator,基于文本生成图片。为什么你这个没有文本的输入呢?

确实,有些 Diffusion Model 是基于文本生成图片的,这意味着我们可以将文本作为输入来生成图片。

每一个 step,文本都可以作为 Denoise Model 的输入,这样可以让模型知道当前应该生成什么样的图片。


具体来说,我们可以将文本输入到 Noise Predictor 中,以便预测出噪音来去噪。

2. Stable Diffusion、DALL-E、Imagen 背后共同的套路是什么?


Stable Diffusion、DALL-E、Imagen 这些模型的共同之处在于它们都使用了三个模块来生成图像:

  • 首先,通过 Text Encoder 模块,将输入的文本编码成为一个表征向量
  • 然后, Generation Model 模块会利用这个表征向量生成一个图像表征向量,可以把它看作是图像的压缩版本
  • 最后,通过 Decoder 模块,将这个图像表征向量解码为一张清晰的图像

2.1 Stable Diffusion


Stable Diffusion 是一个比较热门的开源 Diffusion Model,它的架构如上图所示。

  • 它的 Encoder 输入可以不仅仅是文本,还可以是图像等条件。
  • 它的 Generation Model 使用的是 Denoising U-Net,引入了交叉注意力机制(cross attention),以加入多模态的条件
  • 同时,它还使用了预训练的通用 VAE将输入的图片压缩到潜空间(latent space),然后再进行扩散过程

2.2 DALL-E


DALL-E是由OpenAI发布的一种Diffusion Model,它的架构如上图所示。
它利用CLIP方法得到文本和图像的表征向量。CLIP objective是一种对比学习方法,通过训练模型使其同时理解文本和图像,以便将文本描述和对应的图像紧密联系起来。在训练过程中,模型会从数据集中随机选择一个文本描述和对应的图片作为正样本,随机选择另一个文本描述和不属于该文本描述的图片作为负样本。模型的目标是使正样本的相似度高于负样本的相似度。

DALL-E利用CLIP objective实现了文本和图像之间的交互,即给定一个文本描述,DALL-E可以生成与该描述相符合的图像。具体而言,DALL-E的生成过程如下:

  • 首先将给定的文本描述编码成文本表征向量
  • 然后将该向量输入到DALL-E的生成模型(prior 模块)中,生成一个图像表征向量。
  • 最后,将该图像表征向量输入到DALL-E的解码器中,生成最终的图像。

DALL-E的生成模型有两种实现方式:

  • 第一种是利用Autoregressive模型(例如GPT),输入文本表征,生成图像表征向量降维(如PCA)后的表征
  • 第二种是利用Diffusion,输入文本表征,生成大小一致的图像表征向量。

2.3 Imagen


Imagen是Google发布的一种文本到图像生成的Diffusion Model,它可以根据给定的文本描述生成一张高清晰度的图片。整个生成过程包含三个主要模块:Frozen Text Encoder、Text-to-Image Diffusion Model和Super-Resolution Model

  • 首先,Frozen Text Encoder将输入的文本描述编码成一个Text Embedding
  • 然后Text-to-Image Diffusion Model根据Text Embedding从随机噪声图开始,不断迭代产生一张与输入描述匹配的64x64小图
  • 再由Super-Resolution模块根据Text Embedding放大到256x256的中等尺寸图像,最终通过另一个Super-Resolution模块根据Text Embedding产生1024x1024的高清晰度图像

为了实现更好的生成效果,Imagen采用了一些优化措施。

  • 其中,text encoder采用T5模型的encoder,测试结果表明T5-XXL效果最佳,其对应参数量为4.6B。

  • Text-to-Image Diffusion Model使用U-Net结构,并插入一些注意力层,以更好地利用文本信息

  • 而Super-Resolution模块同样使用U-Net结构,为减少显存占用、加速收敛、提升推理速度,Imagen对其进行了优化,称为Efficient U-Net。具体来说,

    • Efficient U-Net采用了更多的ResNetBlock在低分辨率部分,使得模型参数量分布偏向低分辨率部分
    • 同时将skip connections缩放一个系数1/sqrt(2),有助于模型更快收敛
    • 并且采用了先降采样再卷积的DBlock模块和先卷积再上采样的UBlock模块,以提升模型的推理速度

3. Dreambooth 和 LoRA 是什么?它们如何教授模型新的概念?如何生成小鹏P7的图像?

现在我们有了Diffusion Model(如 开源的Stable Diffusion),可以生成与文字描述匹配的图像。那该如何教授模型新的概念,让它生成我们自己领域内的图像呢?比如我们可以输入“小鹏汽车P7”相关的文字描述,它就能生成一张符合这个描述的图片。
当然,我们可以 finetue 模型,喂给模型“小鹏汽车P7”的<image,text> pair 训练数据。但是直接微调大模型可能有两个问题:

  • 过度拟合。因为我们的训练数据集非常小,直接用这个模型可能会过于专注于输入图像的主体上下文和外观,而且可能会将训练图像的一些特定姿势或背景等特征过度拟合到生成的图像中,导致生成的图像看起来不自然、失去多样性。如下图第二行,狗的姿势被固定了,趴在一个东西上。
  • 语言漂移。因为Diffusion模型是基于大量语料库训练的,但在生成具体领域的图像时需要特定的领域知识,如果直接微调大模型可能会导致模型失去特定于领域的先验知识。具体来说,由于文本提示同时包含 [identifier](如“小鹏汽车P7”) 和 [class noun](“汽车”),当扩散模型在进行微调时,我们观察到它会慢慢忘记如何生成同一类的主题并逐渐忘记特定于class的先验知识,并且不能生成相关类的不同实例(即 所有的“汽车” 可能都变成了 “小鹏汽车P7”)。

    如上图第二行显示了在特定的“XX狗” 图像上对模型进行微调后生成的“狗”图像的一些示例。结果清楚地表明,这个模型由于这次的微调失去了生成一般的狗图像的能力

3.1 Dreambooth:学了新的,不忘了旧的


我们有了一种文本到图像的扩散模型,可以根据输入的文本生成相应的图像。但是,如果我们只有三到五张特定对象的图片,我们可以通过给模型输入这些图片的同时,加上一个包含特定对象的名称和类别的文本提示来微调模型,例如“一只[V]狗”。同时,我们还可以应用一种特定于类别的先验保护损失(a class-specific prior preservation loss),它利用模型对该类别的语义先验,并鼓励模型生成多样的属于该类别的实例,例如在文本提示中输入“一只狗”。这样可以让模型更好地生成与特定对象相似的图像。

3.2 LoRA:不想训练大模型?加个旁路

如果我们不想给大模型做 “大手术”—— finetue 训练大模型(成本太高了 ==),毕竟我们只是仅仅想教授模型一个新的概念,其他预训练的先验知识都不用变动。那应该如何做到呢?
可以尝试LoRA(Low-Rank Adaptation)!LoRA是一种低秩适应方法,可以用于神经网络的微调和适应。其主要原理是,在微调神经网络时,只优化低秩分解矩阵,而保持预训练的权重不变。具体来说,LoRA 允许我们通过优化自适应期间密集层(dense layers)变化的秩分解矩阵,来间接训练神经网络中的一些密集层,同时保持预训练的权重冻结

如上图所示,我们只训练A和B部分的参数,其中,r 远小于 d。A 部分参数初始化符合高斯分布。为了让训练最初输出的 h 的值 和 预训练大模型输出相同,B部分 参数的初始化为0。

上图为GPT-3 175B 验证精度与 WikiSQL 和 MNLI 匹配上的几种自适应方法的可训练参数数量的关系。 LoRA 表现出更好的可扩展性和任务性能。使用LoRA,175B 的 GPT-3 只需 18M Trainable Parameters就能有很好的表现了。

总的来说,LoRA具有以下优点:

  1. 可以共享预训练模型并用于构建许多不同任务的小型LoRA模块。通过冻结共享模型,我们可以通过替换上图中的矩阵A和B来高效地切换任务,从而大大降低存储要求和任务切换开销。
  2. LoRA使得训练更加高效,并且可以降低硬件要求,使得使用自适应优化器时,计算梯度或维护优化器状态的大部分参数不再需要。相反,LoRA仅优化注入的、更小的低秩矩阵,从而使得训练更加高效。
  3. LoRA的简单的**“旁路”线性设计使得我们可以在部署时将可训练的矩阵与冻结的权重合并**,(相比“串联”的添加额外模块)不会引入推理延迟
  4. LoRA与许多先前的模型训练方法无缝对接,如prefix-tuning等。

3.3 小 Demo

3.3.1 小鹏P7

我们尝试利用十几张 “小鹏P7汽车” 相关的图像样本,基于开源的中文Stable-Diffusion(IDEA-CCNL/Taiyi-Stable-Diffusion-Chinese) 基础上进行了(Dreambooth + LoRA)微调,Trainable 模型文件大小只有 3M。
我们把 prompt 设置为:小鹏P7汽车,蓝天,草地,4K照片,高清
来分别看下开源的中文Stable-Diffusion 以及其经过训练后的效果:

  • IDEA-CCNL/Taiyi-Stable-Diffusion-Chinese:
  • IDEA-CCNL/Taiyi-Stable-Diffusion-Chinese + Dreambooth + LoRA:

可以对比发现:

  • 经过微调的模型,基本上能够学到 “小鹏P7汽车” 的车身外形,虽然看起来有点变形 ==
  • 由于prompt没有明确车身颜色,模型泛化出了 “小鹏P7汽车” 实际上不存在的颜色,如微调后生成的第3、第4张图。
  • 在细节方面,模型学习的了小鹏汽车的车标“X”,但是车牌上的数字学不到,如微调后生成的第3张图。可能的原因是:
    • 训练数据的每张图片车牌内容不一样,模型比较难学
    • 看到微调前生成图像车牌也是模糊的,所以才可能是隐私的缘故,预训练大模型的训练数据中的车牌可能就已经做了去隐私处理了。

3.3.2 宝可梦

最后再安利一下最开始的可爱的宝可梦demo:
Model 、 Space

求赞:

from diffusers import StableDiffusionPipeline
import torch

pipe = StableDiffusionPipeline.from_pretrained("IDEA-CCNL/Taiyi-Stable-Diffusion-1B-Anime-Chinese-v0.1", torch_dtype=torch.float16)
model_path = "souljoy/sd-pokemon-model-lora-zh"

pipe.unet.load_attn_procs(model_path)
pipe.to("cuda")
pipe.safety_checker = lambda images, clip_input: (images, False)

prompt = "粉色的蝴蝶,小精灵,卡通"
image = pipe(prompt, num_inference_steps=50, guidance_scale=7.5).images[0]
image

prompt = "可爱的狗,小精灵,卡通"
image = pipe(prompt, num_inference_steps=50, guidance_scale=7.5).images[0]
image

prompt = "漂亮的猫,小精灵,卡通"
image = pipe(prompt, num_inference_steps=50, guidance_scale=7.5).images[0]
image



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

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

相关文章

深度学习基础入门篇[七]:常用归一化算法、层次归一化算法、归一化和标准化区别于联系、应用案例场景分析。

【深度学习入门到进阶】必看系列&#xff0c;含激活函数、优化策略、损失函数、模型调优、归一化算法、卷积模型、序列模型、预训练模型、对抗神经网络等 专栏详细介绍&#xff1a;【深度学习入门到进阶】必看系列&#xff0c;含激活函数、优化策略、损失函数、模型调优、归一化…

学习小程序基础内容之页面结构

一个小程序页面由四个文件组成&#xff0c;分别是&#xff1a; 文件类型 必需 作用 js 是 页面逻辑 wxml 是 页面结构 json 否 页面配置 wxss 否 页面样式表wxss 否 页面样式表[TOC] 但是我们创建一个页面&#xff0c;最快的方法是在app.json 里面&#xff0c;命名一个文件&a…

Win10输入法设置,详细方法在这里!

案例&#xff1a;win10输入法怎么设置 【想问问大家知道win10输入法该怎么设置吗&#xff1f;想更改一些默认的设置&#xff0c;不知道该如何操作&#xff0c;感谢&#xff01;】 Win10输入法是在Win10操作系统下使用的一种输入工具&#xff0c;是Win10系统的默认输入法&…

【Vim】 【初始篇】Vim之增删改查(idcf)中的改(c)

前言&#xff1a; 都说上古神器vim&#xff0c;可以提高效率&#xff0c;但是我觉得它更能增加乐趣&#xff0c;还能装B于无形。所以我准备开个新的板块用于记录vim使用中的骚操作。 VS2022 使用Vim 作为一个.net程序员&#xff0c;不可能完全脱离vs而使用专门vim编辑器&#x…

Linux文件系统 文件恢复

inode和block block 用于存储文件数据。 文件是存储在硬盘上的&#xff0c;硬盘的最小存储单位叫做“扇区”&#xff08;sector&#xff09;&#xff0c;每个扇区存储512字节。连续八个扇区组成一个"块"&#xff08;block&#xff09;&#xff0c;一个块是4K大小&…

极豆科技加入飞桨技术伙伴计划,共筑智能网联汽车新生态

近日&#xff0c;极豆科技正式加入百度飞桨技术伙伴计划&#xff0c;双方将共同努力&#xff0c;联合推进人工智能、大数据、云计算等前沿技术在智能网联汽车领域的应用落地&#xff0c;携手推动汽车产业变革&#xff0c;加速车企迈向全面数字化。 上海极豆科技有限公司‍‍‍‍…

Java并发基石_CAS原理实战01_CAS机制入门

快了&#xff0c;快要拿到offer了&#xff01;&#x1f339; 案例引入&#xff1a; 开发一个网站&#xff0c;对访问量进行统计&#xff0c;用户每发送一次请求&#xff0c;访问量就1&#xff0c;模拟有100个人同时访问&#xff0c;并且每个人对网站发起10次请求&#xff0c;所…

Nginx+Tomcat负载均衡、动静分离群集

Tomcat优化 Tomcat是java开发的应用程序&#xff0c;作用&#xff1a;作为web服务器处理html页面&#xff0c;但能力一般&#xff0c;更多的用于jsp、servlet容器处理java开发的jsp动态页面。 组织架构&#xff1a;连接器 、 容器 连接器&#xff1a;暴露端口&#xff0c;接…

云表:无代码“打破”工业软件开发壁垒,数字化只需"画表格"

无代码已成为新兴趋势 近年来&#xff0c;在如火如荼的制造业数字化转型浪潮中&#xff0c;“无代码开发”也因其敏捷、易用的独有特性&#xff0c;助力企业实现数字化应用的快速开发与落地&#xff0c;使得数据业务价值在企业级场景下释放&#xff0c;受到市场广泛关注。据国际…

003 常用组件开发使用

目录 一.基础组件 Blank:填充控件 Button&#xff1a;按钮 ButtonType枚举说明 Text&#xff1a;文本显示 QRCode 二.常用布局 线性布局&#xff08;Row和Column&#xff09; 层叠布局 弹性布局&#xff08;Flex&#xff09; 一.基础组件 Blank:填充控件 这个是鸿蒙…

涨薪5k,100多天从功能测试进阶自动化测试,我整理的超全学习指南

个人简介 学渣一枚&#xff0c;2017年6月某大专学校毕业&#xff0c;从事功能测试已经4年&#xff0c;最初毕业是从事了一份销售的工作&#xff0c;工资当时好像是3k&#xff0c;可能也是我个人的原因不适合销售&#xff0c;后来在朋友的介绍下转行到了测试行业&#xff0c;转…

访问者模式解读

目录 问题引进 访问者模式基本介绍 基本介绍 访问者模式的原理类图 对原理类图的说明 访问者模式应用实例 思路分析和图解(类图) 代码实战 应用案例的小结 访问者模式的注意事项和细节 优点 问题引进 测评系统的需求 1) 将观众分为男人和女人&#xff0c;对歌手进行…

FPGA基于XDMA实现PCIE X8通信方案测速 提供工程源码和QT上位机程序和技术支持

目录 1、前言2、我已有的PCIE方案3、PCIE理论4、总体设计思路和方案5、vivado工程详解6、驱动安装7、QT上位机软件8、上板调试验证9、福利&#xff1a;工程代码的获取 1、前言 PCIE&#xff08;PCI Express&#xff09;采用了目前业内流行的点对点串行连接&#xff0c;比起 PC…

Ceph手动部署(开发版本)

手动部署 监视器引导管理器守护程序配置添加 OSD 简写形式长格式添加 MDS总结在 FreeBSD 上手动部署 FreeBSD 上的 Disklayout 配置监视器引导添加 OSD 长格式添加 MDS总结 手动部署 所有 Ceph 集群至少需要一个显示器&#xff0c;并且至少需要与 存储在群集上的对象的副本…

Hacked某安汽车车机系统

很久之前尝试对某安汽车的车机系统进行渗透测试&#xff0c;但是却卡在入口无法进入&#xff0c;尝试暴力破解但是字典不够强大&#xff0c;没能成功。前段时间看到了绿盟科技博客的《新型车机&#xff0c;如何攻防&#xff1f;》感觉有点熟悉&#xff0c;再次探索发现可以获得…

京东商品评论数据爬虫,包含对数据的采集、清洗、可视化、分析等过程,作为数据库课程。

感谢大家的star和fork&#xff0c;为了感谢大家的关注&#xff0c;特意对代码进行了优化&#xff0c;对最新的url格式进行了更新&#xff0c;减少了一些冗余的参数&#xff0c;希望能够帮助大家入门爬虫&#xff0c;已经爬好的京东的商品评论数据已经存储在data目录下&#xff…

软件测试标准GB/T 25000.51-2016中的八大软件质量特性

GB/T25000标准由下图所示的21个部分组成&#xff0c;其中GB/T 25000.10和GB/T 25000.51是建立软件测试技术体系可以参考的部分&#xff0c;GB/T 25000.51尤为重要。 GB/T 25000标准总标题&#xff08;21个部分&#xff09; GB/T 25000.51标准pdf封面 GB/T 25000.51-2016 《系统…

现在有t1,t2,t3三个线程,实现t1,t2线程同步执行,然后再执行t3线程,使用Java实现该程序

目录 1、利用CountDownLatch 2、利用Future 最近在面试的时候&#xff0c;经常遇到这个题目&#xff0c;首先从题目上看&#xff0c;就知道考察的是多线程方面知识&#xff0c;我第一次看到这个题目的时候&#xff0c;就想到了使用CountDownLatch这个计数器来实现&#xff0c…

AUTOSAR网络管理

功能说明 目前车辆上ECU的数目越来越多&#xff0c;不同功能的ECU对电源有不同的要求&#xff0c;在点火钥匙打到OFF档&#xff08;KL15停止供电&#xff09;之后&#xff0c;有的ECU&#xff08;如座椅模块&#xff09;允许直接断电&#xff0c;有的ECU&#xff08;如空调模块…

浅谈操作系统OS与计算机软硬件体系结构,自顶贯穿性与行为回归硬件性

操作系统OS与计算机软硬件体系结构 使计算机更好用! 这是操作系统的根本要义!! 操作系统这个概念基本上以后会讲一路的&#xff0c;今天的话就基本上讲一下轻量化的概念。所以操作系统到底是什么&#xff1f;操作系统首先是软件&#xff0c;那它是一款什么软件呢&#xff1f…