【论文阅读】ControlNet、文章作者 github 上的 discussions

文章目录

  • Introduction
  • Method
    • ControlNet
    • ControlNet for Text-to-Image Diffusion
    • Training
    • Inference
  • Experiments
    • 消融实验
    • 定量分析
  • 在作者 github 上的一些讨论
    • 消融实验更进一步的探索
    • Precomputed ControlNet 加快模型推理
    • 迁移控制能力到其他 SD1.X 模型上
    • 其他

Introduction

  1. 提出ControlNet,通过引入该结构微调预训练文生图扩散模型,可以给模型增加空间定位条件.
  2. Stable Diffusion上使用ControlNet微调,使模型能接受 Canny edges, Hough lines, user scribbles, human key points, segmentation maps, shape normals, depths, cartoon line drawings 图像作为输入条件.
  3. 消融实验、定量分析、对比 baseline.



Method

ControlNet

考虑一个预训练好的神经网络 F ( ⋅ ; Θ ) \mathcal{F}(·;\Theta) F(⋅;Θ)表示训练好的神经网络块,它的内部结构可以包括 resnet, conv-bn-relu, muti-head att, transfomer 等. 输入 x ∈ R h × w × c x\in\mathbb{R}^{h\times w\times c} xRh×w×c,将其转换到 y y y,也即

y = F ( x ; Θ ) \large y=\mathcal{F}(x;\Theta) y=F(x;Θ)

使用ControlNet微调神经网络 F ( ⋅ ; Θ ) \mathcal{F}(·;\Theta) F(⋅;Θ),首先复制 F ( ⋅ ; Θ ) \mathcal{F}(·;\Theta) F(⋅;Θ)的结构和参数,参数命名为 Θ c \Theta_{c} Θc,同时冻结 Θ \Theta Θ. 然后在复制结构的前和后分别引入zero convolution,也即核大小为 1 × 1 1\times1 1×1、初始参数为 0 0 0的卷积层,分别用 Z ( ⋅ ; Θ z 1 ) \mathcal{Z}(·;\Theta_{z1}) Z(⋅;Θz1) Z ( ⋅ ; Θ z 2 ) \mathcal{Z}(·;\Theta_{z2}) Z(⋅;Θz2)表示. 最后,将 c c c作为微调时的条件,将其整合到模型的前向计算中,具体表示为

y c = F ( x ; Θ ) + Z ( F ( x + Z ( c ; Θ z 1 ) ; Θ c ) ; Θ z 2 ) \large 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)

模型结构如下所示:
暂时无法在飞书文档外展示此内容

在训练的第一步中,zero convolution的参数都为 0 0 0,因此模型输出和未加入ControlNet的输出一样,这样做有助于在刚开始训练时保护微调结构的 backbone,使其免受随机噪声的污染.


ControlNet for Text-to-Image Diffusion

众所周知,Stable Diffusion训练时的网络有这么几个部分构成:

  • FrozenCLIPEmbedder是一个预训练的 text encoder,将 prompt 嵌入成条件向量,一般情况下参数冻结.
  • AutoencoderKL是一个预训练的 image encoder,将图像从像素空间转换到隐空间,降低扩散过程中图像向量的尺寸,一般情况下参数冻结.
  • UNet,主要需要训练的部分,模拟隐空间上图像在数据分布和高斯分布之间转换的过程. 结构上主要包含:
    • 若干 encoder 块,主要由 resnet, transformer, avg_pool 组成,用于逐层提取特征.
      • resnet 块融合图像隐向量和扩散时间步的嵌入向量
      • transformer 块融合图像隐向量和 prompt 条件向量
    • 一个 middle 块,由 resnet 和 transformer 组成
    • 若干 decoder 块,主要由 resnet, transformer, interpolate 组成,用于融合深层特征和浅层特征.

ControlNet应用于Stable Diffusion做微调,也即应用于其中UNet的 decoder 部分,使这部分网络能进一步融合作为条件的图像。用 t t t表示时间步, c t c_t ct表示 prompt 条件, c f c_f cf表示条件图像在隐空间上的表示,修改后的UNet结构为

在这里插入图片描述


Training

z 0 z_0 z0表示原始图像的隐向量,经过时间步 t t t后加噪的图像表示为 z t z_t zt,应用了ControlNet的UNet表示为 ϵ θ \epsilon_{\theta} ϵθ,训练时的损失函数可以表示为

