给二次元爱好者的 stable diffusion AI 绘图入门指南

367 阅读15分钟

本文以二次元模型为例,介绍 sd 本地部署与基础绘图功能,对提示词技巧、图生图、controlnet、动画亦稍作讨论。内容停留在 web ui 基本应用层,对原理、comfyui的管线型工作流,和过于复杂的生成技巧不做过多探讨。

引言

  • 笔者第一次接触 AI 绘图,大概是在23年底,当时训练了一点自己的 lora,效果只能算是差强人意,也就扔到一边去没再关注了,今年辞职在家左右无事,又捡起了 sd web ui 权当消遣。
  • 这两年 AI 技术发展之快简直令人瞠目结舌,sd 的模型与 23 年已不可同日而语,看看下面这份原图与生成图的对比:仅仅10个提示词(下文会具体解释),还原度就相当不错。

image.png

基础内容

sd 的本地部署到第一张图片输出

  1. sd 目前主流的安装方法有 b站 up主的整合包(秋葉aaaki独立研究员-星空),与 gitlab 直接拉代码两种方式,我们选择自己捯饬:github: stable-diffusion-webui
  2. 安装磁盘最好要预留 100g 以上的空间,越大越好。后续有各种模型/插件/输出文件需要保存,sdxl 的模型动不动就是 5~6g,输出图片和训练材料更是一不注意就挤爆了你的硬盘。
  3. 安装过程参考 README.MD,有两点可能踩坑,需要注意:
    • 需要安装特定版本的 python(pytorch 的原因)
    • 50 系显卡显卡需要使用 dev 分支(Blackwell 架构的原因),参考该 issue

QQ_1741721493298.png

  1. 如果在上图这个提示框里输入任何文本后,点击 Generate 按钮成功生成图片,那么你已经完成了 sd 的部署。如果你有问题,请通过 git/py/nvidia-smi 等命令把 sd -> python -> pytorch -> cuda -> 显卡驱动 -> 显卡硬件 这个完整的调用链中各环节的版本检查一遍,注意控制台的报错,再看看有没有踩到我上一步提到的两个坑,相信大家有办法解决捏!

image.png

界面设置

现在请大家切换到 Extensions 选项卡,我们来安装一些有必要的插件。点击 Load from 按钮后,可以在下面的文本框输入插件名进行搜索。

image.png

下面这几个打勾的是我的推荐

image.png

从上到下:
  1. tagcomplete 为我们提供 tag 联想功能,对二次元系模型使用者来说非常关键。二次元系模型的训练素材基本上来自于 Danbooru 等网站,而这个插件联想的词汇也正是来自这些网站,使用它会让你的 prompt 精准无比,CLIP 直呼二次元领域大神。

image.png

  1. bilingual 双语对照翻译,使用 AI 产品时,基本的英文术语需要了解,否则和别人沟通起来很大概率出现鸡同鸭讲的情况。

image.png

  1. lobe-theme 90%用户都在使用的UI美化,它有最好的 dark theme。
  2. prompt-all-in-one 自带常见提示词分类、权重调整、lint、翻译、chatgpt(需要apikey),但会让你的输入框变得异常臃肿,但如果你需要反复调整权重,或者英文实在不太好的话,可以考虑

image.png

  1. localization-zh 与双语对照翻译搭配使用,双语对照需要这个插件作为中文数据源
  • 安装好插件后,我们重启一下界面,右上角可以切换到暗黑模式,怎么样,是不是顺眼多了?

下载模型

一个好的模型,是生成好作品的基础,接下来大家要挑选自己的魔杖了。

  • C站 是 sd 界的奥利凡德魔杖店,经久不衰,走出过无数著名魔法师。
  • liblib 是国人专营,也很好,还有一些限定款魔杖。
  • 大家可以根据模型生成的作品仔细挑选,下载模型时需要注意它的版本(sd1.5、sd2.x、sdxl...),显存吃紧谨慎选择 sdxl,模型的版本会决定你后续工具链的版本。
  • 我们以这个二次元模型为例:WAI-SHUFFLE-NOOB,它内置了很多动漫关键词,并且在二次元风格上表现极为突出(本文开头的图片就是用它生成的)。
  • 下载完模型,将 .safetensors 文件拷贝到 stable-diffusion-webui\models\Stable-diffusion 目录,即可在左侧边栏点击刷新按钮找到它。

