Stable Diffusion ControlNet 完全指南

news2024/11/19 10:34:04

ControlNet 是 Stable Diffusion中的一种扩展模型,通过这种扩展模型,我们能够将参考图像的构图(compositions )或者人体姿势迁移到目标图像。

资深 Stable Diffusion 用户都知道,很难精准控制Stable Diffusion生成的图像,比如如何在不同场景中保持原来的构图(compositions )或者人物形象,但是有了ControlNet ,这些问题变得轻松多了。

这篇文章,我带你系统了解:

  1. 什么是ControlNet;

  2. ControlNet的工作原理

  3. ControlNet 常用preprocessing

  4. 如何部署和使用ControlNet

ControlNet 是用来控制Stable Diffusion 模型的一种神经网络模型。Stable Diffusion 本身是一种根据文本或者图像用来生成图像的扩散模型,在生成图像过程中,可以通过 ControlNet 引入更多条件来干预图像生成过程,它可以(也需要) 跟现有 任何 Stable Diffusion 模型搭配使用。

下面举两个例子来说明ControlNet 如何来干预图像生成:

1. 使用canny边缘检测 来控制图像生成

在这个示例图中,有两种条件来控制最终的图像生成:文本条件和canny边缘检测结果(control map)。前者是prompt,大家都很熟悉了,后者需要额外提供参考图像,示例中通过canny 边缘检测器,提取参考图像的边缘信息。两者共同作用于目标图像。

从参考图像中提取额外信息的过程,在Stable Diffusion中有专门的术语叫:preprocessing。

2. 使用OpenPose来迁移人物姿势特征

OpenPose是一种快速检测人体特征的模型,包括手,脚,肩膀,头和眼睛等位置特征。

从上面示例,大家能够看到边缘检测器和OpenPose的一些区别,前者勾勒人物轮廓,目标图像会保留原图中的头发,衣服等轮廓,适合于一些富含边缘信息的主题和背景迁移,而后者更自由,它关注人物的关键姿势特征,但是不会保留那些衣服,头发等的轮廓信息。

实际上,OpenPose相关的有多种preprocessing,比如:

OpenPose: ,nose, eyes, neck, shoulder, elbow, wrist, knees, and ankles.

OpenPose_face: OpenPose + facial details

OpenPose_hand: OpenPose + hands and fingers

OpenPose_faceonly: facial details only

OpenPose_full: All of the above

OpenPose有专门提取脸部特征,手部特征,关节,膝盖,脚踝以及以上特征的组合等多种模型。这么看,OpenPose 也并不是那么粗枝大叶,也可以做到精细控制,为什么有专门针对脸和手的模型呢?因为没有这些模型,Stable Diffusion对手的生成 不在行,经常出现 多手指或者手指变形等情况,人脸的重要性更不用说了,脸部细节直接关系结果图像的成败。

关于OpenPose提取人体特征,我们看几个例子:

这里是根据脸部表情特征 生成的目标图像:

可见,这个模型处理好的话,可以用于那些对人物角色形象相似度度要求不高,但是又要求是同一人物的场景。

Reference

跟OpenPose相似的另一个preprocessing是Reference。Reference能够生成跟参考图像相似的图像,这个特性经常用于在不同场景中生成同一人物形象,比如绘本创作中,至少要求是同一张脸。OpenPose 虽然也能精细控制脸,但是 相比 Reference,OpenPose 主要是保证脸部,包括眼睛,鼻子等的相似,但是 整体脸部效果 还是不能保证。

使用 Reference 只需要选择 preprocessing,不需要搭配模型,在SD web Ui中,选择模型选项自动不可用。

有3个Reference相关的preprocessing:

