可控生成:ControlNet原理

news2024/11/17 19:21:38

论文: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.coloradmin.cn/o/957351.html

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

相关文章

【LeetCode】剑指 Offer Ⅱ 第5章:哈希表(6道题) -- Java Version

题库链接:https://leetcode.cn/problem-list/e8X3pBZi/ 类型题目解决方案哈希表的设计剑指 Offer II 030. 插入、删除和随机访问都是O(1) 的容器HashMap ArrayList ⭐剑指 Offer II 031. LRU 缓存HashMap 双向链表 ⭐哈希表的应用剑指 Offer II 032. 有效的变位…

pytorch中 nn.Conv2d的简单用法

torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride1, padding0, dilation1, groups1, biasTrue,padding_modezeros)参数介绍: in_channels:卷积层输入通道数 out_channels:卷积层输出通道数 kernel_size:卷积层的…

AZ900备考

文章目录 云服务的概念云服务模型云服务类型消费的模型云服务的好处可靠性和可预测性的优势云中的管理 Azure 体系结构和服务核心结构组件物理基础结构组件 Azure计算和网络服务Azure 存储服务身份认证AD身份认证 Azure 管理和治理成本管理治理合规性的功能和工具管理和部署Azu…

Java设计模式:四、行为型模式-05:备忘录模式

文章目录 一、定义:备忘录模式二、模拟场景:备忘录模式三、改善代码:备忘录模式3.1 工程结构3.2 备忘录模式模型结构图3.3 备忘录模式定义3.3.1 配置信息类3.3.2 备忘录类3.3.3 记录者类3.3.4 管理员类 3.4 单元测试 四、总结:备忘…

如何构建自己的技术博客

本文相关知识点: markdownVuepress/vitepressGitHub pages 托管服务 为什么建议搭建个人博客网站 拥有自己的技术博客,不仅可以提升自己的技术能力,还可以提升自己的影响力,未来也可能带来一些“睡后”收益。 对于我们职场新人…

QTday2(登录界面+跳转——小黄人篇)

1.完成登录框的按钮操作&#xff0c;并在登录成功后进行界面跳转 form.h&#xff1a; #ifndef FORM_H #define FORM_H#include <QWidget> #include <QPushButton> #include <QDebug> #include <QLineEdit> //行编辑器 #include <QLab…

W5500-EVB-PICO主动PING主机IP检测连通性(十)

前言 上一章我们用W5500_EVB_PICO 开发板做UDP组播数据回环测试&#xff0c;那么本章我们进行W5500_EVB_PICO Ping的测试。 什么是PING&#xff1f; Ping &#xff08;Packet Internet Groper&#xff09;是一种因特网包探索器&#xff0c;用于测试网络连接量的程序 。Ping是…

python读取图像小工具

一、和图像交互获得图像的坐标和像素值 import cv2 import numpy as np import signal import threading import timeif __name__ __main__:img cv2.imread(XXX,0)#读取图片font_face,font_scale,thicknesscv2.FONT_HERSHEY_SIMPLEX,0.5,1#鼠标交互def mouseHandler(event,x…

Android基础之Activity生命周期