image.png

你可能注意到了,模型的翻译是 checkpoint 而不是 model,这是为什么呢?用 git 来类比,模型是一个工程项目,工程师不断开发新功能并向它添加代码(训练模型),而 checkpoint 就是线上使用的打包产物,它保存了某个时刻模型的训练结果,提供给用户。另外的,还有其他开发者会 fork 这个工程,并在其基础上进行自己的特殊训练,比如上文提到的 WAI-SHUFFLE-NOOB 就是 WAI 这个作者在 NoobAI 提供的基础模型上二次训练得到的,而 NoobAI 作为基础的模型被称为 noob 系模型。sd 官方的基础模型衍生了无数模型,而它们又有各自的衍生,这些模型擅长的风格各有不同。

生成图片

下面进入实战环节,完成UI界面的其他必填项。

  • 首先是最重要的提示词,有正向和负向(negative)之分,模型的作者一般会给你提供一组所谓的魔法“起手式”,这些看似累赘繁复的“起手式”对 ai 的引导作用很好,会显著提高你某些情况下的出图质量。
  • 我们点击生成按钮下方的编辑预设样式,将“起手式”保存为 basic,这样后续只要勾选 basic 预设样式,就应用了“起手式”中所有的正向与负向提示词,不用做重复劳动,而且界面上的输入框也会变整洁。

image.png

image.png

  • 接下来我们尝试用英语写一句自然语言,就写:"a girl with blond hair is standing in the classroom",希望她穿着校服与黑色长筒袜,那就补充两个关键词"school uniform","black thighhighs"。尽量不要用长难句给 sd 的提示词分析器 clip 出考题,它在自然语言解析这方面的能力只能说是聊胜于无,因为它的“理解”和 chatgpt 的“理解”并非相同的概念,它要做的是把语言转化成引导图片生成方向的向量。
  • 使用双引号和逗号进行提示词分隔,这是最标准的做法,熟悉之后也可以省略,下划线最好不要使用,大中括号由于有改变权重的作用,也不能随便使用,需要\转义。
  • 一次性说完剩下的配置:采样方法与采样步数决定生成图片的质量与速度,一般模型提供者会给你推荐这两个参数,我们这次根据推荐选择 Euler a & 30 steps ,cfg scale 越高你提示词的权重就越高,过高过低都不好,按模型作者推荐填 7,宽高一般填64的倍数,根据模型版本与你想绘制的内容决定,这些选项可以根据效果随意调整。seed 填 -1 表示随机生成,每次都会重新计算,如果你把种子的值固定下来,生成的图片变化就会很小,适合细节不满意时的微调。

image.png

到这里,使用提示词生成图片的基本流程就结束了,接下来要讲的内容稍微有难度,但如果你对这几种场景有浓厚的兴趣,请接着看下去:

  1. 希望建立自己的风格或者角色设计
  2. 生成多人物/复合风格场景时,不知道提示词该怎么写
  3. 希望用已有图片中的一些元素生成另一张图片
  4. 希望使用 sd 制作简单的动画

额外内容

提示词 & embedding & lora

还记得这张图吗?我们在引言说生成它只用了10个提示词,这不是什么魔法,而是模型作者大量训练的结果。之前介绍 tagcomplete 插件时提过,二次元模型的训练素材普遍来自 Danbooru 等带 tag 的网站,模型吸收素材时,已经把 tag 中的人物名/作者名和作品中的一系列特征对应了起来,因此我们只需要一个简单的人物名,就可以表达人物身材、长相、服饰等大量特征;一个简单的作者名,就可以提取艺术风格。而这种对应关系,就叫做 embedding。

  • embedding 不是简单的一个 prompt 对应一组复杂的 prompt,看这张图片,用语言几乎无论如何也无法描述这件衣服,它太复杂了。embedding 的映射关系,是从我们可以理解的语言到 sd 可以理解的向量。