L = E z 0 , t , c t , c f , ϵ ∈ N ( 0 , I ) [ ∣ ∣ ϵ − ϵ θ ( z t , t , c t , c f ) ∣ ∣ 2 2 ] \large \mathcal{L}=\mathbb{E}_{ z_0,t,c_t,c_f,\epsilon\in\mathcal{N}(0,I)}\left[||\epsilon-\epsilon_{\theta}(z_t,t,c_t,c_f)||_2^2\right] L=Ez0,t,ct,cf,ϵN(0,I)[∣∣ϵϵθ(zt,t,ct,cf)22]

在实际训练过程中,作者随机将 50 % 50\% 50%的 prompt 置为空字符串,这种做法能使ControlNet学习到图像条件的语义信息. 由于zero convolution不会引入额外的噪声,因此在训练过程中整个Stable Diffusion模型仍然能生成高质量的图片. 基于这一特性,作者观察到,微调时模型并非逐渐学习到图像条件,而是在训练步数低于 10 K 10\mathrm{K} 10K时的某一步开始突然遵从图像条件. 作者称这其为 “sudden convergence phenomenon”
[图片]



Inference

Stable Diffusion使用CFG控制条件强弱,令 ϵ u c \epsilon_{uc} ϵuc表示无 prompt 条件的模型输出, ϵ c \epsilon_{c} ϵc表示有 prompt 条件的模型输出,超参数 β c f g \beta_{cfg} βcfg表示 prompt 条件的强弱,模型最终的输出 ϵ p r d \epsilon_{prd} ϵprd可以表示为

ϵ p r d = ϵ u c + β c f g ( ϵ c − ϵ u c ) \large \epsilon_{\mathrm{prd}}=\epsilon_{\mathrm{uc}}+\beta_{\mathrm{cfg}}(\epsilon_{\mathrm{c}}-\epsilon_{\mathrm{uc}}) ϵprd=ϵuc+βcfg(ϵcϵuc)

在没有 prompt 条件的极端情况下,如果抽取完深层特征的图像条件同时加到 ϵ u c \epsilon_{uc} ϵuc ϵ c \epsilon_{c} ϵc上,这会使CFG完全失去控制条件强弱的作用;如果只加到 ϵ c \epsilon_{c} ϵc上,又会使控制条件对输出图像的影响过大. 因此,作者提出一种叫做Classifier-free guidance resolution weighting(CFG-RW)的方法. 具体做法,把图像条件加到 ϵ c \epsilon_{c} ϵc上,在ControlNet每一层输出加回UNet前乘系数 w i w_i wi( = 64 / h i =64/h_i =64/hi h i h_i hi为第 i i i个 decoder 块的尺寸). 下图分别展示了该讨论各种情况下的输出图像:
[图片]

有了上述方法之后,结合不同类别的图像条件,也只需要对应相加即可.


Experiments

消融实验

探索ControlNet其他可能结构

  • zero convolution换成随机初始化的卷积层
  • 只使用一个卷积层作为ControlNet
    [图片]



定量分析

作者使用 ADE20K 作为测试集,在 OneFormer 上做语义分割,对比不同方法重构图像和原图像的 IoU .
[图片]

之后,作者评估了不同模型的 FID、CLIP score、CLIP aesthetic score.

[图片]

下图展示了不同模型实际生成的图片
[图片]




在作者 github 上的一些讨论

消融实验更进一步的探索

discussion 链接
ControlNet简化为ControlNet-liteControlNet-mlp两种模型:
[图片]

作者从根据一张房子的图片做了简单地涂鸦风格处理,作为控制条件

在精心设计 prompt 的情况下,发现原版模型和改后的两种模型输出的图像效果都不错.

Professional high-quality wide-angle digital art of a house designed by frank lloyd wright. A delightful winter scene. photorealistic, epic fantasy, dramatic lighting, cinematic, extremely high detail, cinematic lighting, trending on artstation, cgsociety, realistic rendering of Unreal Engine 5, 8k, 4k, HQ, wallpaper

(分别为`ControlNet`、`ControlNet-lite`、`ControlNet-mlp`的输出)

但是当 prompt 为空时,两种改版都很拉胯.

(分别为`ControlNet`、`ControlNet-lite`、`ControlNet-mlp`的输出)

