【白话科普】10分钟从零看懂AI绘画原理

图片

图片

👉腾小云导读

计算机如何生成和真实图片相似的图画?模型是如何听懂我们想要它生成什么并给出对应结果?AIGC 热潮中的 Stable Diffusion、NovelAI、Latent upscale、ControlNet、LoRA等等是什么以及有什么亮点?本篇不涉及任何一个数学公式、不涉及晦涩文献解析,而是通过尽可能直白的解释,让没有太多AIGC背景知识的人也可以快速理解 AI 画画背后的技术原理和发展历史。欢迎阅读和分享。

👉看目录点收藏,随时涨技术

1. 计算机如何生成图画?

2. 如何控制画面内容?

2.1 如何理解文本?

2.2 如何控制生成的结果?

3. 为什么 AI 画画效果如此惊人?

4. ControlNet:让我们控制扩散模型

5. 潜在上限

6. LoRA:大型语言模型的低秩自适应

7. mov2mov

AI 画画这个领域发展太快了,要知道去年的 AI 画画还是这个画风:

图片

现在的 AI 画画已经迅速进化到这个程度,我们举个例子:

施法咒语长这样——

film still, [film grain], large crowds, cyberpunk street, street level photograph, Chinese neon signs, time square advertisements, Dark atmospheric city by Jeremy Mann, Nathan Neven, James Gilleard, James Gurney, Makoto Shinkai, Antoine Blanchard, Carl Gustav Carus, Gregory Crewdson, Victor Enrich, Ian McQue, Canaletto, oil painting, brush hard, high quality, (brush stroke), matte painting, (very highly detailed)

生成结果长这样——

图片

关于近期各个效果惊人的模型,目前市面上已经有不少介绍文章,但大部分比较晦涩难懂。所以本文将尽可能通俗、直白地解释 AI 绘画的原理,欢迎各位阅读。开发者朋友们在阅读完本篇后,可以进一步阅读本公众号今日推送的次条文章,跟随腾讯工程师的教程快速部署 Stable Diffusion Web UI,以及《给想玩AIGC的小白:教你从0搭一个图文视频生成网站(附插件&源码)》一文,上手打造AI绘画网站~

点下方关注并星标腾讯云开发者,回复**「AIGC」,一键领取0基础AI绘画**网站搭建教程、模型源件、工具插件、网站源码和部署模型所需GPU服务器限量优惠券。

01、计算机如何生成图画

这章我们会提到几个大家耳熟的概念:VAE、auto-encoder、GAN、Diffusion model 等等。阅读完这章,你将能有更清晰认知。言归正传,AI 是怎么学会画图的呢?

这就要涉及到两个方面了。一个是能生成像真实图片一样的数据,一个是要听得懂我们想要它生成什么,并给出对应的结果。

首先来看看如何生成像真实图片一样的数据。这涉及到机器学习中的一个重要分支——生成模型(generative model)。对于生成图像这个任务来说,通常一个生成模型需要先吞进大量的训练数据(巨量的人类真实图片),然后再学习这些数据的分布,去模仿着生成一样的结果。机器学习的核心无非就是这么回事,难点终究是在如何设计模型、让模型能更好的学到这样的分布上。

要讲生成模型,有一个不得不提的技术就是 VAE(变分自编码器,即 variational auto-encoder)。这其中的 auto-encoder,虽然叫 auto-encoder ,但是其实包含了编码器 encoder 和解码器 decoder,是一个对称的网络结构。对于一系列类似的数据例如图片,虽然数据量很大,但是符合一定分布规律的,信息量远小于数据量。编码器的目的就是把数据量为 n 维的数据压缩成更小的 k 维特征。这 k 维特征尽可能包含了原始数据里的所有信息,只需要用对应的解码器,就可以转换回原来的数据。在训练的过程中,数据通过编码器压缩,再通过解码器解压,然后最小化重建后数据和原始数据的差。训练好了以后,就只有编码器被用作特征提取的工具,用于进一步的工作,例如图像分类等应用中。故,称为 autoencoder。

图片

这时候有人想到:既然 auto-encoder 可以从 k 维特征向量恢复出一整张图片,那给你一个随机生成的 k 维特征向量,是否也可以随机生成什么画面呢?