image.png

还有其他方式可以表示这种特征吗?有,lora。lora 是在模型上进行的小小扩展,比模型的复杂度低,但是比 embedding 的复杂度高,常用来表达艺术风格,或者达到一些类似后处理(只是类似,lora是和 model 共同工作的,它不是后处理)的效果。比如下面这就是一个 像素风的 lora,很有趣,使用 embedding & lora 前务必注意:它们和模型有对应关系,具体请看作者是在哪个模型的基础上训练的。

00074-522218087.png

embedding 和 lora 都是可以自己训练的,不过 sdxl web ui 并不支持,大家可以使用 kohya_ss,或者基于 kohya 但界面更友好中文支持也更好的 SD-Trainer。顺带一提,目前这个时间节点上 50系 BlackWell 显卡使用的 cuda12.8 支持比较差,我提了一个 issue ,可以帮助大家在 50系显卡上训练。训练属于相对比较高阶的用法,大多数人也用不到,本文我们暂且不提。

提示词权重 & 多人控制

不知道大家自由尝试提示词玩耍时,有没有出现一种模型不听自己指挥的诡异情况?明明写了凉鞋的提示词,生成的图片却穿了运动鞋,明明希望男孩戴帽子最后帽子却出现在女孩头顶,诸如此类。这里实际上多数可以归结到两种原因:权重过低,或者多主体特征杂糅。

权重

权重问题在使用 embedding/lora 的场景中非常常见,举个例子:经过某个人物的大量素材训练后,模型已经把她和黑丝绑定了,这时你在提示词里单纯指定她穿白丝,可能会由于权重不够而被忽略。

image.png

使用之前安装的插件可以通过在关键词上点击加减号便利的调整权重,不穿白丝那就每次 +0.2 总有得逞的一天。

多人绘制

我们尝试绘制一个多人场景:白衣黑发的女孩和黑衣白发的女孩。提示词这样写 "2girls", "a girl in black with white hair and a girl in white with black hair are waling on the street",这里要注意,多人场景下首先声明图中的男女数量是非常重要的。

image.png

注意到了吗?生成的8张图片中一大半都是错的,CLIP 理解功能有限,把句子里对多个主体的描述混合杂糅了。那么有没有这么一种方案呢:设置一个分界线,两边互不影响?有的,使用 Regional Prompter 这个插件就可以实现。

image.png

安装插件,找到并勾选 Regional Prompter 卡片,勾选 Common Prompt,并点击制作模板,下面的 template 中就会出现我们的提示词书写格式,旁边也会给出分区示意图。像这样使用这个模板:

左右两列都使用的公共内容 ADDCOMM
左侧的特殊内容 ADDCOL
右侧的特殊内容

"2girls","walking on the street" ADDCOMM
"black clothes","white hair" ADDCOL
"white clothes","black hair"

这一次的生成结果没有任何错误

image.png

这个插件的功能不止这么简单,你可以生成纵横交错的网格,甚至可以上传蒙版使用不规则的区域划分。网格里填充的也可以是背景或者物品,详情请大家在插件 github 地址自行查看。对二次元来说,多画风多特征的人物同框也全得靠它。

08effe42f838d269ddc2a060dbbb07c9.png

图生图之 inpaint

刚才这张图我非常满意,但是我希望图片中的女孩换个表情或者修改一下她的装饰,可以吗?答案是肯定的,接下来我们将请出后半部分文章的主角:图生图。你可以点击顶部 tab 栏的 img 2 img,或者直接从生成的图片下方按钮切换过去。

image.png

我们希望把女孩的表情改成闭眼和笑脸,因此添加两个关键词,并选择局部重绘,涂抹脸部。点击生成后可以看到,女孩除了涂抹的部分,没有任何变化,涂抹的部分如愿被修改了。一般情况下并不需要涂抹的非常精准,如果遇到了需要精准分隔的场景,你可以试试用 ps 制作蒙版。

