【ai绘画】大魔导书:ai 是如何绘画的?stable diffusion 原理全解(一)-凯发ag旗舰厅 二维码
发表时间:2023-09-23 16:33 一. 前言 一直也很想写这篇文章,但是由于自己一直没找到应该如何定位这系列的文章却一直搁置了。今天终于下定决心将这个系列作为一个 由浅入深 的科普系文章来做,之后也会以这篇文章作为基础,出相应的视频。 当然浅也不是说会有多浅,起码你得把 webui 玩的顺溜了,各种玩意都会玩了再说。 首先这篇文章将会带领你了解目前 ai绘画 (特指 stable diffusion)是如何大致工作的。俗话说得好,工欲善其事,必先利其器。不理解 ai 是如何工作的又如何能画出好图呢? 注:下一句看不懂也没关系,以后会慢慢讲本篇文章不涉及 之后文章的续集将会从 textencoder部分(clip),diffusion部分(u-net scheduler),imagedecoder部分(vae)来带领你全面深入地了解 ai绘画。这篇文章只涉及到这几个名词,并不会讲其工作原理。一次讲太多也看不明白对吧 哈哈 当然,考虑到并非每个人都是计算机相关专业,这个系列的文章将会 尽可能的减少涉及代码相关知识。至于数学部分,那就更少了,毕竟我也不是 ai 专业的,真让我推那些公式我也不会。 事先说好:webui 支持的功能,不等于 ai 的功能。比如说那堆乱七八糟的加权、括号、分步渲染啥的,根本就不是 ai 本身支持的,是 webui 单独添加的功能。等会将会讲明白那些都是啥。 先来看看总览图吧,我将按照这张图片开始讲。看不懂没关系,一点一点讲。 二. 一切的开始,敲进去的文本。 就先从文生图开始讲起了。敲进去的 tag(prompt,也叫提示词),是如何变成一幅幅图片的呢?如果你是一个老手,一定会知道最开始的时候 ai 是有 tag 上限的。在你写 tag 的时候,右上角也会有这个提示。这又是什么呢? 首先我们要知道一件事情,自然语言,也就是平常说的话、单词什么的是无法被程序理解的。当我们用文本生成图片的时候,程序所做的第一件事情就是将 “人话” 转换为数字。 这也就是 textencoder(文本编码器)所产生的作用了。而在 stable diffusion 中,一款非常优秀的文本编码器被选中了—— clip。(注:clip 并非只是一个文本编码器,如果感兴趣的可以去自己搜一搜) 在这个文本编码器里面,会经历两个步骤。文本首先会经过 tokenize 编码变成数字,然后再送入 text transformer 得到生成图片的条件(condition) 使用这个小工具就能看到平常输入的 tag 变成了什么样子。经过了 tokenizer 的处理,他变成了这样一串数字: masterpiece, best quality, 1girl -> 12066, 267, 949, 3027, 267, 272, 1611 细心的人可能看到了,图中有个 token count,正是这串数字的个数。回到文生图界面,将tag输进去,可以看到也是同样的数字。 经历了 tokenizer 之后,就要把这串 token 送入 text transformer 了,来得到一个 条件(condition)。常说的 clip skip 就是在这里跳过了 clip 模型 text transformer 部分的最后两层。最后得到的这个条件将会指导图像生成的方向。 再回去想一想最开始的问题:为什么最开始 ai 有词数上限?答案是这样的:text transformer本身是接纳 77 个 token 的。去头去尾,77 - 2 = 75,也就是最开始的这个 “75” 的数字来源。 那为什么后来支持更多的 token 了呢?那些括号又是什么呢?留个悬念,下一篇文将详细对文本编码这部分展开~ 二. 从乱码中看出一幅图 好——现在你已经理解了 ai 的第一步了:把人话转成数字。 那么第二步就该利用这些数字生成图片了。 怕你不知道提一句:一张图片包含的信息是非常非常之多的。一张 512 x 512的图片就有巨量的数据:假设这是一张rgb的图,有 512 * 512 个像素点。每个像素点由红绿蓝组成不同颜色,还要乘以3。 让 ai 算出这堆玩意不太行,实在是太大了,会导致需要巨量消耗。那可怎么办?俩字:压缩。上面这张图中,右上角有仨字:“潜空间”。可以把它简单理解成压缩过的图片数据。图形数据的处理全部在这个潜空间内,这样处理所需要的数据就会小的多得多了!如:512x512的图片,(3, 512, 512) 实际处理的时候是 (4,64,64)。数据量小了很多很多倍 还记得当我们生成图片的时候,是不是有个种子?这里填 -1 就代表随机生成。 基于这个随机种子,会生成一张噪声图片,每一个随机种子对应一张特定的噪声图。噪声图就如同下图最左的样子。 然后在这里进行去噪,就像你死盯着乱码图片,看他像什么。而上一步文本编码器最后的输出将作为条件,来指导去噪的方向。生成图片的过程,就是重复去噪、采样的过程。 去噪的过程涉及到 u-net 以及 scheduler,在以后的专栏中会继续介绍他们的细节。 平常选的采样器、步数、cfg也就是在这里发挥的作用。 三. 从潜空间变成图 上一部分说了,潜空间的数据是经过了压缩的,不是人能看的正常图片。所以从潜空间到正常图片就需要一步转换 扩大,这就是vae的作用。 四. 总结 这篇文章大致讲了 stable diffusion 的一个笼统的工作原理,并且结合了平常使用的 webui 调节的那些参数,细致的讲了一些他们背后的作用位置。不知道大家能看懂多少呢?没看懂也没关系,点个收藏慢慢看! 由于篇幅原因实在是还有非常非常多的内容没有讲完。比如 cfg 到底是什么,又影响了哪里?训练的那些模型都作用在了哪里?后续将会慢慢更新这些内容 |