可控生成:ControlNet原理

论文:Adding Conditional Control to Text-to-Image Diffusion Models
代码:lllyasviel/ControlNet

简单来说ControlNet希望通过输入额外条件来控制大型图像生成模型,使得图像生成模型根据可控。

1. 动机

当前文生图任务中会出现如下问题:

  • 特定任务中往往无法获取大规模的训练数据
  • 对于大部分人来说,并没有大规模计算集群资源
  • 各种图像生成任务中会有多种问题定义、用户控制条件、图像标注的形式

从而造成当前基于prompt控制的模型并不能满足特定业务需求。ControlNet的提出就是为了解决上面几个问题。

此外,我们在使用Stable Diffusion通过prompt生成图片时,很多时候我们希望能够生成一些固定姿态的物体,如下图所示,可能我们就想生成一只和最左边参考图像中鹿的姿态一摸一样的鹿,很显然如果直接通过prompt很难控制,这里主要有两个难点:

  • 如何非常准确详细的描述左边鹿的姿态
  • 即使参考图片鹿的姿态被描述的很准确,将prompt送入到模型中,依然无法控制姿势不变
    在这里插入图片描述

而通过controlNet即可非常方便的解决这个问题,如下图所示,只需使用canny边缘检测,将参考图片的物体的边缘识别出来,然后将边缘轮廓图作为条件输入到模型中,即可轻松生成与参考图像姿势一样的鹿,同时通过prompt来控制鹿的颜色
在这里插入图片描述
当然,ControlNet功能强大,其输入条件可以是边缘轮廓图、手绘轮廓图、语义分割图、深度图等,从而使得控制变得更加简单。

2. ControlNet原理

如图1左图所示,在一个扩散模型中,如果不加ControlNet的扩散模型,其中原始的神经网络 F \mathcal{F} F 输入 x x x 获得 y y y,其中 Θ \mathcal{\Theta} Θ 是扩散模型的参数。
y = F ( x ; Θ ) y={\mathcal{F}}(x;\Theta) y=F(x;Θ)
在这里插入图片描述

图2.1 controlNet示意图

图1的右图展示了如何在原始神经网络上 F \mathcal{F} F 上构建ControlNet;ControlNet 将一个大型扩散模型的权重克隆为一个“可训练副本”和一个“锁定副本”:锁定的副本 (locked) 保留了从数十亿张图像中学习到的网络能力,而可训练副本 (trainable copy) 在特定任务的数据集上进行训练,以学习条件控制。经过上图所示的改变后,神经网络的输出变成如下式所示:

y c = F ( x ; Θ ) + Z ( F ( x + Z ( c ; Θ z 1 ) ; Θ c ) ; Θ z 2 ) y_{c}={\mathcal{F}}(x;\Theta)+{\mathcal{Z}}({\mathcal{F}}(x+{\mathcal{Z}}(c;\Theta_{z1});\Theta_{c});\Theta_{z2}) yc=F(x;Θ)+Z(F(x+Z(c;Θz1);Θc);Θz2)
其中 Z \mathcal Z Z 是图中所示的零卷积网络, Θ z 1 \Theta_{z1} Θz1 Θ z 2 \Theta_{z2} Θz2分别是两个零卷积的参数。即trainablec copy的输入是原始输入 x x x加上控制条件 c c c经过零卷积的输出。而整个模型的输出是locked copy输出加上trainable copy的输出经过零卷积的结果。

所谓的零卷积层 Z \mathcal Z Z是指初始化weight和bias都为0的卷积层