image.png

图生图之 controlnet

如果我们对生成图片中的人物不满意,想要保留姿势但把人物整体替换掉,这种听起来像魔法一样的事情可以做到吗?答案还是肯定的。使用 controlnet 分析生成的图片,提取人物骨骼,并用骨骼生成另一张图片,以此来保留人物姿势。

image.png

  • controlnet 作为 extension 可以扩展 sd 的图像生成能力,sd 作为一个 diffusion 模型,本身在生成图像时并不知道图像中每个部分具体表示什么元素。没错,在人类看来有意义的图片在 sd 眼里和一堆噪点没什么两样,具体原因解释起来牵扯太多,大家请向非常好用的 chatgpt 老师提问。
  • 我们这里使用的是比较简单的 openpose 姿态控制,这里首先需要安装 controlnet 这个插件,其次还需要安装一个 controlnet 使用的模型,我这里直接给出地址 NoobAI-XL ControlNet-OPENPOSE,把它放在目录 stable-diffusion-webui\extensions\sd-webui-controlnet\models 下。需要注意的是,这个controlnet 模型并不是通用的,对基于 noobAI xl 的模型效果才好,别的模型请自己在 C站 搜索相关资源。想要体验其他各种控制类型的话,也得下载相应的资源。
  • 再补充一点,controlnet openpose 提取骨骼也不是每次都能成功的,一般情况下,越平面化、弱对比的风格越难提取,提取失败或者有明显问题,可以通过插件手动修改骨骼节点,也可以上网找一些对比度高的真人pose图尝试,还可以试着使用 PoseMy 这类网站。

图生动画之 animetediff & 逐帧动画

animetediff 也是一个 extension,用来生成动画,生成效果因模型而异,非常遗憾的是我们这次作为例子的模型动画能力有所欠缺,就不多介绍,使用其他模型的大家可以手动尝试一下。请注意,这个插件也和 controlnet 一样需要自己的模型,请根据自己的 sd 模型寻找资源放到 extension 下对应的目录。如果你多次尝试,生成的动画效果仍然不理想,那可以考虑暂时放弃这个功能。现在的 ai 动画还没有到成熟阶段,静静等待大佬喂饭也不失为一种智慧。

a385463c7bb8db4b9b395ab23d5ce017.jpeg

如果你真的很想自己制作动画,我还有一种比较古老且传统的方式要介绍:图生图制作简单的逐帧动画。比如下面这个示例:

ezgif.com-animated-gif-maker.gif

我使用局部重绘,绘制了3张图片,分别是睁眼,半睁,闭眼,随后把它们转化成了像素风格,并拼接成了逐帧动画,缺点很明显:本来打算制作的人物呼吸态,随着涂抹范围增大,重绘区域也逐渐变得难以控制,最后作为一个试验,我还是仅仅制作了睁眼闭眼的部分。操控骨骼或者手动改帧已经太接近传统的动画人工作流了,不太符合我们高贵的 AI 产品用户身份。

  • 为什么 AI 不能辅助划分人体的组件,并提取骨骼呢?其实可以,只不过是基于图像分析,而不是在生成过程中完成的。我们刚才提过了,这是 diffusion 模型的原理决定的,也许以后会有基于 3d 的图像生成技术,那时绝对可以真正意义上实现动画自由。

其他

  • 文章到这里结束了,后面几部分讲的不太详细,这篇文章仅仅是个入门指南,抛砖引玉,感兴趣的各位欢迎评论区探讨指正。像是 controlnet 和 lora 训练,可以聊的东西还有很多。
  • 这两天不仅重新研究了一下 sd,还顺便研究了一下 so-vits,语音转录和文本转化也已经基本成熟,感兴趣的可以在 这里 体验一下 TTS 的 demo。不过希望大家学习使用 AI 的同时,也多多思考技术的边界到底在哪里,有些非法营利的事情是不能干的。
  • 最后回归一下我前端的老本行:Web3 会是版权的出路吗?