跳到主要内容

👨‍🎨 [人工智能] AI 图像生成技术调研

· 阅读需 28 分钟
卤代烃
微信公众号@卤代烃实验室
引用

The sculpture is already complete within the marble block, before I start my work. It is already there, I just have to chisel away the superfluous material. ― Michelangelo


“在我雕刻之前,完美的雕塑已经长在大理石里了,我只是把多余的材料凿去罢了。” ― 米开朗基罗


如果说 2022 年 12 月 ChatGPT 的发布开启了 AI 大模型时代,那么 2022 年 8 月推出的各种表现很惊艳的「文生图」模型就是时代前的序曲。人们为 ChatGPT 表现出的智能惊叹,也被 DALL·E 2/Midjourney/Stable Diffusion 生成的创意图片惊艳。

本文档主要是对「AI 图像生成」这个技术的 发展历史/技术原理/使用技巧 做一些简单的介绍,帮助更多的人进入这个绚烂的创意世界。


主流应用

目前国际上「图像生成」应用主要是 3 个:

DALL·EMidjourneyStable Diffusion
是否开源最新版本如何使用
DALL·E 系列否,OpenAI 旗下产品DALL·E 3可以在 ChatGPT 中直接使用
Midjourney 系列Midjourney 6Discord 机器人
Stable Diffusion 系列Stable Diffusion 3,XL 等个人部署,国内小白一般使用 秋葉aaaki 的整合包

国内很多厂商也做了相关的生图应用,这里有自研的,也有基于开源模型 SD 训练/微调的,但整体上效果没有 DALL·E 和 Midjourney 的效果好,由于品类繁多,我就不一一列举了。


发展时间线

1 月2 月3 月4 月5 月6 月8 月9 月10 月11 月12 月
2020DETRDDPMDDIM
2021CLIP 🔗 DALL·EDMBG
2022BLIPDALL·E 2StableDiffusion Midjourney V3Stable Diffusion 2
2023BLIP2GPT4 Midjourney V5SAMDALL·E 3ChatGPTMidjourney 6
2024SoraStable Diffusion 3

上面的表格我列举了影响此次图片生成发展的关键技术进展,可以看到都是最近几年的事情:

  • 2020 年发表了 DETR/DDPM/DDIM 等一系列的重磅论文,完善了 Diffusion Model 这个理论模型
  • 2021 年发布了 CLIP 论文,建立了 text<->image 间的关系,为未来 text2image 奠定了理论基础
  • 2022 年应用井喷,DALL·E 2/Midjourney 3/Stable Diffusion 已可创建足够惊艳的作品
  • 2023 年之后主要是模型的优化/参数的扩展,提升生图的稳定性和上限

上面的专业名词是不是太多了看不大懂?没关系,下一章节我会用通俗的语言介绍一下模型的运行细节,帮助大家理解「图像生成模型」的原理,去更好的使用相关服务。


技术原理

3 大主流应用里,虽然有 2 个是闭源模型,但根据他们放出的论文,再加上 Stable Diffusion 的代码和论文,业内推测大家的技术底层细节都是类似的,主要基于两个模型:

  • CLIP 建立文字和图片之间的关系,实现跨模态的语义对齐
  • Diffusion Model 可以从一团噪音中「无中生有」,生成一张图片

两者互相结合,就能言出法随,通过文字生成图片。具体是怎么实现的,下面我们一一介绍。


CLIP

我们先说说 CLIP。

在常规的深度学习模型中,各个功能都是分开的。做 NLP 的模型只能处理文字内容,CV 相关的模型只能处理图像相关的内容。后面大家就有个想法,能不能让模型同时处理这些任务?

2024 年的 GPT-4o 就是这种多模态的代表,可以输入 图像/文字/音视频,然后输出 图像/文字/音视频。

但几年前还没有 GPT-4o 这么强大的东西。当时 OpenAI 在 21 年 1 月发布了论文《Contrastive Language-Image Pre-training》,用于匹配图像文本的预训练神经网络模型,旨在实现跨模态的语义对齐

这个论文很出色,后面的 DALL·E 和 Stable Diffusion 都依赖于 CLIP 做 TextEncoder,下面我们就说说这个算法的大致流程。


训练数据

要实现图像和文本的对齐,就需要先准备相关的训练数据集。计算机科学家需要先准备一组「文本-图像对」,用文字描述图片里的信息,然后把这些数据喂到相关模型里。

那么现实生活中如何找这么多的 text<->image 数据?答案是 HTML 都给你准备好了:

<img
src="/media/cc0-images/grapefruit-slice-332-332.jpg"
alt="Grapefruit slice atop a pile of other slices"
/>