初始化之后未经训练的ControlNet参数如下式所示;由于零卷积初始化的weight和bias都是零,所以第一个式子为0,带入到第二个式子中,由于可训练的副本是拷贝过来的,在未开始训练时, Θ c \Theta_c Θc是和原始网络参数 Θ \Theta Θ相同的;同理可以得到第三个式子为0
{ Z ( c ; Θ z 1 ) = 0 F ( x + Z ( c ; Θ z 1 ) ; Θ c ) = F ( x ; Θ c ) = F ( x ; Θ ) Z ( F ( x + Z ( c ; Θ z 1 ) ; Θ c ) ; Θ z 2 ) = Z ( F ( x ; Θ c ) ; Θ z 2 ) = 0 \left\{\begin{array}{l l}{{\mathcal{Z}}(c;\Theta_{z1})=0}\\ {{{\mathcal{F}}(x+{\mathcal{Z}}(c;\Theta_{z1});\Theta_{c})={\mathcal{F}}(x;\Theta_{c})={\mathcal{F}}(x;\Theta)}}\\ {{{\mathcal{Z}}({\mathcal{F}}(x+{\mathcal{Z}}(c;\Theta_{z1});\Theta_{c});\Theta_{z2})={\mathcal{Z}}({\mathcal{F}}(x;\Theta_{c});\Theta_{z2})=0}}\end{array}\right. Z(c;Θz1)=0F(x+Z(c;Θz1);Θc)=F(x;Θc)=F(x;Θ)Z(F(x+Z(c;Θz1);Θc);Θz2)=Z(F(x;Θc);Θz2)=0

这表明ControlNet未经训练的时候,输出为0,那加到原始网络上的数字也是0。这样对原始网络是没有任何影响的,就能确保原网络的性能得以完整保存。之后ControlNet训练也只是在原始网络上进行优化,这样可以认为和微调网络是一样的。

3. ControlNet inStable Diffusion Model

3.1 网络结构

ControlNet对Stable Diffusion的控制如下图所示,可以看到控制Stable Diffusion的过程是只将Unet的Encoder部分复制训练,然后通过skip connection与decoder部分进行连接。
在这里插入图片描述
注意,由于Stable Diffusion 1.x中的Unet输入尺寸是64*64*4,因此输入的条件condition首先要通过Feature Convert Block将输入的图像条件,转换成64*64尺寸的特征图,这个特征转换层是一个四层卷积神经网络,卷积核为4×4,步长为2,通道16,32,64,128,初始化为高斯权重。这个网络训练过程是和整个ControlNet进行联合训练。

以上这种网络结构在计算方面是非常高效的,由于只复制了Unet Encoder部分,即只有Unet encoder部分参与训练,这样与原始网络比较起来省略了一半的梯度计算。

3.2 训练过程

如下式所示,将原始SD的损失函数稍微改动下,就可得到ControlNet的损失函数,仍然是预测噪声和真实噪声的L2损失,只是在预测噪声时,新增了与具体任务相关的 c f c_f cf条件, c t c_t ct是prompt条件。
L = E z 0 , t , c t , c f , ϵ ∼ N ( 0 , 1 ) [ ∥ ϵ − ϵ θ ( z t , t , c t , c f ) ) ∥ 2 2 ] \left.\mathcal{L}=\mathbb{E}_{\boldsymbol{z}_0, t, \boldsymbol{c}_t, \boldsymbol{c}_{\mathrm{f}}, \epsilon \sim \mathcal{N}(0,1)}\left[\| \epsilon-\epsilon_\theta\left(z_t, t, \boldsymbol{c}_t, \boldsymbol{c}_{\mathrm{f}}\right)\right) \|_2^2\right] L=Ez0,t,ct,cf,ϵN(0,1)[ϵϵθ(zt,t,ct,cf))22]
训练过程中将50%的文本提示 c t c_t ct 随机替换为空字符串。这样有利于ControlNet网络从控制条件中识别语义内容。当Stable Diffusion没有prompt的时候,编码器能从输入的控制条件中获得更多的语义来代替prompt,类似于classifier-free guidance。

此外作者还针对不同情况提出两种改进的训练方式:

  • 小规模训练
    当计算资源或者训练数据受限时,作者发现断开部分ControlNet和SD的skip connection可以加速收敛,如上图所示,默认是ControlNet和SD的Middle Block以及Decoder Block的1,2,3,4连接,如果断开1,2,3,4连接,只和Middle Block连接可以加快收敛。当模型的结果和控制条件有关联时,再将断开的连接重新连上,从而得到更精准的控制
  • 大规模训练
    当计算资源充足,训练数据充足(至少一百万)时,首先进行ControlNet训练,大概5万步,然后解锁SD部分的模型,让两者进行联合训练,这会使得模型在特定任务上表现更好

此外作者发现训练过程会出现突然收敛的情况,如下图所示
在这里插入图片描述

4. 生成效果

