ai绘画成图 白话科普 | 一次性搞懂AI绘画是如何生成图像的!
为什么我们输入一句话,人工智能便能产出一幅画作呢?AI绘画究竟是如何生成图像的?这篇文章里,作者将AI绘画过程拆解成了5个核心问题,或许搞清楚这5个核心问题,你就能明白AI绘画的工作原理了,一起来看看吧。
写在前面
前段时间和聊AIGC时,提到了关于AI绘画原理的话题,一直只知道人工智能是降噪画图的原理,但是很多细节不是很清楚,挺好奇为什么输入一句话,人工智能就能理解,并且画出来一幅“可圈可点”的画作。
趁着周末爬了些资料,也找学术界朋友给推荐了一些研究论文,大概明白了AI绘画是如何工作的,分享给大家,共勉。
Ps:主要通过白话的方式阐述AI绘画原理,手动绘制了插图和流程图作为示意,算法原理略去了很多细节,适用于泛AIGC爱好者阅读和学习了解。
整个AI绘画过程,我拆解成了五个核心问题,搞清楚这五个问题,AI绘画也就清晰了:
我只输入了一句话,AI是怎么知道这句话描述的是什么? AI绘画流程里提到的噪声图是哪里来的? 就算有了噪声图,噪声图是怎么被一点一点去掉“马赛克”的? 那AI是怎么去掉无用的“马赛克”的,最终去掉后是符合效果的? 就算有了最终效果,为什么重新作画的结果不一样?
是不是看到这五个问题也有点懵,别着急,下面我们先看下AI绘画的绘制过程,就清楚这五个问题都是在问什么了。
先看总述:AI绘画的绘制过程
AI绘画发展很快,最典型的就是去年的《太空歌剧院》,获得科罗拉多州艺术一等奖,当时还是蛮震撼的。
因为再往前看几年,其实AI绘画的效果是这样的(12年吴恩达和团队用1.6万GPU和上万张数据,花了3天时间画出来的猫…):
我们再看下现在AI绘画的效果(普通人输入一句话,几秒钟画出来的作品):
: 官网
可以看出画质高清、精致,写实感很强,甚至可以比得上摄影师的作品了。
所以AI到底是怎么越来越优秀,根据一句话和几个参数就能画出这么好的作品呢?
先抛结论,AI绘画原理就是:
去除马赛克,就能看清了。
其实N多年前某些成人网就有了类似的技术,不过那个是1vs1还原,AI绘画本质是1vsN还原,核心就是把马赛克一点一点抹掉,最终“漏出”底图,完成所谓的“AI绘画”。
图像绘制:
我们先看下,AI绘画的使用场景,所有的软件或模型,基本上第一步都是让用户输入绘画关键词,也就是。
以 Model的示意如下,我们把最右边的当做正常图片,从右到左是不断模糊的,直至最后看不出来是什么,这个过程就是算法的叠加噪声。
你可以理解为不断对图片进行马赛克处理,这就是最著名的“扩散()”过程。
:
打个比喻,我们把这个过程想象成你在发朋友圈照片时,想屏蔽一些信息,所以使用“编辑”功能不断地对某些区域进行涂抹,直到这个区域看不清原本的内容了。
并且每一次的噪声迭代其实仅仅和上一次的状态相关联,所以这本质上也是一个马尔科夫链模型(简单理解为随机模型,细节可以移步)。
此时,如果把这个过程倒过来,从左到右做处理,那么就是一步步把一个图片逐渐去除噪声,变清晰的过程。
也就是你的朋友圈照片马赛克越来越少,这个过程就是 Model的原理。
OK,看到这里,我们明白了大概流程和原理,接下来,我们来依次看五个核心问题。
第一个问题:如何理解文本信息
你输入的文字,AI是怎么知道你想要描述的是什么?
按照上面所说的原理,图片是被一点点抹去马赛克的,但是我写的文本信息是怎么匹配到某一个马赛克图片的呢?
我们都知道,目前AI绘画最主流的使用方式就是在模型或软件里,输入一句话(俗称),可以写主体、背景、人物、风格、参数等等,然后发送,就可以得到一张图。
比如,“一个穿背带裤打球的鸡”,效果如下:
图像绘制::
AI绘画底层也是大模型,是一个图像模型。
最早的时候文本控制模型的做法是让模型生成一堆图片,然后再让分类器从中选出一个最符合的,这种方式没什么不好,唯一的缺点就是当数据量大到一定程度的时候,就会崩溃(想象一下,用excel处理上百亿行的数据,是不是负担很大)。
所以一方面需要非常多的图片数据来训练,另一方面又需要高效且快捷的处理,能承担这个任务的,就是在21年推出的。
CLIP的工作原理其实可以简单理解为:爬虫、文本+图片的信息对。
第一,先看CLIP的爬虫和数据库。
CLIP的最大亮点之一就是采用了非常多的数据,构成了一个庞大的数据库。
每次CLIP爬取到一张图片后,都会给图片打上对应的标签以及描述(实际CLIP 是根据从网络上抓取的图像以及其 “alt” 标签进行训练的)
:,引自Jay 博客
然后从768个维度重新编码这些信息(你可以理解为从768个不同的角度来描述这个图)。
然后根据这些信息构建出一个超多维的数据库,每一个维度都会和其他维度交叉起来。
同时相似的维度会相对靠拢在一起,按照这种方式CLIP不断爬取,最终构建了一个大概4~5亿的数据库。
图像绘制::
第二,再看CLIP的文本图像匹配能力。
OK,有了数据库,库里的图像怎么和输入的文字匹配呢?这里又分两个步骤:
步骤01,怎么具备文本-图像匹配的能力。
先看下图,是算法的原理图,看不懂没关系,我在下面重新绘制了一幅降维版的示意图。
:
我们来看下面这幅示意图,CLIP是如何识别文本和图像的关联。
作图绘制参考: , By Liunn
这里是一个简化的算法模型,其本质是不断地通过大量数据来训练CLIP去关联、认识图片和文字,并且根据和答案的比对,不断地矫正,最后达到精确匹配关键词和特征向量。
步骤02,如何去做文本-图像匹配的关联。
好了,我们再来看CLIP是如何做到文本图像的匹配的。
当我们开始作画时,会录入文本描述(即),CLIP模型就会根据去上面的数据库里从768个维度进行相似度的匹配,然后拿图像和文本编码后的特征去计算出一个相似性矩阵。
再根据最大化对角线元素同时最小化非对角线元素的约束,不断地优化和调整编码器,最终让文本和图片编码器的语义强关联起来。
图像绘制::
最后,当找到最相似的维度描述后,把这些图像特征全部融合到一起,构建出本次要产出的图像的总图像特征向量集。
至此,输入的一段话,就转换成了这次生成图像所需要的全部特征向量,也就是AI所谓的已经“理解了你想画什么样的画了”。
这个跨越已经算是AI界的“登月一小步”了
有了CLIP的这个创新举措,基本上彻底打通了文字和图片之间的鸿沟,搭建了一个文本和图像之间关联的桥梁,再也不需要以前图像处理界的打标签的方式来不断堆人了。
第二个问题:原始噪声图的来源
上面讲到AI绘画是把“马赛克”一点点抹掉,那所谓的“马赛克”图,也就是噪声图是怎么来的呢?
噪声图的是扩散模型生成的,先记住这个概念“扩散模型”。
讲扩散模型之前,需要先讲另一个概念,AI生成图片的过程,其实是人工智能领域的一个分支,生成模型( Model)。
生成模型主要是生成图像的,通过扔进去大量真实的图片让AI不断去了解、认识和学习,然后根据训练效果,自己生成图片。
在生成模型里,有个自动编码器的东西,它包含两个部分:编码器和解码器。
编码器可以把比较大的数据量压缩为较小的数据量,压缩的前提是这个较小的数据量是能够代表最开始的大数据量的;
解码器可以根据这个较小的数据量在适当的条件下,还原为最开始的的大数据量。
所以这个时候就有意思了:
能否直接给它一个较小的数据量,看看它自己能随机扩大成一个什么样的大数据量?
图像绘制::
答案是可以的,但,测试效果很一般。
所以自动编码器不行了,怎么办呢,科学家发明了另一个东西,叫VAE(变分编码器, Auto-)。
VAE是做什么的,主要是把较小的数据量进行规律化,让其符合高斯分布的概率。
这样就可以依据这个,来调整一个图片信息按照概率的变化进行对应的改变,但是有个问题,这个太依赖概率了,大部分概率都是假设的理想情况,那怎么办呢?
所以这个时候科学家就想,能不能做两个AI,一个负责生成,一个负责检验它生成的行不行,也就是AI互相评估真假,这就是GAN,对抗神经网络诞生了。
GAN一方面生成图片,一方面自己检测行不行,比如有时候有些图片细节没有按照要求生成,检测的时候GAN发现了,它后面就会不断加强这块,最终让自己觉得结果可以,这样不断地迭代成千上亿次,最终生成的结果,检测也OK的时候,就是生成了一个AI的图片了。
但问题又来了
GAN一方面自己做运动员,一方面自己做裁判,太忙了,不仅消耗大量的计算资源,同时也容易出错,稳定性也不好,那怎么办呢?能不能让AI别搞这么复杂,用一套流程完成呢?
答案是肯定的,这就是跨越了生成模型时代后,扩散模型的时代到来了。
话题回到扩散模型这里。
扩散模型最早是由斯坦福和伯克利学术专家,在2015年相关论文里提出的,依据正态分布给图像逐步增加噪声,到了2020年加噪声的过程被改为根据余弦相似度的规律来处理。(文末附上了15年和20年的原始学术论文链接,感兴趣可以自行阅读)
根据余弦调度逐渐正向扩散原始图,就像把一个完整的拼图一步一步拆开,直至完全打乱。
图像绘制::
到这里,第二个问题也解决了。当你看到这里的时候,AI绘画的输入信息基本Ready了。
第三个问题:模型如何去除噪声
AI把文字转成了特征向量了,也拿到噪声图片了,但噪声图是怎么一点点被去除“马赛克”的呢?
它是怎么消除掉马赛克的呢?这里面分为两个步骤:
步骤一,降维数据运算,提升运算效率;
步骤二,设计降噪网络,识别无用噪声,精准降噪。
先看步骤一:还记得上文提到的自动编码器么?
图像特征向量和噪声图,会一起扔到编码器里进行降噪,也就是去除马赛克的过程。
但是这里有个问题,就是一张512*512的RGB图片就需要运算次,即512*512*3=条数据,这个运算量太大了
所以在这些数据在进入到编码器之前,都会被压缩到潜空间里去,降维到64*64*4=16384条数据(不知道你有没有用SD的时候注意到,我们在 里调整图像大小的时候,最小只能拖到64px,这就是其中的原因)。
:,
这样的话,整个文生图的任务就能够降维到消费级的GPU上运算(虽然现在算力依然是个问题,A100都没有吧?有的话 私我!)
降低了落地门槛,运算和配置效率都得到了极大的提升。
再看步骤二:设计一个降噪网络。
明白了数据降维的问题,我们继续看,AI怎么逐步去除噪声生成新图呢,图像编码器又是如何给图像降噪,从而生成一张全新的图片的呢?
图像绘制:
关于降噪方式,ddpm在2020年年底的相关论文预测了三件事:
噪声均值(mean of noise):预测每个时间步长的噪声均值。 原始图像( image):直接预测原始图像,一步到位。 图像噪声(noise of image):直接预测图像中的噪声,以获得噪声更少的图像。
现在的模型,大部分都是采用了第三种方式。
这个去除噪声的网络是怎么设计的呢?
这个主要归功于编码器中的U-Net(卷积神经网络-图像分割)了。
:
U-Net是一个类似于编码-解码器的漏斗形状的网络(上图左),不同点在于U-Net在相同层级的编码、解码层增加了直连通道(你可以理解为两栋大楼之间,同一楼层之间加了连桥,可以走动)
这样好处在于处理图片时,相同位置的信息在编码、解码过程中可以方便快捷的进行信息传输。
那它是怎么工作的呢?
刚才我们说了,DDPM提到,目前基本上所有的模型都采用直接预测图像中的噪声,以便于获得一张噪声更少的图片。
U-Net也是如此。
U-Net根据拿到第一节里提到的图像的全部特征向量集合后,从向量集合里通过采样的方式抽取一部分特征向量,再根据这些向量识别出其中的无用的噪声
然后用最开始的全噪声图和当前这次预测的噪声做减法(实际处理过程比这会复杂一些),然后得到一个比最开始噪声少一些的图,然后再拿这个图,重复上述流程,再次通过采样的方式抽取一部分特征向量,再去做噪声预测,然后再拿N-2次的图像和N-1次的图像相减,拿到N-3次的图像
继续重复上述流程,直至最终图像清晰,没有噪声或没有识别出无用的噪声为止,最终生成一张符合要求的图像。
图像绘制思路::,
这里面,有的同学注意到了,还涉及到一个采样方法的环节。
每一次的采样,根据不同的采样方法,可以用同样的方式,也可以用不同的采样方式。不同的采样方法会抽取出不同维度、不同特质、不同规模的特征向量,最终确实会对输出结果有影响(这也是影响AI绘画可控性的因素之一)。
最后,还记得刚刚提到的数据降维吗?
降维是为了降低运算量,加快速度,降维后其实是进入到一个潜空间里,那么图像全部降噪完成后,会通过图像解压器也就是VAE模型,重新还原回来,被重新释放到像素空间里(可以理解为里云端存储的照片,你最开始看的是缩略图,当你点开大图想看的时候,会慢慢从云端下载,变成高清的)。
以上,就是噪声模型网络去噪的简易过程。
第四个问题:应该去除哪些无用的噪声
AI是怎么能够按照我描述的来去除特定的马赛克,而不是我写了“狗狗”,画出来一只“猫咪”呢?
U-Net模型如何识别应该去除哪些噪声呢?其实这就是一个模型训练的过程。
讲解模型训练之前,需要先普及几个概念:
先看U-Net的训练集是怎么构建的,主要分为四个步骤:
从图文数据集中随机选择照片; 生产不同强度的噪声,顺次排列; 随机选择某个强度的噪声; 将该噪声加到图片里。
图像绘制思路::,
再来看U-net是怎么处理的。
U-Net的训练集是很多张已经叠加了随机噪声的数据库,可以理解为很多添加了马赛克的图片(篮球训练场地),然后让AI不断地从这个数据库里抽取图片出来,自己尝试抹去噪声,全部抹掉后再来和这张图的原图做比对,看看差别多大。
图像绘制思路::,
计算出这个差距,然后重新去库里抽取,再尝试抹去噪声(强化学习),循环无数次,最终实现的效果是,无论怎么随机抽,并且换一个新的噪声图片库(测试集),AI抹掉的噪声后的图像也能和原图很像(风格都类似,不一定是原图,这也就是为什么AI每次出图都不一样)。
这样的话就算通过了,这个模型就算Ready了(可以上线了)。