HTML 的 img 标签天然带有 alt 属性,这个属性里的内容一般就是描述图像内容的。OpenAI 嘛,「大力出奇迹」驾轻就熟,他们从互联网上下载了 4亿 张带有 alt 标签描述的图片,然后把这部分图片当作训练集。

这时候有人肯定会提出疑问,alt 描述不一定准,完全的贴合图片信息啊。这个疑问是正常的,首先 alt text 会经过初步的清洗,去除一些显而易见的问题(例如广告),但是一力降十会,4 亿数据可以解决很多问题。当然,更精细的描述还是会提升模型能力的,后期的 DALL·E 3 和 Stable Diffusion 3 都通过增强训练集的准确度去提升模型的整体推理准确度的,但这是后话了。


预训练

有了数据就可以训练了。CLIP 希望能借助 对比学习(Contrastive Learning),让模型找到「文本-图像」的匹配关系。因为是两个模态,所以会使用两个模型分别提取特征:

  • Text Encoder:用来提取 text 的文本特征,选个 NLP 模型就行,比如说 Text Transformer
    • 输入:文字
    • 输出:[T1, T2, ... TN] 的特征值
  • Image Encoder:用来提取 image 的图像特征,选个 CV 里常用的 CNN 模型就行
    • 输入:图片
    • 输出:[I1, I2, ... IN] 的特征值

接下来就是对比学习的环节,根据两个特征值组合出 N2N^2 个可能的「文本-图像对」的相似度,正样本就是矩阵的对角线,也就是说,正样本只有 NN 个,负样本有 N2NN^2-N 个,CLIP 的训练目标就是最大化 NN 个正样本的相似度,最小化负样本的相似度。

经过 4亿 数据的学习,就可以建立「文本-图像」的匹配关系了。

提示

CLIP 有些 zero-shot 分类的功能,但是在本篇文档里并不是重点,所以就先略过了


Diffusion

名词由来

Diffusion,扩散,传播的意思,这个词是从热力学(Thermodynamics)里面借用的。

热力学里 Diffusion 的定义是这样的:

信息

扩散现象是指物质分子从高浓度区域向低浓度区域转移直到均匀分布的现象


扩散案例大家可以参考左边的这个墨水扩散视频。

扩散视频最终状态

可以想象到,只要时间够久,这杯水会变成右图,变成一杯颜色均匀的蓝色水。严谨一些描述,最后就是达到了一个各向同性的正态分布


那么这个现象迁移到图片里,就可以这样类比:

对于一张正常的图片(一杯水),我们向图片里加入随机噪声(蓝墨水),随机噪声越加越多(蓝墨水持续扩散),最后这张图片就会变为一张纯粹的噪点图(这杯水完全变为均匀的蓝水):

由此可以看出,这两件事儿相似点还是蛮多的,所以就把名字拿来,整个模型就叫 Diffusion Model。


感性理解

计算机科学是这样的,物理学只要说一句“覆水难收”就可以啥也不管了,但是在计算机科学里就要考虑的多了。因为这个加噪声的过程,是我们主动加的,所以我们就有操作的空间。

如果我们记录了每次加的噪声,那么反过来,每次都减少一些噪声,是不是就可以从噪点图里还原出来图片了:


原理浅析

上面只是给大家一个感性的认识,下面稍微理性(纯理性就全是数学公式了)的讲解一下技术细节。

如果我们要从一张 noise 图里生成一张照片,按我们上面的推论,就要一点一点的 denoise。这个 denoise 的结构是一样的,但是很明显,第 1000 步和第 1 步,去噪的程度是不一样的:


为了让模型知道每次的 denoise 用什么样的力度,所以需要对上面的模型做些变化,denoise 的输入除了一张噪点图,还要输入步骤


那么 Denoise 的结构是什么样的?从下面的图可以看出,里面有个很关键的 Noise Predicter 组件,它可以预测出这个步骤应该输出一张什么样的噪点图,然后让输入减去噪点,得到一张清晰一些的输出:


现在问题就转化为,如何训练一个 Noise Predicter。问题的关键点在于,Noise Predicter 怎么知道自己输出的噪点图,就是真正所需要的?这个很明显需要做训练去学习。那么我们就需要逆向思维一下,需要创造出相关的训练资料,然后训练它。

这个数据还是很好准备的。互联网上有很多的图片,拿到它们,然后给它们一点点加噪音,这样就得到很多分步骤的 noise image,这个流程叫做 Forward Process,也可以叫 Diffusion Process


上面这个步骤就创造了很多的训练数据!怎么理解呢? 上面的 Forward Process 的输入输出:

  • 输入:上步的 noise image,step,noise
  • 输出:下步的 noise image