ControlNet的控制条件很多,论文里列举了在Canny Edge,Hough Line,HED Boundary,User Sketching,Human Pose,Semantic Segmentation,Depth,Normal Maps,Cartoon Line Drawing等条件上的控制生成结果。

参数配置如下:

  • CFG-scale at 9.0
  • sampler is DDIM
  • sample 20 steps

同时使用了四种类型的prompt来分别控制:

  • No prompt:空字符串
  • Default prompt:a professional, detailed, high-quality image
  • Automatic prompt:通过BLIP生成的prompt
  • User prompt:用户自定义prompt

具体生成效果如下:

(1)Controlling Stable Diffusion with Canny edges(边缘图控制)
在这里插入图片描述
(2) Controlling Stable Diffusion with Hough lines (M-LSD) (直线图控制)
在这里插入图片描述
(3) Controlling Stable Diffusion with Human scribbles (手绘图控制)
在这里插入图片描述
(4)Controlling Stable Diffusion with HED boundary map
在这里插入图片描述
(5)Controlling Stable Diffusion with Openpose (人体姿态控制)
在这里插入图片描述
(6)Controlling Stable Diffusion with ADE20K segmentation map (分割图控制)
在这里插入图片描述
(7)通过卡通线稿图控制
在这里插入图片描述
(8)对于一些简单的物体,ControlNet会获得非常精准的控制
在这里插入图片描述


🤗关注公众号 funNLPer快乐起飞🤗

5. 参考

https://arxiv.org/abs/2302.05543

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

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

相关文章

git私房菜

文章目录 1、公司项目开发Git协作流程2、合并相关的操作3、Git常用命令总结 公司中如何使用Git协同开发的?本文将具体介绍开发模式,以及一些常用命令。 1、公司项目开发Git协作流程 公司一个完整的项目出来,项目的推进是在主分支master上进行…

Python钢筋混凝土结构计算.pdf-T001-混凝土强度设计值

以下是使用Python求解上述问题的完整代码: # 输入参数 f_ck 35 # 混凝土的特征抗压强度(单位:MPa) f_cd 25 # 混凝土的强度设计值(单位:MPa) # 求解安全系数 gamma_c f_ck / f_cd # …

EXCEL中点击单元格,所在行和列都改变颜色

在日常工作中,尤其是办公室工作人群,尝尝需要处理大量的数据,在对数据进行修改时,时长发生看错行的事情,导致数据越改越乱,因此,我常用的一种方法就是选中单元格时,所在行、列标记为…

python基础教程:re模块用法详解

前言 嗨喽,大家好呀~这里是爱看美女的茜茜呐 一、正则表达式的特殊字符介绍 正则表达式 👇 👇 👇 更多精彩机密、教程,尽在下方,赶紧点击了解吧~ 素材、视频教程、完整代码、插件安装教程我都准备好了&a…

家政保洁行业小程序如何快速搭建

随着互联网的快速发展,家政保洁行业也逐渐向数字化转型。小程序作为一种轻量级应用,越来越成为各行各业进行线上推广的重要工具。那么,如何快速搭建家政保洁行业的小程序呢?本文将为你提供详细的步骤和指导。 一、准备开发环境 在…

YOLOv5算法改进(10)— 替换主干网络之GhostNet

前言:Hello大家好,我是小哥谈。GhostNet是一种针对计算机视觉任务的深度神经网络架构,它于2020年由中国科学院大学的研究人员提出。GhostNet的设计目标是在保持高精度的同时,减少模型的计算和存储成本。GhostNet通过引入Ghost模块…

深入理解Python中的多进程和多线程

前言 此篇文章将深入的讲解Python中的多进程和多线程 📝个人主页→数据挖掘博主ZTLJQ的主页 个人推荐python学习系列: ☄️爬虫JS逆向系列专栏 - 爬虫逆向教学 ☄️python系列专栏 - 从零开始学python 第一部分:多进程 多进程是指在操作系统中…

ssm学生公寓管理系统的设计与实现

ssm学生公寓管理系统的设计与实现106 开发工具:idea 数据库mysql5.7 数据库链接工具:navcat,小海豚等 技术:ssm 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归…

mongodb 分片集群部署

文章目录 mongodb 分片部署二进制安装三台config 配置shard 分片安装shard1 安装shard2 安装shard3 安装mongos 安装数据库、集合启用分片创建集群认证文件创建集群用户部署常见问题 mongodb 分片部署 二进制安装 mkdir -p /data/mongodb tar xvf mongodb-linux-x86_64-rhel7…

