本文正在参与「金石方案」

欢迎重视微信大众号:FSA全栈举动

一、介绍

在上一篇 《AI – stable-diffusion(AI 绘画)的建立与运用》 中, 介绍了 SD 的环境建立与运用,调配各种特征模型文件,SD 的文生图功用就能够依据咱们输入的提示词(Prompt),制作出各种各样的精巧图片。可是,在深度运用之后你会发现,想让 AI 制作出自己满足的图片并不容易,乃至多次调整提示词(Prompt)也生成不出来咱们想要的画面。

注:后续文中提到的 SD 代指 stable-diffusionstable-diffusion-webui

这时你需求一个大杀器 ControlNetSD 调配上 ControlNet 之后,就能够做到精准控图了,先来看看几个 ControlNet 能做到的作用:

AI - AI绘画的精准控图(ControlNet)

  • ControlNet 官方库房:github.com/lllyasviel/…

二、装置

SD 一样,ControlNet 官方库房不适合新手直接运用,咱们能够装置 stable-diffusion-webui 的一个插件(sd-webui-controlnet)来运用 ControlNet,这是插件的 github 地址

  • github.com/Mikubill/sd…

1、装置插件

装置这个插件很简单,在 webui 页面上找到 Extensions -> Install from URL,输入插件的 git 地址 https://github.com/Mikubill/sd-webui-controlnet.git,点击 Install 即可:

AI - AI绘画的精准控图(ControlNet)

等待 loading 完毕后,页面底部会出现 Installed into xxx. Use Installed tab to restart. 提示,这时再依次找到 Extensions -> Installed -> Apply and restart UI 重启 webui

AI - AI绘画的精准控图(ControlNet)

重启完结后,就能够在 txt2imgimg2img 中看到会多出来一个 ControlNet 选项,这样插件就装置完结了:

AI - AI绘画的精准控图(ControlNet)

2、装置模型

sd-webui-controlnet 插件装置完结之后,还需求装备一下 ControlNet 的专属模型(留意:不要跟 SD 的模型搞混了)。在此之前,先来了解一下 ControlNet 的绘画流程:

  1. 用户供给一张参阅图,ControlNet 依据指定的形式对参阅图进行预处理,得到一张新图,作为另一张参阅图。
  2. 依据提示词(Prompt),结合前面的(1 张 或 2 张)参阅图,进行图画制作。

AI - AI绘画的精准控图(ControlNet)

上述流程的两个阶段,对应用到的模型有两种,以下是它们的下载地址:

  1. 预处理器模型(annotator):huggingface.co/lllyasviel/…
  2. 预练习模型(models):huggingface.co/lllyasviel/…

注:预练习模型(裁剪过的 models):huggingface.co/webui/Contr…

翻开预处理器模型(annotator)网址,将需求用到的模型下载下来后,保存到插件的 annotator 目录下:

AI - AI绘画的精准控图(ControlNet)

留意:预处理器模型需按分类目录寄存,例如 body_pose_model.pthhand_pose_model.pth 应保存到 openpose 目录;而 upernet_global_small.pth 则是保存到 uniformer 目录;其他模型文件可依据关键字,找到对应寄存目录。

插件的 annotator 目录:stable-diffusion-webui\extensions\sd-webui-controlnet\annotator

翻开预练习模型(models)网址,将需求用到的模型下载下来后,保存到插件的 models 目录下:

AI - AI绘画的精准控图(ControlNet)

留意:这步别急着着手,下面有体积更小的模型。⚠️⚠️⚠️

插件的 models 目录:stable-diffusion-webui\extensions\sd-webui-controlnet\models

ControlNet 官方寄存在 huggingface 上的预练习模型文件一个个都是 5 个 G 起步,这是由于它们内部都包含了 SD 那个将近 4 个 G 的 v1-5-pruned-emaonly 模型,这在 stable-diffusion-webui 环境下是没必要的,这时咱们能够运用专门裁剪过的预练习模型文件,体积会少很多:

  • 预练习模型(裁剪过的 models):huggingface.co/webui/Contr…