Noise Predicter 的输入输出:

  • 输入:下步的 noise image,step
  • 输出:noise

这个训练思路非常巧妙,我们通过前向流程创造出大量的数据,就可以训练出需要反解的 Noise Predicter 了


到这一步还都是图像生成上,我们需要加入一些文字的引导。如果在 Denoise 阶段再输入文字,调整模型的预期,就能根据文字生成图片了:


当然,Noise Predicter 的输入改了,训练步骤也得做调整,Forward Process 阶段还得把文字放进去:

到这里,就可以通过文字提示生成图片了。


AI 生图底层架构

前菜都准备好了,两者结合就可以「文生图」了!

对于文生图模型来说,主要有 3 个组成部分(这 3 个部分都是独立的神经网络模型):

  • 一个 TextEncoder
    • 输入:文字描述
    • 输出:文字的特征向量
  • 一个 Generation Model(一般为 Diffusion Model)
    • 输入:文字特征向量和噪点图
    • 输出:中间产物 Latent Representation(可以先简单理解为图像的压缩版本)
  • 一个 Decoder
    • 输入:中间产物
    • 输出:图片

从论文中可以看出,Stable Diffusion 和 DALL-E 都是一样的架构(如下图),下面我们做一下 3 个部分的详解:


TextEncoder

从上面的 Diffusion 阶段可以看出,此时已经有基本的文生图能力了。Google 的一项研究发现,对于文生图模型来说,生图质量受文本语言模型的质量有很强的相关性,和图像生成模型的层数关系不大,所以好马配好鞍,我们需要一个更强大的语言模型。

模型本身需要建立「文本-图像」关系的能力,并且最后输出的内容为一个「文本特征向量」。这个在上面介绍的 CLIP 就可以做到。Stable Diffusion 和 DALL-E 的 TextEncoder 都是基于 CLIP 的,这里就不做详细介绍了。


Decoder

我们先讲 Decoder 部分,这样整体会比较好理解。

Decoder 的作用,是要从一个类似于噪点图的中间产物,生成最后的图片,那么我们应该如何得到这个 Decoder,或者说我们怎么训练这个 Decoder?Decoder 的训练在我看来还是比较巧妙的。

训练模型首先得要数据,我们先假设,这个中间产物就是一张「缩略图」,那么问题就转换为,如何从「缩略图」Decoder 为一张「高清图」?

  • 首先互联网上有很多的高清图,我们可以先把「高清图」压缩为「缩略图」,这样,我们就手动创造了 「缩略图-高清图」对
  • 接下来,利用这些数据对,就可以训练一个 Decoder,可以把「缩略图」还原为「高清图」


如果中间产物不是「缩略图」,而是一个人眼根本分辨不出的「高维噪点图」(这个场景我们一般称之为 Latent Representation),那么如何去创造数据对? 答案就是训练一个自编码器(autoencoder):

  • 这个模型先把图片 EncoderLatent Representation
  • 然后可以把 Latent Representation Decoder 为图片
  • 这样我们就得到一个 Encoder 和一个 DecoderDecoder 就可以拿来在最后一步用了


Generation Model

这个部分在上面的 Diffusion 章节也大致介绍了,但是出于工程上的性能考虑,会有一点点不一样。

之前的 Forward Process 阶段,都是直接加在图片上的(DDPM)。如果这个图片特别大,那消耗的性能就会特别大:

出于这个考虑,在工程上会把直接在原始尺寸上的操作,转换为在中间产物 Latent Representation 上处理(DDIM)。例如对于 Stable Diffusion 来说,它只是一个固定的(4,64,64)(4,64,64)矩阵,要比不定的原始尺寸小的多。

那么如何生成出 Latent Representation?上面的 autoencoder 已经训练好了,Encoder 可以直接在 Diffusion Model 的 Forward Process 阶段中使用。原图经过 Encoder 后,生成一个初始的 Latent Representation,然后基于此 Latent 再一点点的加噪音,算出最后需要的 Latent

上面的图就可以迭代为这张了,中间偏黄色的就是 Latent Representation


最后的 Diffusion Model 架构如下,在每一层的 Denoise 里:

  • 输入:每轮的次数,上一轮的 Latent,还有「文本特征向量」
  • 输出:经过一部分去噪的 Latent
  • 循环多轮
  • 最后交给 autoencoder 的 Decoder 解码,得到最后的图片


到此,AI 生图的底层架构就介绍完毕了:


和 Transformers 的关系

众所周知,这波 AI 浪潮是 OpenAI 引发的,现在最著名的 LLM 底层都是基于 Transformers 的。那么文生图领域和 Transformers 有什么交集呢?

