本文正在参与「金石方案」
欢迎重视微信大众号:FSA全栈举动
一、介绍
在上一篇
《AI – stable-diffusion(AI 绘画)的建立与运用》 中, 介绍了 SD
的环境建立与运用,调配各种特征模型文件,SD
的文生图功用就能够依据咱们输入的提示词(Prompt),制作出各种各样的精巧图片。可是,在深度运用之后你会发现,想让 AI 制作出自己满足的图片并不容易,乃至多次调整提示词(Prompt)也生成不出来咱们想要的画面。
注:后续文中提到的
SD
代指stable-diffusion
或stable-diffusion-webui
。
这时你需求一个大杀器 ControlNet
,SD
调配上 ControlNet
之后,就能够做到精准控图了,先来看看几个 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
即可:
等待 loading 完毕后,页面底部会出现 Installed into xxx. Use Installed tab to restart.
提示,这时再依次找到 Extensions
-> Installed
-> Apply and restart UI
重启 webui
:
重启完结后,就能够在 txt2img
和 img2img
中看到会多出来一个 ControlNet
选项,这样插件就装置完结了:
2、装置模型
sd-webui-controlnet
插件装置完结之后,还需求装备一下 ControlNet
的专属模型(留意:不要跟 SD
的模型搞混了)。在此之前,先来了解一下 ControlNet
的绘画流程:
- 用户供给一张参阅图,
ControlNet
依据指定的形式对参阅图进行预处理,得到一张新图,作为另一张参阅图。 - 依据提示词(Prompt),结合前面的(1 张 或 2 张)参阅图,进行图画制作。
上述流程的两个阶段,对应用到的模型有两种,以下是它们的下载地址:
- 预处理器模型(
annotator
):huggingface.co/lllyasviel/… - 预练习模型(
models
):huggingface.co/lllyasviel/…
注:预练习模型(裁剪过的
models
):huggingface.co/webui/Contr…
翻开预处理器模型(annotator
)网址,将需求用到的模型下载下来后,保存到插件的 annotator
目录下:
留意:预处理器模型需按分类目录寄存,例如
body_pose_model.pth
和hand_pose_model.pth
应保存到openpose
目录;而upernet_global_small.pth
则是保存到uniformer
目录;其他模型文件可依据关键字,找到对应寄存目录。插件的
annotator
目录:stable-diffusion-webui\extensions\sd-webui-controlnet\annotator
。
翻开预练习模型(models
)网址,将需求用到的模型下载下来后,保存到插件的 models
目录下:
留意:这步别急着着手,下面有体积更小的模型。⚠️⚠️⚠️
插件的
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…
注:一般把全部
control_xxx.safetensors
文件下载下来保存到本地 models 目录下即可,假如你觉得模型文件太多,磁盘空间占用太大,也能够按需下载。
三、运用
sd-webui-controlnet
插件和模型文件(预处理器模型、预练习模型)都装置完结之后,再重启一次 webui
就能够正常运用 ControlNet
功用了。
1、人体姿势(Human Pose
)
依据 civitai
网站上的 Deliberate
模型事例,生成一张牛奶工的图片:
现在咱们期望 AI 制作出来的牛奶工他是坐着的,这时,就能够用上 ControlNet
选项了。展开 ControlNet
选项之后,把 Enable
勾上使其收效,之后,指定 openpose
所需的预处理器模型(Preprocessor)和预练习库模型(Model):
注:假如你运用的是 8G 以下显存(或许想获取更大的批量巨细),能够把
Low VRAM
勾上。 github.com/lllyasviel/…
ControlNet
选项装备完结后,其它保持不变,点击 “Generate” 按钮从头生成,这时制作出来的牛奶工的姿势就跟咱们供给的参阅图根本共同了:
注:图中牛奶工的小腿摆向与骨架图中的小腿摆向不符,不过全体作用已经很不错了,信任后续
ControlNet
能优化好这一点。
你也能够看到,SD
同时还生成出了一张骨架图,这骨架图是在 ControlNet
的预处理阶段生成的。并且 openpose
主要依据的参阅图便是这张骨架图,也便是说,当咱们手上有现成的骨架图时,完全能够直接将骨架图作为参阅图,越过预处理阶段(设为 “none”),直接进入绘图阶段。有兴趣的能够着手试试,作用是一样的:
2、从头上色和风格化(Canny Edge
、HED Boundary
)
假如你期望对现有的图片从头上色或换一种风格,能够运用 ControlNet
以下两个模型,它们的主要区别是边际检测算法不同:
-
Canny Edge
模型:选用 Canny 边际检测算法 -
HED Boundary
模型:选用 HED(Holistically-Nested Network) 边际检测算法
下面咱们就别离选用这两种模型来试试,这是 Canny Edge
模型:
这是 HED Boundary
模型:
能够直观看到,两种模型生成的 边际检测图
不同,然后终究制作出来的图片细节上也有不同(留意看小女孩头发上的 3 个反光点),至于哪个更好,看个人感觉吧,我觉得 HED Boundary
模型好一点。关于这两种边际检测算法的阐明,能够检查以下文章了解:
- 边际检测的三种算法介绍:zhuanlan.zhihu.com/p/35694372
- 边际检测之 HED:zhuanlan.zhihu.com/p/43600043
3、草图制作(Scribbles
)
运用 Scribbles
模型,能够依据草图(涂鸦)制作出精巧的图片,对于那些没有学过美术或许没有绘画天赋的人来说,简直太棒了。
提示词(Prompt):hot air balloon
假如你懒得自己画草图,也能够将一张现成的著作交给 ControlNet
,由它帮你画,留意,此刻的预处理器模型换成了 fake_scribble
(从制品图中提取出草图),而预练习模型仍是 control_scribble-fp16
(依据草图制作著作):
注:这儿是我唯一一处勾选了
Low VRAM
的当地,由于在进行提取草图的预处理阶段,操控台报了显存缺乏的过错,此刻草图也就没能提取成功,勾选Low VRAM
之后,全部就正常了。
4、建筑物制作(M-LSD Lines
)
假如你期望是对建筑物进行从头上色和风格化,能够运用 M-LSD
模型:
5、语义切割制作(Semantic Segmentation
)
Semantic Segmentation
语义切割是一种深度学习算法,要点重视 语义
一词,这种算法将一个标签或类别与图画联系起来,被用来识别形成不同类别的像素调集。这么说有点笼统,咱们先直接运用这个模型,看会生成出什么东西:
留意:假如语义切割图没有生成出来,请检查操控台是否有报错,别的,检查一下
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), ControlNet
的 Semantic Segmentation
模型运用的是 ADE20K
协议,这些色彩值都能够在下面网址中找到对应的含义:
- docs.google.com/spreadsheet…
- www.researchgate.net/figure/Sema…
- github.com/CSAILVision…
既然如此,那咱们能够反向操作,修正某个物品的色彩,替换终究生成出来的图中的某样物品,比方把台灯(#e0ff08)换成花(#ff0000):
注:跟
openpose
直接供给骨架图一样,这儿咱们直接供给了语义切割图,所以预处理器挑选 “none”。别的,留意此处我固定了 Seed 的值,这样终究生成出来的图片能跟上面的比如保持根本共同。
能够看到,终究制作出来的图中,床边的台灯被替换成了花。
6、三维制图(Depth
、Normal Map
)
假如你期望能对图中 3D 物体比较细致的把控,能够运用 ControlNet
供给的以下 2 种模型:
-
Depth
模型:从原图中提取深度图,能较好的掌握复杂的三维结构层次,并将其复现。 -
Normal Map
模型:从原图中提取 3D 物体的法线向量,制作的新图与原图的光影作用完全相同。
下面咱们就运用相同提示词(Plaster statue of Abraham Lincoln),别离选用这两种模型来试试,这是 Depth
模型:
这是 Normal Map
模型:
相比于 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
ControlNet
的 Guess Mode
(猜测形式)的主要作用便是依据供给的参阅图猜测你可能要运用的内容映射(深度?边际?涂鸦?),即使在你不供给任何提示词(Prompt、Negative Prompt)的状况下,也能进行精确猜测。但实际测验的成果,并没有官方说的那么强(可能是我运用方法不对吧~),这儿就有不多介绍了,感兴趣的能够阅览下官方介绍和事例:
-
Guess Mode
介绍:github.com/lllyasviel/…
下面主要来介绍 Multiple ControlNets
,在搞懂它之前,咱们先将该功用敞开准备好。在 Settings
页面中,找到 ControlNet
分类,指定 Multi ControlNet
的个数(默认为 1),点击 Apply settings
保存装备,终究还得重启一次 webui
:
注:最多能够敞开 10 个,依据状况调整即可。
重启之后,再回到 txt2img 检查 ControlNet 选项,能够看到现在 ControlNet 选项中有 2 个 ControlNet Model
子页面了:
顾名思义,Multiple ControlNets
便是敞开多个 ControlNet
,而 ControlNet
是可组合的,当多个 ControlNet
组合运用时,就能够对 SD
进行多条件操控,将多个 ControlNet
的产物,结合提示词(Prompt)制作出图片,简单理解的话,便是多图合成。现在,我在没有运用 Multiple ControlNets
的状况下,让 AI 制作一张宇航员在五颜六色科幻山太空场景中的图片,作用如下:
提示词:astronaut in colorful scifi mountain space scene
看起来全部都很完美,可是呢,假如我想操控整个构图,比方布景概括(山体、地上、月亮等等),以及宇航员的姿势方位的话,应该怎么办呢?依据前面列举出来的全部 ControlNet
模型作用可知,布景概括能够运用 Depth
模型,能依据供给的布景参阅图进行三维结构的复刻并从头上色风格化,而宇航员的姿势则能够运用 openpose
模型进行操控。前面的全部事例,都是单个 ControlNet
模型的运用,而现在,这儿就能够运用 Multiple ControlNets
组合多个 ControlNet
模型来控图了。先来装备第 1 个 ControlNet
,用来操控布景的 Depth
模型:
注:假如手上有现成的深度图,那么能够越过预处理阶段(Preprocessor 装备为 “none”),缩短时间。别的,留意这个
Weight
值我调整为 0.35 了,由于假如运用默认值 1 的话,与下面宇航员姿势的权重适当,终究生成的图片里宇航员的姿势不可控。
再来装备第 2 个 ControlNet
,用来操控宇航员姿势的 openpose
模型:
注:这个骨架图运用了
openpose-editor
插件制作,也是一个SD
插件,装置过程参阅本文中sd-webui-controlnet
插件的装置流程,除了 git 地址不同,其他都一样。github.com/fkunn1326/o…
这时再运用相同的提示词,点击 “Generate” 按钮,终究生成出来的图片作用如下:
注:重视
FSA全栈举动
微信大众号,回复 “五颜六色科幻山” 可获得原始作用图哦~❤️
假如文章对您有所帮助, 请不吝点击重视一下我的微信大众号:FSA全栈举动, 这将是对我最大的鼓励. 大众号不仅有Android技术, 还有iOS, Python等文章, 可能有你想要了解的技术知识点哦~
本文正在参与「金石方案」