一方面,这样的对比说明更深的 encoder 结构确实拥有更强的识别能力,所以如果你的目标是训练稳健的ControlNet投入到生产环境,这样的识别能力是很重要的. 反之,如果用来做解决特定问题的研究或者训练集足够简单,那可以考虑轻量化的方案.
另一方面,这也解释了ControlNet接受 prompt 条件和时间步输入是重要的,因为这么做可以让使用者仍然能靠 prompt 条件调整模型的输出.



Precomputed ControlNet 加快模型推理

discussion 链接
主要 idea 如下图所示:
[图片]

这样做可以提前计算好ControlNet中每个块的输出,在推理时直接加到原模型的UNet上.
作者观察到这样训练的模型生成的图像更假,并且更不稳健,以失败告终.
评论中有人提到可以尝试使用 NAS (neural architecture search) 探索更好的模型结构,以降低 GPU 消耗.



迁移控制能力到其他 SD1.X 模型上

discussion 链接
作者尝试将在 Stable Diffusion 1.5上训练的ControlNet迁移到AnythingV3上,作者给出的方法是:

AnythingV3_control_openpose = AnythingV3 + SD15_control_openpose – SD15

限制有两点:

  • text encoder 不同会导致意外结果
  • 在例如 human pose 的应用中,输入最好不是二刺螈人物图片,因为检测姿势用的 OpenPose 不擅长处理二刺螈人物.

这种方法已经过时了. 目前在实际应用中,直接把ControlNet插到其他 SD1.X 模型上就行.



其他

  • Riffusion + ControlNet 音乐修复
  • 将原图转换成像素风格
  • 人物换衣
  • 调色

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

贪心算法 ——硬币兑换、区间调度、

