外网服装设计网站,深圳成豪设计,上海做公司网站,宁波seo推广联系方法ControlNet从原理到实战 ControlNet原理ControlNet应用于大型预训练扩散模型ControlNet训练过程ControlNet示例1 ControlNet与Canny Edge2. ControlNet与Depth3. ControlNet与M-LSD Lines4. ControlNet与HED Boundary ControlNet实战Canny Edge实战Open Pose 小结参考资料 Cont… ControlNet从原理到实战 ControlNet原理ControlNet应用于大型预训练扩散模型ControlNet训练过程ControlNet示例1 ControlNet与Canny Edge2. ControlNet与Depth3. ControlNet与M-LSD Lines4. ControlNet与HED Boundary ControlNet实战Canny Edge实战Open Pose 小结参考资料 ControlNet是一种通过添加额外条件来控制扩散模型的神经网络结构。它提供了一种增强稳定扩散的方法在文本到图像生成过程中使用条件输入如涂鸦、边缘映射、分割映射、pose关键点等。可以让生成的图像将更接近输入图像这比传统的图像到图像生成方法有了很大的改进。 论文地址https://arxiv.org/pdf/2302.05543.pdf 代码地址https://github.com/lllyasviel/ControlNet WebUI extention for ControlNet: https://github.com/Mikubill/sd-webui-controlnet
论文核心本文介绍了 ControlNet这是一种端到端的神经网络架构用于学习大型预训练文本到图像扩散模型在我们的实现中为 Stable Diffusion的条件控制。 **ControlNet 通过锁定大型预训练模型的参数并复制其编码层保留了该大型模型的质量和能力。这种架构将大型预训练模型视为学习各种条件控制的强大主干网络。**可训练的副本和原始锁定的模型通过零卷积层连接权重初始化为零以便在训练过程中逐渐增长。这种架构确保在训练开始时不会向大型扩散模型的深层特征添加有害噪声并保护可训练副本中的大型预训练主干网络免受此类噪声的破坏。
关键点 1提出了ControlNet这是一种神经网络架构可以通过有效的微调将空间局部化的输入条件添加到预训练的文本到图像扩散模型中。 2展示了预训练的ControlNets以控制Stable Diffusion其条件包括Canny边缘、霍夫线、用户涂鸦、人体关键点、分割图、形状法线、深度以及卡通线条绘图 3通过与几种替代架构进行比较的消融实验来验证该方法的有效性。
ControlNet原理
ControlNet的基本结构如下所示 从图中可以看出ControlNet的基本结构由一个对应的原先网络的神经网络模块和两个“零卷积”层组成。在之后的训练过程中会“锁死”原先网络的权重只更新ControlNet基本结构中的网络“副本”和零卷积层的权重。这些可训练的网络“副本”将学会如何让模型按照新的控制条件来生成结果而被“锁死”的网络则会保留原先网络已经学会的所有知识。这样即使用来训练ControlNet的训练集规模较小被“锁死”网络原本的权重也能确保扩散模型本身的生成效果不受影响。
ControlNet基本结构中的零卷积层是一些权重和偏置都被初始化为0的1×1卷积层。训练刚开始的时候无论新添加的控制条件是什么这些零卷积层都只输出0因此ControlNet不会对扩散模型的生成结果造成任何影响。但随着训练过程的深入ControlNet将学会逐渐调整扩散模型原先的生成过程使得生成的图像逐渐向新添加的控制条件靠近。
问题1如果一个卷积层的所有参数都为0输出结果也为0那么它怎么才能正常进行权重的迭代呢 假设有一个简单的神经网络层 y w x b ywxb ywxb已知 ∂ y ∂ w x , ∂ y ∂ x w , ∂ y ∂ b 1 \frac{\partial y}{\partial w}x,\frac{\partial y}{\partial x}w,\frac{\partial y}{\partial b}1 ∂w∂yx,∂x∂yw,∂b∂y1假设权重 w w w为0输入x不为0则有 ∂ y ∂ w ≠ 0 , ∂ y ∂ x 0 , ∂ y ∂ b ≠ 0 \frac{\partial y}{\partial w}\ne 0,\frac{\partial y}{\partial x}0,\frac{\partial y}{\partial b}\ne 0 ∂w∂y0,∂x∂y0,∂b∂y0这意味着只要输入x不为0梯度下降的迭代过程就能正常地更新权重 w w w使 w w w不再为0于是得到 ∂ y ∂ x ≠ 0 \frac{\partial y}{\partial x}\ne 0 ∂x∂y0即在经过若干迭代之后这些零卷积层将逐渐变成具有正常权重的普通卷积层。
ControlNet应用于大型预训练扩散模型
以Stable Diffusion为例介绍如何将ControlNet应用于大型预训练扩散模型以实现条件控制。Stable Diffusion本质上是一个U-Net包含编码器、中间块和跳连接解码器。编码器和解码器都包含12个块而整个模型包含25个块包括中间块。在这25个块中8个块是下采样或上采样卷积层而其他17个块是主块每个主块包含4个ResNet层和2个Vision Transformer(ViT)。每个ViT包含几个交叉注意力和自注意力机制。如下图所示 “SD Encoder Block A”包含4个ResNet层和2个ViT而“×3”表示该块重复三次。文本提示使用CLIP文本编码器进行编码扩散时间步使用带有位置编码的时间编码器进行编码。
将ControlNet结构应用于U-Net的每个编码器级别图3b。具体而言使用ControlNet创建Stable Diffusion的12个编码块和1个中间块的训练副本。12个编码块分布在4个分辨率64×64 32×3216×168×8中每个分辨率复制3次。输出被添加到U-Net的12个跳连接和1个中间块中。由于Stable Diffusion是典型的U-Net结构这种ControlNet架构可能适用于其他模型。
这种连接ControlNet的方式在计算上是高效的——由于锁定副本的参数被冻结在微调过程中原始锁定编码器不需要进行梯度计算。这种方法加快了训练速度并节省GPU内存。
ControlNet实际上使用训练完成的Stable Diffusion模型的编码器模块作为自己的主干网络而这样一个稳定又强大的主干网络则保证了ControlNet能够学习到更多不同的控制图像生成的方法。
ControlNet训练过程
给定一个输入图像 z 0 z_0 z0图像扩散算法会逐步向图像添加噪声并生成一个噪声图像 z t z_t zt其中 t t t表示添加噪声的次数。给定一组条件包括时间步 t t t、文本提示 c t c_t ct以及特定于任务的条件 c f c_f cf图像扩散算法会学习一个网络 ϵ θ \epsilon _\theta ϵθ来预测添加到噪声图像 z t z_t zt上的噪声公式如下 L E z 0 , t , c t , c f , ϵ ∼ N ( 0 , 1 ) [ ∣ ∣ ϵ − ϵ θ ( z t , t , c t , c f ) ∣ ∣ 2 2 ] \mathcal{L}\mathbb{E}_{z_0,t,c_t,c_f,\epsilon \sim \mathcal{N}(0,1)}[||\epsilon -\epsilon _{\theta}(z_t,t,c_t,c_f)||_2^2] LEz0,t,ct,cf,ϵ∼N(0,1)[∣∣ϵ−ϵθ(zt,t,ct,cf)∣∣22] 其中 L \mathcal{L} L是整个扩散模型的总体学习目标。该学习目标直接用于利用 ControlNet 对扩散模型进行微调。
训练一个附加到某个Stable Diffusion模型上的ControlNet的过程大致如下 1收集想要对其附加控制条件的数据集和对应的Prompt。假如想训练一个通过人体关键点来对扩散模型生成的人体进行姿态控制的ControlNet则首先需要收集一批人物图片并标注好这批人物图片的Prompt以及对应的人体关键点的位置。 2将Prompt输入被“锁死”的Stable Diffusion模型并将标注好的图像控制条件如人体关键点的标注结果输入ControlNet然后按照稳定扩散模型的训练过程迭代ControlNet block的权重。 3在训练过程中随机地将50%的文本提示语替换为空白字符串这样做旨在“强制”网络从图像控制条件中学习更多的语义信息。 4训练结束后便可以使用ControlNet对应的图像控制条件如输入的人体关键点来控制扩散模型生成符合条件的图像。
在训练过程中随机用空字符串替换50%的文本提示 c t c_t ct。这种方法提高了ControlNet直接从输入条件图像中识别语义例如边缘、姿态、深度等的能力作为提示的替代。在训练过程中由于零卷积不会给网络添加噪声模型应该始终能够预测高质量的图像。我们观察到模型并没有逐渐学习控制条件而是在优化步骤少于10K时突然成功地遵循输入条件图像。如下图所示称这种现象为“突然收敛现象”。 图4突然收敛现象。 由于零卷积ControlNet 在整个训练过程中始终预测高质量的图像。 在训练过程中的某个步骤例如以粗体标记的 6133 个步骤模型突然学会遵循输入条件。
ControlNet示例
本小节将介绍一些已经训练好的ControlNet示例都来自Huggingface。
1 ControlNet与Canny Edge
Canny Edege是一种多阶段的边缘检测算法该算法可以从不同的视觉对象中提取有用的结构信息从而显著降低图像处理过程中的数据处理量ControlNet与Canny Edge结合使用的效果如下图所示
2. ControlNet与Depth
ControlNet 深度预处理器是用于处理图像中的深度信息的工具。它可以用于计算图像中物体的距离、深度图等。Depth map是跟原图大小一样的存储了深度信息的灰色尺度 gray scale 图像白色表示图像距离更近黑色表示距离更远。 MiDaS深度信息估算 MiDaS 深度信息估算是用来控制空间距离的类似生成一张深度图。一般用在较大纵深的风景可以更好表示纵深的远近关系。 LeReS深度信息估算 LeReS 深度信息估算比 MiDaS 深度信息估算方法的成像焦点在中间景深层这样的好处是能有更远的景深其中距离物品边缘成像会更清晰但近景图像的边缘会比较模糊具体实战中需用哪个估算方法可根据需要灵活选择。
示例通过提取原始图像中的深度信息可以生成具有同样深度结构的图。
3. ControlNet与M-LSD Lines
M-LSD Lines是另一种轻量化的边缘检测算法擅长提取图像中的直线线条。训练在M-LSD Lines上的ControlNet适合室内环境方面的图片。ControlNet与M-LSD Lines结合使用的效果如下图所示
4. ControlNet与HED Boundary
HED Boundary可以保持输入图像更多信息训练在HED Boundary上的ControlNet适合用来重新上色和进行风格重构。ControlNet与HED Boundary结合使用的效果如下图所示 除了以上这些ControlNet还可以
训练在涂鸦画上的ControlNet能让Stable Diffusion模型学会如何将儿童涂鸦转绘成高质量的图片。训练在人体关键点上的ControlNet能让扩散模型学会生成指定姿态的人体。语义分割模型旨在提取图像中各个区域的语义信息常用来对图像中的人体、物体、背景区域等进行划分。训练在语义分割数据上的ControlNet能让稳定扩散模型生成特定结构的场景图。诸如深度图、Normal Map、人脸关键点等同样可以使用ControlNet。
ControlNet实战
ControlNet 模型可以在使用小数据集进行训练。然后整合任何预训练的稳定扩散模型来增强模型来达到微调的目的。ControNet 的初始版本带有以下预训练权重。
Canny edge — 黑色背景上带有白色边缘的单色图像。Depth/Shallow areas — 灰度图像黑色代表深区域白色代表浅区域。Normal map — 法线贴图图像。Semantic segmentation map——ADE20K 的分割图像。HED edge — 黑色背景上带有白色软边缘的单色图像。Scribbles — 黑色背景上带有白色轮廓的手绘单色涂鸦图像。OpenPose 姿势关键点— OpenPose 骨骼图像。M-LSD — 仅由黑色背景上的白色直线组成的单色图像。
Canny Edge实战
安装需要的库
!pip install -q diffusers transformers xformers githttps://github.com/huggingface/accelerate.git为了对应选择的ControlNet还需要安装两个依赖库来对图像进行处理以提取不同的图像控制条件
!pip install -q opencv-contrib-python
!pip install -q controlnet_aux图像示例
from diffusers import StableDiffusionControlNetPipeline
from diffusers.utils import load_imageimage load_image(https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/input_image_vermeer.png)
image首先使用这张图片发送给Canny Edge边缘提取器预处理一下
import cv2
from PIL import Image
import numpy as npimage np.array(image)low_threshold 100
high_threshold 200# 提取图片边缘线条
image cv2.Canny(image, low_threshold, high_threshold)
image image[:, :, None]
image np.concatenate([image, image, image], axis2)
canny_image Image.fromarray(image)
canny_image接下来载入runwaylml/stable-diffusion-v1-5模型以及能够处理Canny Edge的ControlNet模型。同时为了节约计算资源以及加快推理速度决定使用半精度torch.dtype的方式来读取模型
# 使用半精度节约计算资源加快推理速度
from diffusers import StableDiffusionControlNetPipeline, ControlNetModel
import torchdevice cuda if torch.cuda.is_available() else cpu
print(device)
controlnet ControlNetModel.from_pretrained(lllyasviel/sd-controlnet-canny, torch_dtypetorch.float32).to(device)
pipe StableDiffusionControlNetPipeline.from_pretrained(runwayml/stable-diffusion-v1-5, controlnetcontrolnet, torch_dtypetorch.float32).to(device)然后使用当前速度最快的扩散模型调度器——UniPCMultistepScheduler。该调度器能显著提高模型的推理速度。
# 使用速度最快的扩散模型调度器UniPCMultistepScheduler
from diffusers import UniPCMultistepSchedulerpipe.scheduler UniPCMultistepScheduler.from_config(pipe.scheduler.config)定义一个图片显示布局的函数
def image_grid(imgs, rows, cols):assert len(imgs) rows * colsw, h imgs[0].sizegrid Image.new(RGB, size(cols * w, rows * h))grid_w, grid_h grid.sizefor i, img in enumerate(imgs):grid.paste(img, box(i % cols * w, i // cols * h))return grid生成一些人物肖像这些肖像与上面的图片姿势一样
prompt , best quality, extremely detailed
prompt [t prompt for t in [Sandra Oh, Kim Kardashian, rihanna, taylor swift]]
generator [torch.Generator(devicedevice).manual_seed(2) for i in range(len(prompt))]output pipe(prompt,canny_image,negative_prompt[monochrome, lowres, bad anatomy, worst quality, low quality] * len(prompt),generatorgenerator,num_inference_steps30,
)image_grid(output.images, 2, 2)Open Pose
第二个有趣的应用是从一张图片中提取身体姿态然后用它生成具有完全相同的身体姿态的另一张图片。这里使用Open Pose ControlNet做姿态迁移。 首先下载一些瑜伽图片
urls [yoga1.jpeg, yoga2.jpeg, yoga3.jpeg, yoga4.jpeg]
imgs [load_image(https://huggingface.co/datasets/YiYiXu/controlnet-testing/resolve/main/ url) for url in urls]
image_grid(imgs, 2, 2)补充安装mediapipe
!pip install mediapipeMediaPipe 是一款由 Google Research 开发并开源的多媒体机器学习模型应用框架。在谷歌一系列重要产品如 YouTube、Google Lens、ARCore、Google Home 以及 Nest都已深度整合了 MediaPipe。MediaPipe大有用武之地可以做物体检测、自拍分割、头发分割、人脸检测、手部检测、运动追踪等等。基于此可以实现更高级的功能。
MediaPipe 的核心框架由 C 实现并提供 Java 以及 Objective C 等语言的支持。MediaPipe 的主要概念包括数据包Packet、数据流Stream、计算单元Calculator、图Graph以及子图Subgraph。
数据包是最基础的数据单位一个数据包代表了在某一特定时间节点的数据例如一帧图像或一小段音频信号数据流是由按时间顺序升序排列的多个数据包组成一个数据流的某一特定时间戳Timestamp只允许至多一个数据包的存在而数据流则是在多个计算单元构成的图中流动。MediaPipe 的图是有向的——数据包从数据源Source Calculator或者 Graph Input Stream流入图直至在汇聚结点Sink Calculator 或者 Graph Output Stream 离开。 然后使用controlnet_aux中的Open Pose预处理器提取瑜伽的身体姿势
from controlnet_aux import OpenposeDetectormodel OpenposeDetector.from_pretrained(lllyasviel/ControlNet)
poses [model(img) for img in imgs]
image_grid(poses, 2, 2)接下来使用Open Pose ControlNet生成一些正在做瑜伽的超级英雄的图片
from diffusers import ControlNetModel, UniPCMultistepScheduler, StableDiffusionControlNetPipelinecontrolnet ControlNetModel.from_pretrained(fusing/stable-diffusion-v1-5-controlnet-openpose, torch_dtypetorch.float16)model_id runwayml/stable-diffusion-v1-5
pipe StableDiffusionControlNetPipeline.from_pretrained(model_id,controlnet controlnet,torch_dtypetorch.float16
)pipe.scheduler UniPCMultistepScheduler.from_config(pipe.scheduler.config)
pipe.enable_model_cpu_offload()
pipe.enable_xformers_memory_efficient_attention()生成图片
generator [torch.Generator(devicecpu).manual_seed(2) for i in range(4)]
prompt super-hero character, best quality, extremely detailed
output pipe([prompt] * 4,poses,negative_prompt[monochrome, lowres, bad anatomy, worst quality, low quality] * 4,generatorgenerator,num_inference_steps20,
)
image_grid(output.images, 2, 2)关于ControlNet更多的使用方法可以参考如下
lllyasviel/sd-controlnet-depthlllyasviel/sd-controlnet-hedlllyasviel/sd-controlnet-normallllyasviel/sd-controlnet-scribbllllyasviel/sd-controlnet-seglllyasviel/sd-controlnet-openposelllyasviel/sd-controlnet-mlsd
小结
ControlNet是一种神经网络结构它学习大型预训练的文本到图像扩散模型的带条件控制。它重用源模型的的大规模预训练层来构建一个深度且强大的编码器以学习特定条件。原始模型和可训练的副本通过“零卷积”层连接这些“零卷积”层可以消除训练期间的噪音。大量实验证明ControlNet可以有效控制带有单个或多个条件以及带/不带提示的Stable Diffusion。在多样化条件数据集上的结果展示出ControlNet结构可能适用于更广泛的条件并促进相关应用。
参考资料
ICCV2023最佳论文–斯坦福大学文生图模型ControlNet已开源!T2I-Adapterhttps://openai.wiki/controlnet-guide.htmlhttps://h1cji9hqly.feishu.cn/docx/YioKdqC0oo7XThxvW1ccOmbunEhlllyasviel/ControlNet万字长文解读Stable Diffusion的核心插件—ControlNetControlNet原理使用实操ControlNet v1.1: A complete guide使用ControlNet 控制 Stable Diffusionubuntu conda 的 stable-diffusion-webui 安装笔记Python中读取图片的6种方式MediaPipe 集成人脸识别人体姿态评估人手检测模型