Activity是Android四大组件之一、称为之首也恰如其分。 Activity直接翻译为中文叫活动。在Android系统中Activity就是我看到的一个完整的界面。 界面中看到的TextView(文字&#xff09;、Button(按钮)、ImageView&#xff08;图片&#xff09;都是需要Activity来承载的。 总…

linux免密登录最简单--图文详解

最简单的免密登录 1.A电脑生成秘钥 ssh-keygen -t rsa 2.A电脑将秘钥传给B电脑 ssh-copy-id root192.168.1.129 #将秘钥直接传给B电脑 需要输入B电脑的密码&#xff0c;可以看到成功。 3.测试 同理&#xff1a;如果B->A也需要免密登录&#xff0c;统一的操作。 大功告…

集成指挥平台定时任务故障流量分析

01故障现象 集成指挥平台中有定时任务定时传输数据到总队&#xff0c;总队定时下发数据到市交警支队。市交警支队发现定时任务一直出现执行失败的错误。市交警支队和总队联系&#xff0c;说需要市交警支队排查一下自身网络&#xff0c;前两天在应用服务器上面抓了定时任务的数…

大数据、AI和云原生:引领未来软件开发的技术演进

文章目录 **1. 数据驱动的创新&#xff1a;****2. 智能化应用的兴起&#xff1a;****3. 云原生的敏捷和可扩展性&#xff1a;****4. 实时性和即时性&#xff1a;****5. 数据隐私和安全&#xff1a;****6. 跨平台和跨设备&#xff1a;****7. 自动化和智能编程&#xff1a;****8.…

Stable Diffusion 多视图实践

此教程是基于秋叶的webui启动器 1.Stable Diffsuion 使用多视图需要准备一个多角度open pose 图 我给大家提供一个可使用的。 2.需要添加图片到到controlnet当中,不要选择预处理器,选择模型为openpose的模型,然后需要点选同步图片尺寸。 3.然后填写关键字可以参照一下这个…

IBM Spectrum LSF Explorer 为要求苛刻的分布式和任务关键型高性能技术计算环境提供强大的工作负载管理

IBM Spectrum LSF Explorer 适用于 IBM Spectrum LSF 集群的强大、轻量级报告解决方案 亮点 ● 允许不同的业务和技术用户使用单一解决方案快速创建和查看报表和仪表板 ● 利用可扩展的库提供预构建的报告 ● 自定义并生成性能、工作负载和资源使用情况的报…

设计模式-适配器

文章目录 一、简介二、适配器模式基础1. 适配器模式定义与分类2. 适配器模式的作用与优势3.UML图 三、适配器模式实现方式1. 类适配器模式2. 对象适配器模式3.类适配器模式和对象适配器模式对比 四、适配器模式应用场景1. 继承与接口的适配2. 跨平台适配 五、适配器模式与其他设…

无涯教程-Python机器学习 - Extra Trees函数

它是袋装决策树集成方法的另一种扩展。在这种方法中,从训练数据集的样本中构建随机树。 在以下Python食谱中,我们将通过在Pima Indians糖尿病数据集上使用sklearn的ExtraTreesClassifier类来构建额外的树集成模型。 首先,导入所需的软件包,如下所示: from pandas import rea…

Nginx详解 三:高级配置

文章目录 1. 网页的状态页2. Nginx第三方模块2.1 echo模块 3. 变量3.1 内置变量3.1.1 示例 3.2 自定义变量3.2.1 自定义访问日志3.2.2 自定义json 格式日志 3.4 Nginx压缩功能 4. HTTPS4.1 Nginx的HTTPS工作原理4.2 启用功能模块的配置过程 5、自定义图标 1. 网页的状态页 基于…

江苏移动基于OceanBase稳步创新推进核心数据库分布式升级

*本文首发自《中国电信业》 数字经济时代&#xff0c;数据库作为企业核心数据存储、处理、挖潜等方面的关键载体&#xff0c;重要性日益凸显。对于运营商而言&#xff0c;数据库具有行业用户数量多、访问数量多、业务复杂度高、数据安全性高、响应要求性高以及需要 7*24 小时服…

【组合计数 or 树DP】2021 icpc 上海 G

Problem - G - Codeforces 题意&#xff1a; Code&#xff1a; #include <bits/stdc.h>#define int long longusing namespace std;const int mxn1e610; const int mxv1e610; const int mod998244353;vector<int> G[mxn];int N,u,v; int ans1; int sz[mxn];void…

手把手教你写出第一个C语言程序

Hello, World! 1. 前言2. 准备知识2.1 环境2.2 文件的分类2.3 注释2.3.1 注释的作用2.3.2 注释的两种风格2.3.2.1 C语言的注释风格2.3.2.2 C的注释风格 2.3.3 VS中注释和取消注释的快捷键 3. 开始演示3.1 创建项目3.2 创建源文件3.3 写代码3.4 编译链接运行 4. 代码解释4.1 写主…