然而实际结果显示,autoencoder 虽然可以「记住」见过的照片,但是生成新图像的能力很差。于是就有了 variational auto-encoder。VAE 令 k 维特征中的每个值变成了符合高斯分布的概率值,于是概率的改变可以让图片信息也有相应的平滑的改变,例如某个控制性别的维度,从 0 到 1 可以从一个男性的人脸开始,生成越来越女性化的人脸。

图片

通过控制特征变量来操控人脸生成结果。

VAE 其实还是有很多统计假设的,而且我们要判断它生成的效果如何,也需要评估它生成的数据和原始数据的差距大不大。于是有人丢掉所有统计假设,并且把这个评估真(原始数据)假(生成数据)差异的判别器也放进来一起训练、创造了 GAN,生成对抗神经网络。

GAN 有两个部分——生成器和判别器。生成器从一些随机的 k 维向量出发,用采样网络合成大很多的 n 维数据,判别器就负责判断合成出来的图片是真是假。

一开始合成出来的都是意义不明的无规律结果,很简单的判别器就可以分辨出来。生成器发现一些生成的方向,例如有成块的色块可以骗过判别器,它就会往这个方向合成更多的图片。而判别器发现被骗过去了,就会找到更复杂的特征来区分真假。如此反复,直到生成器生成的结果,判别器已经判断不出真假了,这就算是训练好了。这样训练出来的生成器可以生成非常逼真的、即使是人眼也很难分辨的图片,但是是不存在的。到了这时候,计算机已经能学会生成相当逼真的画面了,例如下面这张人脸:

图片

虽然 GAN 因为引进了判别器,能生成非常逼真的图片,但是它由于要训练对抗网络,实在是太不稳定了,面对吞噬了网络巨量数据的超大规模网络来说非常难以控制。这时候另一个更好的选择出现了。也是现在的 AI 画画普遍使用的生成模型——Diffusion model(扩散模型)。

Diffusion model 生成图片的过程看似很简单,其实背后有一套非常复杂的数学理论支撑。复杂的理论先放一边,我们先通俗地聊聊 Diffusion model 是怎么运行的。

图片

上图是 Diffusion model 运行的两个过程。右边是一个正常的图片,从右到左(Forward Diffusion)做的事情是在逐次叠加符合正态分布的噪声,最后得到一个看起来完全是噪声的图片,这就是所谓的“扩散(diffusion)”过程。你可以不严谨地想象成你有一块牛排,你一遍一遍地往上撒椒盐,一直到整块牛排都被椒盐覆盖到看不清原来的纹路。由于每次加噪声只和上一次的状态有关,所以是一个马尔科夫链模型,其中的转换矩阵可以用神经网络预测。

从左到右(Reverse Diffusion)做的事情是一步步去除噪声、试图还原图片,这就是 diffusion model 生成数据的过程。

为了达到去噪的目的,Diffusion model 的训练过程实际上就是要从高斯噪声中还原图片,学习马尔科夫链的概率分布、逆转图片噪声,使得最后还原出来的图片符合训练集的分布。

这个去噪的网络是如何设计的呢? 我们可以从叠加噪声的过程中发现,原图和加噪声后的图片尺寸是完全一样的!于是很自然能想到用一个 U-net 结构(如下图)来学习。

图片

U-net 是一个类似 auto-encoder 的漏斗状网络,但在相同尺寸的 decoder 和 encoder 层增加了直接的连接,以便于图片相同位置的信息可以更好通过网络传递。在去噪任务中,U-net 的输入是一张带噪声的图片,需要输出的是网络预测的噪声,groundtruth 是实际叠加上的噪声。有了这样一个网络,就可以预测噪声,从而去除掉它,还原图片。因为带噪声的图片=噪声+图片。这也是为什么 Diffusion model 会比其他方法生成图片更慢,因为它是需要一轮一轮去噪的,而不是网络可以一次性推理出结果。

以上就是 Diffusion model 生成图片的原理,是不是很简单呢!

02、如何控制画面内容

上面解释了计算机如何生成和真实图片相似的图画。接下来解释一下模型是如何理解我们想要它生成什么,并给出对应的结果的。

2.1如何理解文本?

玩过 AI 画画的人应该都知道,AI 画画最主流的模式是在网页输入框中输入一长串吟唱咒语。其中包括想要生成的内容主体、风格、艺术家、一些 buff 等,点击生成后就可以得到一张非常 amazing 的结果(也可能很吓人)。