算法 -汉诺塔,哈夫曼编码

有三个柱子,分别为 from、buffer、to。需要将 from 上的圆盘全部移动到 to 上,并且要保证小圆盘始终在大圆盘上。 这是一个经典的递归问题,分为三步求解: ① 将 n-1 个圆盘从 from -> buffer ② 将 1 个圆盘从 from -> to ③ 将 n-1 个圆盘从 buffer -> to 如果…

opencv android sdk 使用中的问题

Plugin with id ‘kotlin-android’ not found 在build.gradle(:app)中添加以下内容 buildscript {ext {Kotlin_Verion "1.9.10"}dependencies {classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$Kotlin_Verion"}repositories {mavenCentral()} …

论文浅尝 | 利用对抗攻击策略缓解预训练语言模型中的命名实体情感偏差问题...

笔记整理:田家琛,天津大学博士,研究方向为文本分类 链接:https://ojs.aaai.org/index.php/AAAI/article/view/26599 动机 近年来,随着预训练语言模型(PLMs)在情感分类领域的广泛应用&#xff0c…

数据结构--树4.2.2(二叉树--遍历)

目录 一、二叉树的建立 二、二叉树的遍历算法 一、二叉树的建立 CreateBitree(Bitree *t){char c;scanf("%c",&c);if( c){*t NULL;}else{*t(Bitnode*)malloc(sizeof(Bitnode));(*t)->data c;CreateBitree(&(*t)->lchild);CreateBitree(&(*t)-&…

打造个人的NAS云存储-通过Nextcloud搭建私有云盘实现公网远程访问

文章目录 摘要1. 环境搭建2. 测试局域网访问3. 内网穿透3.1 ubuntu本地安装cpolar3.2 创建隧道3.3 测试公网访问 4 配置固定http公网地址4.1 保留一个二级子域名4.1 配置固定二级子域名4.3 测试访问公网固定二级子域名 摘要 Nextcloud,它是ownCloud的一个分支,是一个文件共享服…

模拟电子技术基础学习笔记二 杂质半导体

通过扩散工艺,在本征半导体中掺入少量合适的杂质元素,可得到杂质半导体。 按掺入的杂质元素不同,可形成N型半导体和P型半导体 控制掺入杂质元素的浓度,可以控制杂质半导体的导电性能。 一、N型半导体(negative Semic…

ui网页设计实训心得

ui网页设计实训心得篇一 通过这次实训对这门课程的学习,做好网页,并不是一件容易的事,它包括网页的选题、 内容采集整理、 图片的处理、 页面的排版设置、 背景及其整套网页的色调等很多东西。 所以我得出一下总结: 一、 准备资…

CUBLAS库入门教程(从环境配置讲起)

文章目录 前言一、搭建环境二、简单介绍三、 具体例子四、疑问 前言 CUBLAS库是NVIDIA CUDA用于线性代数计算的库。使用CUBLAS库的原因是我不想去直接写核函数。 (当然,你还是得学习核函数该怎么写。但是人家写好的肯定比我自己写的更准确!&…

[PyTorch][chapter 54][Variational Auto-Encoder 实战]

前言: 这里主要实现: Variational Autoencoders (VAEs) 变分自动编码器 其训练效果如下 训练的过程中要注意调节forward 中的kle ,调参。 整个工程两个文件: vae.py main.py 目录: vae main 一 vae 文件名: vae…

typora使用

1.主题配置 先打开主题文件夹, 文件–>>偏好设置–>>外观–>>打开主题文件夹 1.1字体 修改字体需要修改css文件,确定当前所用主题,可以在typora菜单点击主题,看看当前勾选的是哪个主题,比如gith…

iPhone 15 Pro与iPhone 13 Pro:最大的预期升级

如果你在2021年首次发布iPhone 13 Pro时就抢到了它,那么你的合同很可能即将到期。虽然距离iPhone 15系列还有几周的时间,但你可能已经在想:是时候把你的旧iPhone升级为iPhone 15 Pro了吗? 我们认为iPhone 13 Pro是你现在能买到的最好的手机之一。但如果你想在2023年晚些时…