Reference adain: Style transfer via Adaptive Instance Normalization. (paper【https://arxiv.org/abs/1703.06868】)

Reference only: Link the reference image directly to the attention layers.

Reference adain+attn: Combination of above.

Reference adain 在github中有关讨论:

https://github.com/Mikubill/sd-webui-controlnet/discussions/1280

Reference only 在github中有关讨论:

https://github.com/Mikubill/sd-webui-controlnet/discussions/1236】

结合作者的评论,使用中推荐Reference only。

ControlNet Inpainting

ControlNet Inpainting 其实是借助类似蒙版的概念,能够对图像的部分进行修改,而保持其他部分不变。举个例子,将下面美女的脸换一下,同时保持图像其他整体风格和内容不变。

这是原图:

我们在原图中将脸打上掩码:

选择重新生成掩码部分,将得到新的脸:

这一步你也可以选择保持掩码部分不变,而改变其他地方。

 inpainting preprocessors 相关的有3种:

Inpaint_global_harmonious: Improve global consistency and allow you to use high denoising strength.

Inpaint_only: Won’t change unmasked area. It is the same as Inpaint_global_harmonious in AUTOMATIC1111.

​Inpaint_only+lama: Process the image with the lama model. It tends to produce cleaner results and is good for object removal.

前两个作用是一样的,都保持掩码区域内容不变。Inpaint_only+lama 能够生成更干净的图像,luma 在这里有详细介绍:

https://github.com/advimman/lama

它利用傅里叶变换进行inpainting,能够生成更高分辨率的图像。可用于对象清除,比如下面示例:

Depth

ControlNet 深度预处理器是用于处理图像中的深度信息的工具。它可以用于计算图像中物体的距离、深度图等。

depth map是跟原图大小一样的存储了深度信息的灰色尺度( gray scale )图像,白色表示图像距离更近,黑色表示距离更远。

举个例子,原图和它的depth map 深度信息图(MIDaS编码):

Depth-to-image (Depth2img) 

可以看作是 image-to-image (img2img)  的加强版,是一个在 Stable Diffusion v2 中未受重视的模型。

相比img2img,Depth2img 不仅能够利用 文本prompt,原来的图像,还可以使用原来图像的深度信息来控制图像的生成,也就是说,相比前者,他有3维参考信息。使用Depth-to-image 可以独立地控制合成图像中的物体和背景,从而得到更好的结果图像。但是 使用方式跟 前者一样,深度信息是自动进行的。

为了直观地比较两种模型生成的图像质量,我们以一张原始图,来看两者的输出结果:

现在我们拿这张图做参考图,输入:

photo of two men wrestling

生成两个男人摔跤的图像:

分别调节去噪强度参数,可以发现,imgimg明显丢失了原图信息,而depth2img较好地保留了原图中的信息。

注:depth2img 也可以用于inpainting。

Segmentation

Segmentation  preprocessors 能够识别出图像中的各种对象,比如下例中,能够将图中不同的对象,建筑,行人,天空,树木等用不同的颜色标出:

然后用同样的提示词,可以生成新的图像:

Futuristic city, tree, buildings, cyberpunk

T2I adapter

t2ia_style_clipvision preprocessor 能够将参考图像转换为包含原图中丰富的内容和样式的CLIP vision embedding。

而如果没有使用该模型,则产生的新的图像跟原图差距很大,这一模型相比Reference preporocssor 效果更好。感兴趣的读者可以试试。

MLSD 

M-LSD (Mobile Line Segment Detection)是一个直线检测器,它很擅长提取直线边缘的轮廓信息,比如建筑,街区,相框等,可以用于室内设计,比如提供这样的参考图:

输入:

award winning living room

可以生成下面的目标图像:

Stable Diffusion 部署与使用ControlNet

接下来,简单过一遍,如何部署和使用Stable Diffusion ControlNet。假设你已经下载并成功启动了AUTOMATIC1111  WebUi,接下来我详细介绍下如何安装ControlNet扩展。

导航到extensions,选择从URL安装,输入下面网址:

https://github.com/Mikubill/sd-webui-controlnet

点击安装,安装完成之后,回到Installed tab,确认勾选了 contrlnet extension,然后重启。

重启之后,如果能够看到 ControlNet tab 说明一切正常。将下面图片上传到图像面板:

就可以使用上面介绍的任意preprocessing来预览提起的特征,比如以OpenPose为例:

输入prompt就可以将原图的姿势迁移到目标图像中:

还可以使用canny 边缘检测:

其他特征提取都可以类似下面勾选不同的方法来预览。

关于ControNet的总体知识,我基本介绍完了,关于ControlNet的知识还有很多,限于篇幅无法一一介绍,最后我再给一个效果案例,感兴趣的可以去测试下能否复现,这里是原图:

效果图如下:


如果有任何问题欢迎评论和加群交流。

公开微信交流群私密知识星球群

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/813314.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

protobuf配置过程

一、配置过程 vs2022 第一次下载cmake 3.17 x64.msi , 发现没有vs2022选项。 第二次下载最新版本cmake 3.27 x64.msi , 发现不兼容vs2022 , 会闪退; 第三次下载了倒数第二新的版本cmake 3.26 x64.msi , 这次完美gen…

简单认识redis高可用实现方法

文章目录 一、redis群集三种模式二、 Redis 主从复制1、简介2、作用:3、流程:4.配置主从复制 三、Redis 哨兵模式1、简介2、原理:3、作用:4、哨兵结构由两部分组成,哨兵节点和数据节点:5、故障转移机制:6、…

C/C++ 线程池工作原理 C代码实现

1. 线程池作用 如果多次使用线程,那么就需要多次的创建并撤销线程。但是创建/撤销的过程会消耗资源。线程池是一种数据结构,其中维护着多个线程,这避免了在处理短时间任务时,创建与销毁线程的代价。即在程序开始运行前预先创建一…

day15 | 110.平衡二叉树 257.二叉树的所有路径 404.左叶子之和

文章目录 一、平衡二叉树二、[回溯小难]二叉树的所有路径三、左叶子之和 一、平衡二叉树 110.平衡二叉树 依旧是使用后序遍历来统计高度。 递归过程中,发现某节点的左右子树的高度差超过了1,我们就直接返回-1,不返回节点的高度了。 递归函…

C/C++开发,opencv与qt结合播放视频

目录 一、qt_ui创建 1.1 ui设置 1.2 ui及代码输出保存 二、创建工程 2.1 工程目录及编译设置 2.2 源码设计 三、编译及测试 3.1 程序编译 3.2 程序运行 首先声明,这是一个OpenCV 3学习文档的案例,但是说明有些过于省略,只有一些简短的代码…

ubuntu20.04终端中文显示乱码

我在配置好ubuntu20.04虚拟机以后,用xshell连接到终端,发现中文来不能显示,尝试过设置xshell的显示格式,不能解决问题。 经过研究,发现要修改ubuntu20.04本身的字体格式,解决方式如下: 1.修改~…

JavaBean

一、JavaBean的概念 1、JavaBean就是MVC设计模式中的model层 2、种类:数据bean(pojo),逻辑bean 数据bean分为: 表单bean 封装表单里的参数,属性名字、个数和类型要和表单的参数的名字、个数和类型一致…

我对排序算法理解

排序算法一直是一个很困惑我的问题,早在刚开始接触 数据结构的时候,这个地方就很让我不解。就是那种,总是感觉少了些什么的感觉。一开始,重新来过,认真来学习这一部分,也总是学着学着就把概念记住了。过了一…

【Rust学习 | 基础系列3 | Hello, Rust】编写并运行第一个Rust程序

文章目录 前言一,创建项目二,两种编译方式1. 使用rustc编译器编译2. 使用Cargo编译 总结 前言 在开始学习任何一门新的编程语言时,都会从编写一个简单的 “Hello, World!” 程序开始。在这一章节中,将会介绍如何在Rust中编写并运…

Elasticsearch搜索引擎系统入门

目录 【认识Elasticsearch】 Elasticsearch主要应用场景 Elasticsearch的版本与升级 【Elastic Stack全家桶】 Logstash Kibana Beats Elasticsearch在日志场景的应用 Elasticsearch与数据库的集成 【安装Elasticsearch】 安装插件 安装Kibana 安装Logstash 【认…

Day01-作业(HTMLCSS)

作业1:通过HTML的标签及CSS样式,完成如下企业简介html页面的制作。 【必做】 A. 最终效果如下: B. 文字素材如下: 企业简介传智教育(股票代码 003032),隶属江苏传智播客教育科技股份有限公司,注册资本4亿元…

【NVIDIA CUDA】2023 CUDA夏令营编程模型(一)

博主未授权任何人或组织机构转载博主任何原创文章,感谢各位对原创的支持! 博主链接 本人就职于国际知名终端厂商,负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作,目前牵头6G算力网络技术标准研究。 博客…

【Git】Git GitHub

1. Git1.1 Git基本操作1.2 Git版本回退1.3 Git分支操作 2. Git 配合GitHub2.1 生成密钥2.2 GitHub添加公钥2.3 Git连接GitHub2.4 本地仓库关联远程仓库2.5 本地代码push远程仓库2.6 本地clone远程仓库2.7 本地fetch和pull 1. Git 1.1 Git基本操作 touch test.py 工作区创建文…

全网最细,Postman接口测试实战详细总结,一篇进阶...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 Postman是一款功能…

【力扣每日一题】2023.7.30 环形链表2

题目: 示例: 分析: 这道题属于是那种知道解法就很简单,不知道解法就很难独立想出来的那种,我们只需要稍微记住这类题的固定解法就可以。 所以接下来我先说解法,再解释为什么解法可以解出来。 那么我们都…

nginx使用-(想学nginx,这篇就够了)

nginx使用-(想学nginx,这篇就够了) upstream wgz{server 127.0.0.1:8081 ;server 127.0.0.1:8082 ;fair;}反向代理 动静分离 负载均衡 高可用集群配置 反向代理 upstream要转发的地址的配置proxy_pass请求转发的地址 location /user{proxy_…

程序设计 算法基础

✅作者简介:人工智能专业本科在读,喜欢计算机与编程,写博客记录自己的学习历程。 🍎个人主页:小嗷犬的个人主页 🍊个人网站:小嗷犬的技术小站 🥭个人信条:为天地立心&…

【并发专题】操作系统模型及三级缓存架构

目录 课程内容一、冯诺依曼计算机模型详解1.计算机五大核心组成部分2.CPU内部结构3.CPU缓存结构4.CPU读取存储器数据过程5.CPU为何要有高速缓存 学习总结 课程内容 一、冯诺依曼计算机模型详解 现代计算机模型是基于-冯诺依曼计算机模型 计算机在运行时,先从内存中…

python学习之【浅拷贝】

前言 上一篇文章,python学习之【继承、封装、多态】主要学习了面向对象的三大特征。这篇文章记录下对python的浅拷贝的学习,下一篇文章接着学习深拷贝。 简单了解 浅拷贝:python拷贝一般都是浅拷贝,拷贝时,对象包含的…

【C语言】函数重难点之函数递归

大家好,我是深鱼~ 目录 一、函数递归知识讲解 1.什么是递归? 2.递归的两个必要条件 2.1练习1: 2.2练习2: 二、递归与迭代 2.1练习3 2.2练习4 一、函数递归知识讲解 1.什么是递归? 程序调用自身的编程技巧称为…