文字控制模型生成画面最早的做法,其实更像是让生成模型生成一大堆符合常理的图片之后,再配合一个分类器来得到符合条件的结果。在海量的数据面前这显然是不够用的。这个领域的开山之作——DALL·E 中最值得一提的是引入了 CLIP 来连接文字和图片。

CLIP 模型其实就是用了巨量的文本+图片数据对,把图片和文本编码后的特征计算相似性矩阵,通过最大化对角线元素同时最小化非对角线元素,来优化两个编码器,让最后的文本和图片编码器的语义可以强对应起来。

图片

如果不能理解 CLIP 的原理,只要记住 CLIP 把文字和图片对应起来了就可以了。它最大的成功之处不是用了多复杂的方法,而是用了巨量的数据。这样带来的好处是,很多现有的图像模型可以很容易扩展成文本控制的图像模型。原本需要大量人工标注的很多任务,现在只需要用集大成的 CLIP 就可以了,甚至还可能生成新数据,例如在 StyleCLIP 里用文本交互控制生成的人脸:

图片

最开始图片的文字信息大多是以打标签的形式通过大量人工标注来完成,有了CLIP 以后可以说是彻底打通了文字和图片之间的桥梁,使得图像相关的任务得到大大的扩展。说是 AI 画画的基石也不过分。有了这个 CLIP 模型,就可以计算任意图片和文本之间的关联度(即 CLIP-score),拿来指导模型的生成了。

这一步其实还分了几个发展阶段。最开始用的方法(Guided Diffusion)很naive:每次降噪后的图片,都计算一次和输入文本之间的 CLIP-score。原本的网络只需要预测噪声,现在网络不但要预测噪声还需要让去噪后的结果图尽可能和文本接近(也就是 CLIP-loss 尽量小)。这样在不断去噪的过程中,模型就会倾向于生成和文本相近的图片。由于 CLIP 是在无噪声的图片上进行训练的,这边还有一个小细节是要对 CLIP 模型用加噪声的图片进行 finetune,这样 CLIP 才能“看出”加噪声后的牛排还是一块牛排。

图片

这样做的好处是 CLIP 和 Diffusion model 都是现成的,只需要在生成过程中结合到一起。但缺点是本来就已经很慢的 Diffusion model 生成过程变得更慢了,而且这两个模型是独立、没法联合训练,得到更进一步的提升。

于是就有了 Classifier-Free Diffusion Guidence,模型同时支持无条件和有条件的噪声估计,在训练 Diffusion model 时就加入文本的引导。这样的模型当然也离不开很多很多的数据和很多很多的卡,除了网络爬取,还有通过商业图库构造出巨量的图片和文本对,最后做为成品的 GLIDE 在生成效果上又达到了一次飞跃。虽然现在看有点简陋,但是在当时来说已经很惊人了,恭喜大家,看到这里已经追上了AI绘画 21 年末的进度!

图片

2.2如何控制生成的结果?

再衍生一下:如果你试过用 AI 给你画头像,这时候输入条件就变成了图片,那么这样要怎么控制生成的结果呢? 这里有几种不同的方法,其实算是不同流派了。这里我们将介绍3种:

第一种是直接提取图片的 CLIP 特征。 就像文字特征一样去引导图片。这样生成出来的图片的内容比较相近,但结构不一定相同。例如下图,模型生成了相似的内容但是画风略微怪诞!

图片

第二种特别好理解,现在主流的 AI 画画 webui 里的 img2img 都是采用这个方法。 就是对输入的原图增加几层噪声,再以这个为基础进行常规的去噪。使用你希望的画风相应的「咒语」,就可以生成和你原图结构类似但画风完全不同的图片。

叠加的噪声的强度越高,生成的图片和原图就差距越大,AI 画画的发挥空间就越大。

图片

上图是用这个方法生成的二次元形象,你把屏幕放远点看这两张图的色块是相近的。因为右边的图片就是基于左边叠加了厚厚的“椒盐”来作为基础生成的,大致的色块结构依然保留了,但模型也加上了自己的想象(通过文本引导)。