这个其实搞清楚原始定义就可以了。Diffusion Model 是一种算法思想,Transformers 是一种神经网络架构。目前运用最广的 Diffusion Model 架构是基于 UNet 的,当然也可以切换到 Transformers。上个月更新的 Stable Diffusion 3 就将架构切换到了 Transformers,Sora(OpenAI 的 text2video 产品) 大家猜测也是基于 Transformers 的。


能力介绍

这里介绍一下 AI 生图中,最常见的一些基础能力。

Text2image (文生图)

文生图是「图像生成」的最核心功能,其流程如下:

  • 根据输入的 prompt 用 TextEncoder 提取 text embeddings
  • 生成一个随机噪音 noise
  • 把 text embeddings 和 noise 合并,送入 Diffusion Model
  • 循环多次,最后通过 Decoder 得到最终图像

在文生图里,有这么几个参数比较影响后期的成图质量:

  • Steps: 指推理过程中的去噪步数或者采样步数。采样步数越大,生成的图像质量越好,但是相应的推理时间也更久, SD 一般 30-50 步就能生成稳定图像
  • CFG_Scale:「输入图/prompt」的关联性。数字越大,「输出图」越接近「输入图/prompt」,但是会失真,越小越偏离原始输入,但质量更好。一般建议为 7-10
  • negative_prompt: 反向提示词,描述画面中不想出现的内容

Image2image (图生图)

图生图是文生图的一种变种,文生图的第一步是生成一个随机的噪音,如果我们直接给一张图片,然后给这个图片加噪(Diffusion),然后把这个加噪后图片和 prompt 做结合再去噪,就能学习到原图里的一些结构:

和文生图比,多了原图加噪的环节

和文生图相比,图生图又多了一个影响参数 —— strength

  • strength:这个参数介于 0-1 之间,表示对输入图片加噪音的程度,这个值越大加的噪音越多,对原始图片的破坏也就越大。一般 0.6-0.8 比较合适
    • 当 strength=1 时,其实就变成了一个随机噪音,此时就相当于纯粹的文生图了
    • 当 strength=0,就很容易产生过拟合了

Inpainting (图像局部重绘)

这个也是原始文生图能力的一个变种,可以对图像的局部细节做编辑,这些功能目前都在图像编辑器里有所落地。比如说:

  • 把一个背面的大象翻转过来,正面朝向用户
  • 把假期出去玩的照片 P 掉多余的人
  • 把衣服换个颜色
  • ...

我们简单看一下重绘的原理:

  • 输入一个原图,再输入一个 Mask
  • Mask 之外的图像经过技术操作,不要做任何改动,Mask 之内的图像加噪,并和 text embeddings 结合,做去噪
  • 生成最后的图像

Outpainting (扩图)

和 inpainting 类似,通过 mask 引导生成外扩图片。


ControlNet

AI 生图非常不稳定,ControlNet 在一定程度上解决了一些稳定性问题。目前主要可以靠 物体边缘/人物姿势骨骼/深度图 等方式控制。


LoRA (微调小模型)

LoRA 全名为 Low-Rank Adaptation,是一种高效微调模型的技术,可以让不同微调权重可以简单地组合到 base model 上。在 Stable Diffusion 社区里,分享自己的微调的 LoRA 模型非常的火热,可以生成出特定风格的图片。

去年特别火的动漫模型 NovelAI 就是训练了一堆动漫图片做的微调:


现有不足

  • 由于 Diffusion Model 本质上还是概率模型,所以在 prompt 一致的情况下,出图质量还是得看“手气”,所以使用者一般称之为 “抽卡”,能不能得到想要的图还是看运气
  • 出图的结果为一张整图,没有图层。这意味着对于动不动有几百个图层的艺术工作者来说,很难基于 AI 图做调整和修改,这个导致对现在的图像工作流来说,只能做些创意引导,小功能替代(例如抠图,生成小的配图装饰)等工作
  • 版权问题。由于训练过程中,学习了很多艺术家的风格,而且 Stable Diffusion 是开源的,使用者可以非常方便的做风格微调。这将产生很多的版权问题,尤其会影响现有艺术家
  • 业内抵制声浪严重。网易/B站 等公司将 AI 图运用到游戏等场景(例如宣传 banner,人设图,立绘图)后,被很多用户抵制。后续一般为厂商光速滑跪并声明不再使用(实际上还是在偷偷用,例如生成一些无关紧要的小图)。部分画师和粉丝采用污名化的方式,声称 AI 生图为 “拼尸块儿”,对立现象严重

参考内容