AI - AI绘画的精准控图(ControlNet)

注:一般把全部 control_xxx.safetensors 文件下载下来保存到本地 models 目录下即可,假如你觉得模型文件太多,磁盘空间占用太大,也能够按需下载。

三、运用

sd-webui-controlnet 插件和模型文件(预处理器模型、预练习模型)都装置完结之后,再重启一次 webui 就能够正常运用 ControlNet 功用了。

1、人体姿势(Human Pose

依据 civitai 网站上的 Deliberate 模型事例,生成一张牛奶工的图片:

AI - AI绘画的精准控图(ControlNet)

现在咱们期望 AI 制作出来的牛奶工他是坐着的,这时,就能够用上 ControlNet 选项了。展开 ControlNet 选项之后,把 Enable 勾上使其收效,之后,指定 openpose 所需的预处理器模型(Preprocessor)和预练习库模型(Model):

AI - AI绘画的精准控图(ControlNet)

注:假如你运用的是 8G 以下显存(或许想获取更大的批量巨细),能够把 Low VRAM 勾上。 github.com/lllyasviel/…

ControlNet 选项装备完结后,其它保持不变,点击 “Generate” 按钮从头生成,这时制作出来的牛奶工的姿势就跟咱们供给的参阅图根本共同了:

AI - AI绘画的精准控图(ControlNet)

注:图中牛奶工的小腿摆向与骨架图中的小腿摆向不符,不过全体作用已经很不错了,信任后续 ControlNet 能优化好这一点。

你也能够看到,SD 同时还生成出了一张骨架图,这骨架图是在 ControlNet 的预处理阶段生成的。并且 openpose 主要依据的参阅图便是这张骨架图,也便是说,当咱们手上有现成的骨架图时,完全能够直接将骨架图作为参阅图,越过预处理阶段(设为 “none”),直接进入绘图阶段。有兴趣的能够着手试试,作用是一样的:

AI - AI绘画的精准控图(ControlNet)

2、从头上色和风格化(Canny EdgeHED Boundary

假如你期望对现有的图片从头上色或换一种风格,能够运用 ControlNet 以下两个模型,它们的主要区别是边际检测算法不同:

  • Canny Edge 模型:选用 Canny 边际检测算法
  • HED Boundary 模型:选用 HED(Holistically-Nested Network) 边际检测算法

下面咱们就别离选用这两种模型来试试,这是 Canny Edge 模型:

AI - AI绘画的精准控图(ControlNet)

AI - AI绘画的精准控图(ControlNet)

这是 HED Boundary 模型:

AI - AI绘画的精准控图(ControlNet)

AI - AI绘画的精准控图(ControlNet)

能够直观看到,两种模型生成的 边际检测图 不同,然后终究制作出来的图片细节上也有不同(留意看小女孩头发上的 3 个反光点),至于哪个更好,看个人感觉吧,我觉得 HED Boundary 模型好一点。关于这两种边际检测算法的阐明,能够检查以下文章了解:

  • 边际检测的三种算法介绍:zhuanlan.zhihu.com/p/35694372
  • 边际检测之 HED:zhuanlan.zhihu.com/p/43600043

3、草图制作(Scribbles

运用 Scribbles 模型,能够依据草图(涂鸦)制作出精巧的图片,对于那些没有学过美术或许没有绘画天赋的人来说,简直太棒了。

AI - AI绘画的精准控图(ControlNet)

提示词(Prompt):hot air balloon

AI - AI绘画的精准控图(ControlNet)

假如你懒得自己画草图,也能够将一张现成的著作交给 ControlNet,由它帮你画,留意,此刻的预处理器模型换成了 fake_scribble(从制品图中提取出草图),而预练习模型仍是 control_scribble-fp16(依据草图制作著作):

AI - AI绘画的精准控图(ControlNet)

注:这儿是我唯一一处勾选了 Low VRAM 的当地,由于在进行提取草图的预处理阶段,操控台报了显存缺乏的过错,此刻草图也就没能提取成功,勾选 Low VRAM 之后,全部就正常了。

AI - AI绘画的精准控图(ControlNet)

4、建筑物制作(M-LSD Lines

假如你期望是对建筑物进行从头上色和风格化,能够运用 M-LSD 模型:

AI - AI绘画的精准控图(ControlNet)

AI - AI绘画的精准控图(ControlNet)

5、语义切割制作(Semantic Segmentation

Semantic Segmentation 语义切割是一种深度学习算法,要点重视 语义 一词,这种算法将一个标签或类别与图画联系起来,被用来识别形成不同类别的像素调集。这么说有点笼统,咱们先直接运用这个模型,看会生成出什么东西:

AI - AI绘画的精准控图(ControlNet)

AI - AI绘画的精准控图(ControlNet)

留意:假如语义切割图没有生成出来,请检查操控台是否有报错,别的,检查一下 upernet_global_small.pth 是否有保存到 extensions\sd-webui-controlnet\annotator\uniformer 目录。由于 SD 自己也有一个 models\uniformer 目录,假如你前面没有手动放置好 upernet_global_small.pth 模型文件,那么在用到 Semantic Segmentation 模型时,SD 会自动帮你下载一个到它自己的 models\uniformer 目录,这是个大坑,不过还好,这种状况操控台会报错,能够排查到这个问题。

能够看到,预处理阶段生成了一张花花绿绿的图片,这便是语义切割图,这图中的每一种色彩都代表了一类物品,比方紫色(#cc05ff)代表床(bed),橙黄色(#ffc207)代表垫子(cushion),金黄色(#e0ff08)代表台灯(lamp), ControlNetSemantic Segmentation 模型运用的是 ADE20K 协议,这些色彩值都能够在下面网址中找到对应的含义:

  • docs.google.com/spreadsheet…
  • www.researchgate.net/figure/Sema…
  • github.com/CSAILVision…

既然如此,那咱们能够反向操作,修正某个物品的色彩,替换终究生成出来的图中的某样物品,比方把台灯(#e0ff08)换成花(#ff0000):

AI - AI绘画的精准控图(ControlNet)

注:跟 openpose 直接供给骨架图一样,这儿咱们直接供给了语义切割图,所以预处理器挑选 “none”。别的,留意此处我固定了 Seed 的值,这样终究生成出来的图片能跟上面的比如保持根本共同。

AI - AI绘画的精准控图(ControlNet)

能够看到,终究制作出来的图中,床边的台灯被替换成了花。

6、三维制图(DepthNormal Map

假如你期望能对图中 3D 物体比较细致的把控,能够运用 ControlNet 供给的以下 2 种模型:

  • Depth 模型:从原图中提取深度图,能较好的掌握复杂的三维结构层次,并将其复现。
  • Normal Map 模型:从原图中提取 3D 物体的法线向量,制作的新图与原图的光影作用完全相同。

下面咱们就运用相同提示词(Plaster statue of Abraham Lincoln),别离选用这两种模型来试试,这是 Depth 模型:

AI - AI绘画的精准控图(ControlNet)

AI - AI绘画的精准控图(ControlNet)

这是 Normal Map 模型:

AI - AI绘画的精准控图(ControlNet)

AI - AI绘画的精准控图(ControlNet)

相比于 Depth 模型,Normal Map 模型能更好的保留几许形状,并且有更多的细节信息,留意看男人头发的形状。

注:建议 Depth 模型用于 3D 场景,Normal Map 模型用于 3D 物体。

四、实验特性

咱们先明确一点,提示词(Prompt、Negative Prompt)是运用 SD 必不可少的一环,你需求对终究生成的图片进行描绘,才能让 SD 更精确的制作出你要的图片作用,而 ControlNet 只是以 SD 为基础的功用扩展(更好的操控图片的生成,辅助性的),不是单独的程序。目前 ControlNet 有 2 个强壮但还处于实验阶段的功用,别离是:

  • Guess Mode:猜测形式(或许叫 non-prompt mode
  • Multiple ControlNets:多个 ControlNet

ControlNetGuess Mode(猜测形式)的主要作用便是依据供给的参阅图猜测你可能要运用的内容映射(深度?边际?涂鸦?),即使在你不供给任何提示词(Prompt、Negative Prompt)的状况下,也能进行精确猜测。但实际测验的成果,并没有官方说的那么强(可能是我运用方法不对吧~),这儿就有不多介绍了,感兴趣的能够阅览下官方介绍和事例:

  • Guess Mode 介绍:github.com/lllyasviel/…

下面主要来介绍 Multiple ControlNets,在搞懂它之前,咱们先将该功用敞开准备好。在 Settings 页面中,找到 ControlNet 分类,指定 Multi ControlNet 的个数(默认为 1),点击 Apply settings 保存装备,终究还得重启一次 webui

AI - AI绘画的精准控图(ControlNet)

注:最多能够敞开 10 个,依据状况调整即可。

重启之后,再回到 txt2img 检查 ControlNet 选项,能够看到现在 ControlNet 选项中有 2 个 ControlNet Model 子页面了:

AI - AI绘画的精准控图(ControlNet)

顾名思义,Multiple ControlNets 便是敞开多个 ControlNet,而 ControlNet 是可组合的,当多个 ControlNet 组合运用时,就能够对 SD 进行多条件操控,将多个 ControlNet 的产物,结合提示词(Prompt)制作出图片,简单理解的话,便是多图合成。现在,我在没有运用 Multiple ControlNets 的状况下,让 AI 制作一张宇航员在五颜六色科幻山太空场景中的图片,作用如下:

AI - AI绘画的精准控图(ControlNet)

提示词:astronaut in colorful scifi mountain space scene

看起来全部都很完美,可是呢,假如我想操控整个构图,比方布景概括(山体、地上、月亮等等),以及宇航员的姿势方位的话,应该怎么办呢?依据前面列举出来的全部 ControlNet 模型作用可知,布景概括能够运用 Depth 模型,能依据供给的布景参阅图进行三维结构的复刻并从头上色风格化,而宇航员的姿势则能够运用 openpose 模型进行操控。前面的全部事例,都是单个 ControlNet 模型的运用,而现在,这儿就能够运用 Multiple ControlNets 组合多个 ControlNet 模型来控图了。先来装备第 1 个 ControlNet,用来操控布景的 Depth 模型:

AI - AI绘画的精准控图(ControlNet)

注:假如手上有现成的深度图,那么能够越过预处理阶段(Preprocessor 装备为 “none”),缩短时间。别的,留意这个 Weight 值我调整为 0.35 了,由于假如运用默认值 1 的话,与下面宇航员姿势的权重适当,终究生成的图片里宇航员的姿势不可控。

再来装备第 2 个 ControlNet,用来操控宇航员姿势的 openpose 模型:

AI - AI绘画的精准控图(ControlNet)

注:这个骨架图运用了 openpose-editor 插件制作,也是一个 SD 插件,装置过程参阅本文中 sd-webui-controlnet 插件的装置流程,除了 git 地址不同,其他都一样。

github.com/fkunn1326/o…

这时再运用相同的提示词,点击 “Generate” 按钮,终究生成出来的图片作用如下:

AI - AI绘画的精准控图(ControlNet)

注:重视 FSA全栈举动 微信大众号,回复 “五颜六色科幻山” 可获得原始作用图哦~❤️

假如文章对您有所帮助, 请不吝点击重视一下我的微信大众号:FSA全栈举动, 这将是对我最大的鼓励. 大众号不仅有Android技术, 还有iOS, Python等文章, 可能有你想要了解的技术知识点哦~

AI - AI绘画的精准控图(ControlNet)

本文正在参与「金石方案」