硬币兑换: from book:挑战程序设计竞赛 思路:优先使用大面额兑换即可 package mainimport "fmt"func main() {results : []int{}//记录每一种数额的张数A : 620B : A//备份cnts : 0 //记录至少需要多少张nums : []int{1, 5, 10, 5…

idea中使用git提交代码报 Nothing To commit No changes detected

问题描述 在idea中右键,开始将变更的代码进行提交的时候,【Commit Directory】点击提交的时候 报 Nothing To commit No changes detected解决方案 在这里点击Test 看看是不是能下面显示git版本,不行的话 会显示一个 fix的字样,行…

专业130+总分380+哈尔滨工程大学810信号与系统考研经验水声电子信息与通信

今年专业课810信号与系统130,总分380顺利考上哈尔滨工程大学,一年的努力终于换来最后的录取,期中复习有得有失,以下总结一下自己的复习经历,希望对大家有帮助,天道酬勤,加油!专业课&…

SSE[Server-Sent Events]实现页面流式数据输出(模拟ChatGPT流式输出)

文章目录 前言SSE 简介应用场景区分浏览器支撑性 实现过程Web VUE核心解析数据代码实例demo参考 前言 服务端向客户端推送消息,除了用WebSocket可实现,还有一种服务器发送事件(Server-Sent Events)简称 SSE,这是一种服务器端到客户端(浏览器)…

C++大学教程(第九版)5.25去除break语句 5.27去除cintinue语句

5.25题目 (去除break和continue)break和continue 语句遭到质疑的原因是它们的非结构化性。实际上,break和continue 语句总能用结构化的语句取代。请详述如何从程序的一条循环语中去除break语句,并用某种结构化的手段替代。提示:break 语句用于在循环体内离开一个循…

Addressables(1) 从安装到加载单个/多个资源

不想再配改那些狗屎路径,准备研究一下Adressable,据说可以用key加载指定的资源 刚安装下来,随便搞了个资源勾选了一下addressable的框框,多了好多东西啊 概念铺天盖地而来,ok 没事的 慢慢来! 前置知识 P…

pytorch GPU版本安装 python windows

annanconda环境 创建虚拟环境 pytorch19_gpu create -n pytorch19_gpu python3.9 激活环境 conda activate pytorch19_gpu 查找CUDA版本是12.0,查找方式,win r输入cmd进入命令行模式,输入nvidia-smi,如下, 查找如…

Bit.Store 加密卡集成主流 BRC20 ,助力 BTC 生态 Token 的流动性与消费

“Bit.Store 首创性的将包括 ORDI、SATS、以及 RATS 在内的主流 BRC20 资产集成到其加密卡支付中,通过以其推出的加密银行卡为媒介,助力 BTC 生态 Token 的流动性与消费。” 比特币网络在被设计之初,就是以一种去中心化、点对点的现金系统为定…

【Qt】对象树与坐标系

需要云服务器等云产品来学习Linux的同学可以移步/-->腾讯云<--/-->阿里云<--/-->华为云<--/官网&#xff0c;轻量型云服务器低至112元/年&#xff0c;新用户首次下单享超低折扣。 目录 一、Qt Creator快捷键 二、对象树 1、对象树的析构 2、自定义类的编写…

代码随想录刷题题Day37

刷题的第三十七天&#xff0c;希望自己能够不断坚持下去&#xff0c;迎来蜕变。&#x1f600;&#x1f600;&#x1f600; 刷题语言&#xff1a;C Day37 任务 ● 309.最佳买卖股票时机含冷冻期 ● 714.买卖股票的最佳时机含手续费 ●总结 1 最佳买卖股票时机含冷冻期 309.最佳…

C 语言->编译和链接实现原理

✅作者简介&#xff1a;大家好&#xff0c;我是橘橙黄又青&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;橘橙黄又青-CSDN博客 今天学习&#xff1a;浅学编译和链接内部实现原理 前提&#xff1a;本文是在gcc编译环…

C++总结笔记

1. 简介 1、面向对象程序设计 面向对象的四大特性 1&#xff09;封装 2&#xff09;继承 3&#xff09;多态 4&#xff09;抽象 2、标准库 标准C由三个部分组成 1&#xff09;核心语言&#xff1a;提供了所有的构件块 2&#xff09;C标准库&#xff1a;提供了大量的函…

chrony介绍和安装

chrony介绍和安装 1.chrony&#xff08;时间同步服务&#xff09; 1.1 chrony介绍 Chrony 是一个用于时间同步的软件&#xff0c;它旨在提供高精度的系统时钟同步。Chrony 软件包括一个 NTP&#xff08;Network Time Protocol&#xff0c;网络时间协议&#xff09;服务器和客…

【Linux第二课-权限】操作系统、Linux用户、Linux权限、Linux文件类型、粘滞位

目录 操作系统shell外壳为什么有shell外壳shell外壳是什么shell外壳工作原理 Linux用户root用户与非root用户root用户与普通用户的切换普通用户 --> root用户root用户 --> 普通用户普通用户 --> 普通用户对一条指令提升为root权限进行执行 Linux权限Linux中的权限角色…

【Linux】Linux系统的生态

Linux中安装软件 Linux中安装软件一般有三种方式&#xff1a; 源代码安装rpm包安装yum安装 1.源代码安装 有些软件本来就是开源的&#xff0c;如果不想用别人直接发布好的软件&#xff0c;我们就可以把源代码下载下来&#xff0c;在我们的环境中编译&#xff0c;自己安装 …

(初研) Sentence-embedding fine-tune notebook

由于工作需要&#xff0c;需要对embedding模型进行微调&#xff0c;我调用了几种方案&#xff0c;都比较繁琐。先记录一个相对简单的方案。以下内容并不一定正确&#xff0c;请刷到的大佬给予指正&#xff0c;不胜感激&#xff01;&#xff01;&#xff01; 一.对BGE模型&…

Visual Studio 下载安装教程,附安装包和工具,Visual Studio 2022,Visual Studio所有版本都有

前言 Visual Studio是微软推出的一款C编译器&#xff0c;将“高级语言"翻译为"机器语言&#xff08;低级语言)"的程序&#xff0c;VS是一个非常完整的开发工具集&#xff0c;包括了所有软件生命周期中所需的大部分工具&#xff0c;如UML工具、代码管控工具、集…

Kafka 的 Consumer Group 解读

作为一份笔记&#xff0c;本文再次梳理一下 Kafka 的 Consumer Group。我们知道&#xff0c;一个 Topic 往往会有多个 Partition&#xff0c;一条消息只会被写到一个 Kafka 的 Partition 中&#xff0c;那 Consumer 是怎么消费 Message 的呢&#xff1f; Consumer Group 又从中…

零基础学Python(3)— 注释、代码缩进和编码规范

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。在使用Python语言进行编程的时候&#xff0c;需要遵循一定的规范标准。本节课就带大家了解下Python语言在注释、缩进和编码方面的规范!~&#x1f308; 目录 &#x1f680;1.注释 &#x1f680;2.代码缩进 &#x1f68…

vue.js安装

1:下载 Node.js 官网&#xff1a;https://nodejs.org/en/download 2:安装 node -v npm -v 3:配置 npm config set prefix "F:\node\node_global" npm config set cache "F:\node\node_cache" 按 win 键并输入“编辑系统环境变量”调出系统属性界面&a…