第三种方法是用对应的图片去 finetune 生成网络(Dreambooth),如下图。给模型看很多很多小狗狗的图,让模型学到这只小狗狗的样子,这样只需要再加上一些简单的词汇就可以生成各种各样的小狗狗。

图片

03、为什么 AI 画画效果如此惊人——几个里程碑级模型

上面解释了计算机如何生成和真实图片相似的图画,以及模型是如何听懂我们想要它生成什么并给出对应结果的。到此,AI 画画的基本原理已经介绍得差不多了。我们可以发现,其实大部分都是「改进」的工作,但是效果是真的很惊人!在这期间,涉及到很多训练网络的 tricks。

现在最火热的模型就是 Stable Diffusion,因为开源且效果好,得到了众多人喜爱。另外基于此,吸收了巨量二次元插画的 NovelAI 也在二次元画风上异军突起,甚至在火热程度上和 Stable Diffusion 相比,有过之而无不及。

讲 Stable Diffusion 为什么这么好,要先从 Latent Diffusion Model 谈起。

让我们来复习一下 diffusion model 的原理:

图片

对一个带噪声的输入图片,训练一个噪声预测 U-net 网络,让它能预测噪声,然后再从输入中减去,得到去噪后的图片。

一般的 diffusion model 是对原始图片进行加噪去噪,噪声图片和原始图片尺寸是一样的。为了节约训练资源和生成时间,通常会用较小的图片尺寸训练,再接一个超分辨率模型。

图片

而在 Latent Diffusion Model 中,diffusion 模块被用于生成 VAE 的隐编码。于是整个流程变成了这样:

图片

图片先用训练好的 VAE 的 encoder 得到一个维度小得多的图片隐编码(可以理解为将图片信息压缩到一个尺度更小的空间中),diffusion model 不再直接处理原图而是处理这些隐编码,最后生成的新的隐编码再用对应的 decoder 还原成图片。相较于直接生成图片像素,大幅度减少计算量与显存。

第二个改进是增加了更多的训练数据,并且还多了一个美学评分的过滤指标——只选好看的图片。这就像是如果想要学会画漂亮的画,就要多看看大艺术家们的 masterpieces 一样。

训练集里都是漂亮的图片,例如这样的:

图片

或者这样的:

图片

模糊的图、有水印的图都被 pass 了,让机器只从漂亮图片里学画画。

最后相比 Latent Diffusion Model 的改进,是用上文提到的 CLIP 来让文本控制图片的生成方向。

这里也提一下二次元画风的 NovelAI。其实在技术上没有非常新的内容,就是拿巨量二次元图片去 finetune 原始 Stable Diffusion 模型。主要一些改进是 CLIP 用了倒数第二层更贴近文本内容的特征、把训练数据扩展为长宽比不限(为了能容纳下完整的人像)、增加了可支持文本输入长度从而让咒语变得更灵活也更复杂。笔者个人认为效果好还是因为吞了巨量的图片,外加用户的热情让这个模型迅速发扬光大,甚至还有《元素法典》、《参同真解》等众多咒语书,更衍生出了众多辅助绘制工具~

04、ControlNet:让我们控制扩散模型

由于 diffusion 超强的学习能力,理论上网络是可以还原出训练集里的每一张数据的。所以只要数据足够多、足够好,模型就可以生成非常好的图片。和人学画画不同,如果人的难点是画不出来,那么模型就不知道该往哪个方向画。所以控制模型生成其实就是想办法让模型听话,按照你的指示生成结果。

在上文中,简单展示过 AI 画画中 img2img 的效果。原理是把左图加一些高斯噪声(撒撒黑胡椒)然后作为底图来基于它生成。所以基本上色块分布是接近的,但是很难控制的更细节。

图片

今年引起爆炸性话题的 ControlNet,则是可以通过任何的条件控制网络生成。原来模型只能得到一个文本的生成引导,现在它可以听懂任何基于图片提取的信号了,只要你拿一组成对的图片去训练!

这个方式出来以后极大地扩展了可玩性,而且官方已经提供了非常多常用的训练好的控制网络。你可以用 depth 控制结构生成各种场景:

图片

可以直接拿线稿上色:

图片

可以随便涂几笔就生成复杂的图片:

图片

还可以通过姿态检测生成很好的多人结果:

图片

图片

只要你想,你甚至可以自己训练。比如说就有人训练了手脚的控制器,解决了 ai 不会画手的问题:

