【论文阅读】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 音乐修复
  • 将原图转换成像素风格
  • 人物换衣
  • 调色

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

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

相关文章

烟火检测/区域人流统计/AI智能分析网关V4如何配置通道?

TSINGSEE青犀智能分析网关(V4版)是一款高性能、低功耗的软硬一体AI边缘计算硬件设备,硬件内部署了近40种AI算法模型,支持对接入的视频图像进行人、车、物、行为等实时检测分析,并上报识别结果,并能进行语音…

【征服redis2】redis的事务介绍

目录 目录 1.redis事务介绍 2 事务出错的处理 3.Java如何使用redis事务 1.redis事务介绍 在前面我们介绍了redis的几种典型数据结构和应用,本文我们来看一下redis的事务问题。事务也是数据库的重要主题,熟悉关系型数据库的读者应该对事务比较了解&a…

erlang (OS 操作模块)学习笔记

cmd: env: 返回所有环境变量的列表。 每个环境变量都表示为元组 {VarName,Value},其中 VarName 是 变量和 Value 其值。 例: {VarName,Value} {"ERLANG_HOME","C:\\Program Files\\erl-24.3.4.2\\bin\\erl-24.3.4.2"}…

2023我的总结:读书、写作、运动、爱家人、学一门手艺

不知不觉中,2024年1月已过去大半了,按照惯例,还是对过去一年的所思所行做个简单的汇报。也希望我的一些经历,能给到正在做年终总结或新年规划的朋友,一些参考。 01 读书,是门槛最低的高贵 最近一段时间&am…

gh0st远程控制——客户端界面编写(二)

● 补充小知识:枚举类型的使用 每个控件(比如列表)都对应一个自己的唯一的变量 使用枚举类型可以将变量名与编号进行绑定,以后程序需要扩展的时候,只需要在定义枚举变量的位置重新修改编号就可以了,这样全…

Linux shell编程学习笔记40:stat命令

程序员必备的面试技巧 “程序员必备的面试技巧,就像是编写一段完美的代码一样重要。在面试战场上,我们需要像忍者一样灵活,像侦探一样聪明,还要像无敌铁金刚一样坚定。只有掌握了这些技巧,我们才能在面试的舞台上闪耀…

htb monitored root方式其中的一种(仅作记录)

快下班时候审出来的,目前root的第5种方式 nagiosmonitored:~$ cat /usr/local/nagiosxi/scripts/backup_xi.sh #!/bin/bash # # Creates a Full Backup of Nagios XI # Copyright (c) 2011-2020 Nagios Enterprises, LLC. All rights reserved. #BASEDIR$(dirname …

SCI 2区论文:医疗保健中心训练有素的脑膜瘤分割模型的性能测试-基于四个回顾性多中心数据集的二次分析

基本信息 标题:Performance Test of a Well-Trained Model for Meningioma Segmentation in Health Care Centers: Secondary Analysis Based on Four Retrospective Multicenter Data Sets中文标题:医疗保健中心训练有素的脑膜瘤分割模型的性能测试&am…

PE解释器之PE文件结构(二)

接下来的内容是对IMAGE_OPTIONAL_HEADER32中的最后一个成员DataDirectory,虽然他只是一个结构体数组,每个结构体的大小也不过是个字节,但是它却是PE文件中最重要的成员。PE装载器通过查看它才能准确的找到某个函数或某个资源。 一&#xff1…

软件测试|sqlalchemy一对一关系详解

简介 SQLAlchemy 是一个强大的 Python ORM(对象关系映射)库,它允许我们将数据库表映射到 Python 对象,并提供了丰富的关系模型来处理不同类型的关系,包括一对一关系。在本文中,我们将深入探讨 SQLAlchemy …

Ubuntu使用QtCreator + CMake 开发C/C++程序

平台 OS: Ubuntu 20.04 cmake: 3.16.3 IDE: Qt Creator 4.11.1 Based on Qt 5.14.1 (GCC 5.3.1 20160406 (Red Hat 5.3.1-6), 64 bit) Built on Feb 5 2020 12:48:30 From revision b2ddeacfb5 Copyright 2008-2019 The Qt Company Ltd. All rights reserved. The program …

Hugging Face怎么通过国内镜像去进行模型下载(hf-mirror.com)

一、引言 Hugging Face 🤗是一家专注于自然语言处理(NLP)技术的公司,以其开源贡献和先进的机器学习模型而闻名。该公司最著名的产品是 Transformers 库,这是一个广泛使用的 Python 库,它提供了大量预训练模…

(Bean实例化的基本流程 )学习Spring的第六天

Bean实例化的基本流程 其实可以解释为三个过程: 1 . 有关Bean的信息被封装成一个map集合 : DeanDefinitionMap . key为Bean的名称 , value为有关<bena>标签的信息 2 . Spring框架对这个存储Bean信息的Map进行遍历 , 进行创建对象 , 把创建好的对象存储到另一个Map集合里…

深入理解 Kubernetes Ingress:路由流量、负载均衡和安全性配置

Kubernetes Ingress 是 Kubernetes 集群中外部流量管理的重要组件。它为用户提供了一种直观而强大的方式&#xff0c;通过定义规则和配置&#xff0c;来控制外部流量的路由和访问。 1. 什么是 Ingress&#xff1f; 在 Kubernetes 中&#xff0c;Ingress 是一种 API 资源&#…

取代房子,中国又一种资本在崛起(深度)

我一直有一个观点&#xff1a;经济形势好的时候&#xff0c;只要不是夕阳行业&#xff0c;做什么都能过得不错。经济形势差的时候&#xff0c;对于个人来说&#xff0c;拼的就是学习能力。 10年前&#xff0c;在市场上很吃香的是MBA&#xff0c;那时候企业需要高速发展&#x…

JVM工作原理与实战(二十):直接内存

专栏导航 JVM工作原理与实战 RabbitMQ入门指南 从零开始了解大数据 目录 专栏导航 前言 一、直接内存 1.直接内存作用 二、在直接内存上创建数据 总结 前言 JVM作为Java程序的运行环境&#xff0c;其负责解释和执行字节码&#xff0c;管理内存&#xff0c;确保安全&…

Spring Cloud详细入门使用

文章目录 Spring Cloud服务注册与发现EurekaServer 启动服务注册服务发现 NacosServer启动 (nacos2.2.0)服务注册服务发现服务集群命名空间配置中心集群搭建 负载均衡RPC远程过程调用Feign使用 网关路由断言工厂网关过滤工厂跨域处理全局跨域配置单个微服务跨域配置 限流 熔断 …

Codeforces Round 919 (Div. 2) A~E

A. Satisfying Constraints(模拟) 题意&#xff1a; 给出 n n n个限制条件&#xff0c;问有多少个数字 k k k同时满足这些限制条件。 限制条件分为以下三种&#xff1a; k k k必须大于等于给出的一些数字 x x x k k k必须小于等于给出的一些数字 x x x k k k不能与给出的…

定时器开发基础

1定时器的基本概述 通过滴漏和漏沙瓶这两个例子简单讲述定时器的基本工作原理。 STM32的常见的定时器资源&#xff1a; 系统嘀嗒定时器SysTick、看门狗定时器WatchDog、实时时钟RTC、基本定时器、通用定时器、高级定时器。 系统嘀嗒定时器SysTick &#xff1a;这是一个集成在C…