图片

图片

这些控制结果还可以一起用,例如结合人体姿态和深度图:

图片

甚至不需要来自同一张图:

图片

效果是真的非常惊艳,但原理上其实实现得比较简单。为了给原始模型增加额外的条件输入,把整个网络复制了一份,固定原始网络来保证输出的稳定性。原始的网络输入依然是噪声,而复制的 control 网络的输入是控制条件(深度、姿态等)。把两个输入和输出加起来,用成对的数据集(输入是深度图,输出是原图这种感觉)去训练控制网络,达到控制条件能够很好控制生成结果的程度,就训练好啦!并且这个训练本质上还是在做 finetune,所以耗时也不算很大,和直接 finetune 网络差不多。

图片

05、潜在上限

ControlNet 解决了多人的姿态控制以后,模型已经可以很好地生成非常合理的结构了。这时候就会面临另一个问题,模型的细节要如何生成得更好?

想要得到高质量的图片,最直接的方式就是调大输出的分辨率。分辨率越大,细节画得就越好(尤其是人脸)。但是实际上高分辨率的结果非常容易崩掉,例如出现两个身体时因为训练模型里如此高分辨率的图片较少。并且分辨率高了以后计算成本飙升,会算得很慢。

图片

于是一种常见的做法是先生成较小分辨率的结果,然后对图片做超分(就是把图片放大还要保证清晰度),流程如下。

图片

这么做可以保证结构的合理性,而且速度快非常多。但是超分模型对细节的补完不一定能做得很自然,而且容易有过于锐化的结果。除了传统超分模型,还有同样基于 diffusion 模型的超分算法。由于 diffusion 相当于重绘了,所以可以得到更好的细节效果。但是图片尺寸非常大,跑起来更慢了。

另一个现在被广泛使用的方法是 latent upscale(webui自带的Hires.fix即可实现),流程如下。

图片

之前写到过,stable diffusion 的结构优势之一是它是由压缩图片信息的 VAE 和对 latent 进行去噪的 U-net 网络组成,所以它天然适合基于 latent 的超分方法。

Latent upscale 就是在图片经过 VAE 压缩后,直接对 latent 进行超分,然后再喂给 VAE,就能得到 x2 的图片了。如果和 stable diffusion 结合,那就是 SD 的U-net 输出 latent 以后,先过一遍 latent upscale,再喂给 VAE 解码。

当然,对 latent 做 upscale 也有基于 diffusion 的方法并且效果应该是最好的。当然于此而来的代价就是耗时也增加了。对图片做普通超分和对 latent 做基于 diffusion 的超分结果对比如下。

图片

个人认为效果好主要是因为 diffusion,基于图片做 diffusion 超分应该也可以达到这个质量,只不过耗时更久。放一张 latent upscale + controlnet 得到的高清美图。

图片

06、LoRA:大型语言模型的低秩自适应

除了 ControlNet,近期 AI 画画领域另一个不得不提的就是 LoRA,前面的水墨画美少女就是融合 LoRA 模型生成的。

要讲 LoRA 就要先解释模型的 finetune(微调)。模型的 finetune 指的是什么呢?其实就是当你有一个现成的,很厉害的大模型(pre-trained model),你想要让它学一些新知识,或者完成一些更面向具体应用的子任务,或者只是为了适配你的数据分布时,就需要拿你的小样本数据去对模型进行重新训练。这个训练不能训太久,否则模型就会过拟合到你的小样本数据上,丧失掉大模型的泛用性。

Pre-train + finetune 是机器学习中非常常见的组合,在应用上有很大价值。但是其中有一个问题就是“遗忘”:模型会在 finetune 过程中不断忘记之前已经记住的内容。

常见的解决方案有两个:

  • replay:就是也把原始知识过一遍;
  • 正则化:通过正则项控制模型参数和原始参数尽量一致,不要变太多;还有一个是Parameter isolation(参数孤立化),这个是通过独立出一个模块来做 finetune,原有的模型不再更新权重。

参数孤立化是最有效的一种方式,具体有好几种实现方式。例如 Adaptor 就是在原模型中增加一个子模块、固定原模型,只训练子模块。是不是听起来很熟悉?是的,ControlNet 就是一种类似 Adaptor 的方法,同理还有 T2I-Adapter,也是通过增加子模块来引入新的条件输入控制。

图片

LoRA 则是另一种参数孤立化策略,也在 AI 画画找到了用武之地。它利用低秩矩阵来替代原来全量参数进行训练,从而提升 finetune 的效率。

图片

可以和之前最常用的 finetune 方法 DreamBooth 对比一下。

图片

对于 DreamBooth 来说,它是直接更新整个大模型的权重来让模型学习新概念的。虽然可以通过正则项避免遗忘,但是 finetune 后的模型依然非常大(和原模型一样大)。

图片

而使用 LoRA 后,LoRA 影响的只是其中一小部分(通过低秩矩阵叠加到大模型网络上的)权重,所以 finetune 起来更快,更不吃资源,而且得到的 finetune 模型非常小,使用起来方便很多。

由于 LoRA 在结构上是独立于大模型的,所以它有一个额外的好处是替换大模型可以得到不同的、令人惊喜的结果。例如用水墨画训练的一个很好看的 LoRA 模型“墨心”,结合国风美女的基础大模型,可以生成穿着中式服装的水墨画美少女:

图片

在网友写的《AI 形象生成指南》中,提出的方法就是利用可以生成亚裔女性的真人大模型,叠加从二次元大模型 finetune 出来的二次元女性形象LoRA,来生成带有角色特征的真人 coser 照片:

图片

而且 LoRA 也非常方便进行模型融合。例如说增加另一个韩国偶像 LoRA,得到的结果就融合了两者的特色:

图片

在使用上来说,LoRA 很像是模型的“插件”,可以在基础模型上叠加想要的效果,或者把各种想要的效果加权组合叠在一起,可以产生很多令人惊喜的结果。

当然 LoRA 由于是 finetune 模型,所以画风会趋于单一,是好是坏见仁见智,在需要固定画风 orID 的时候能发挥令人惊喜的用处。但是,使用现实中的真人照片训练 LoRA 并公开模型非常缺德,请各位读者不要这么做。

07、mov2mov

讲完 LoRA 和 ControlNet 了再顺便提一嘴它们的结合产物—— mov2mov,其实原理上就是组合了之前的各种技术。例如 img2img 来保证背景和主体的连续性,controlnet 提供更多控制条件来增强对应性,还需要 LoRA 来保证输出的结果能尽量一致。

除此之外,传统的视频防抖算法如窗口平滑、插帧,这些 buff 全部叠加上去,才可能得到一个依然很抖的效果。但是其中最重要的是,你需要一个高质量的驱动视频。感兴趣的可以自行搜索了解。几乎算是重绘 MMD 的情况下(简单中的简单模式了)视频效果依然不算理想,想要有更好的视频生成效果还是有一段距离的。

以上是本次分享全部内容,欢迎大家在评论区分享交流。如果觉得内容有用,欢迎转发~阅读完本篇后,推荐各位进一步阅读本公众号今日推送的次条,跟随腾讯工程师的教程快速上手部署 Stable Diffusion Web UI,以及《给想玩AIGC的小白:教你从0搭一个图文视频生成网站(附插件&源码)》一文,上手建设你的 AI 绘画网站~

点下方关注并星标腾讯云开发者,回复**「AIGC」,一键领取0基础AI绘画**网站搭建教程、模型源件、工具插件、网站源码和部署模型所需GPU服务器限量优惠券。

-End-

原创作者|周艺超

技术责编|周艺超

图片

程序员用现有 AIGC 代表产品(如GPT-4等)开放的 API 接口,可以做哪些自研工具?有哪些新奇/实用的使用方式?

欢迎在公众号评论区聊一聊你的创想。在4月17日前将你的评论记录截图,发送给腾讯云开发者公众号后台,可领取腾讯云「开发者春季限定红包封面」一个,数量有限先到先得😄。我们还将选取点赞量最高的1位朋友,送出腾讯QQ公仔1个。4月17日中午12点开奖。快邀请你的开发者朋友们一起来参与吧!

点下方关注并星标腾讯云开发者

公众号回复 「AIGC」

一键领取0基础AI绘画网站搭建教程、模型源件、工具插件、网站源码和部署模型所需GPU服务器限量优惠券

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
0 评论
0 收藏
0
分享
返回顶部
顶部