扩散模型实战(十三):ControlNet结构以及训练过程

 推荐阅读列表:

 扩散模型实战(一):基本原理介绍

扩散模型实战(二):扩散模型的发展

扩散模型实战(三):扩散模型的应用

扩散模型实战(四):从零构建扩散模型

扩散模型实战(五):采样过程

扩散模型实战(六):Diffusers DDPM初探

扩散模型实战(七):Diffusers蝴蝶图像生成实战

扩散模型实战(八):微调扩散模型

扩散模型实战(九):使用CLIP模型引导和控制扩散模型

扩散模型实战(十):Stable Diffusion文本条件生成图像大模型

扩散模型实战(十一):剖析Stable Diffusion Pipeline各个组件

扩散模型实战(十二):使用调度器DDIM反转来优化图像编辑

       经过前面的学习,我们已经可以熟练的使用文本Prompt来生成一副精美的图片了。通常来说,文本Prompt准确性越高,描述越丰富,生成的图像越符合用户的预期,然而,有些事物很难通过文本Prompt来指导Stable Diffusion模型,比如人物四肢的角度、背景中物体的位置、每一缕光线的角度,因为文字的表达能力是有限的。

一、ControlNet介绍

       本文分享的ControlNet是一种能够嵌入任意已经训练好的扩散模型,并通过图像Prompt来引入图像特征更加精细的控制扩散模型的生成过程,ControlNet的基本结构如下图所示:

       从上图可以看出,ControlNet的基本结构由一个对应的原先网络的神经网络模块和两个”零卷积“层组成。在训练过程中,会”锁死“原先网络的权重,只更新ControlNet基本结构中的网络”副本“和零卷积层的权重。这些可训练的网络”副本“将学会如何让模型按照新的控制条件来生成结果,而被”锁死“的网络会保留原先网络已经学会的所有知识。零卷积层是一些权重和偏置被初始化为0的1X1卷积层。训练刚开始的时候,无论新添加的控制条件是什么,这些零卷积层都只输出0,ControlNet不会对扩散模型的生成结果造成任何影响。随着训练过程的深入,ControlNet将逐渐调整扩展模型原先的生成过程,使得生成的图像逐渐向新添加的控制条件靠近。

二、ControlNet训练

      将上面描述的ControlNet block堆叠14次就得到完整的ControlNet,如下图所示:

      训练一个附加到某个Stable Diffusion模型上的ControlNet的过程大致如下所示:

  1. 收集想要对其附加控制条件的数据集和对应的Prompt。假如想训练一个通过人体关键点来对扩散模型的人体进行姿态控制的ControlNet,则首先需要收集一批人物图片,并标注好这批人物图片的Prompt以及对应的人体关键点的位置;

  2. 将Prompt输入被”锁死“的Stable Diffusion模型,并将标注好的图像控制条件(如人体关键点的标注结果)输入ControlNet,然后按照Stable Diffusion模型的训练过程迭代ControlNet block权重;

  3. 在训练过程中,随机将50%的文本Prompt替换为空白字符串,这样做的目的是”强制“网络从图像控制条件中学习更多的语义信息;

  4. 训练结束后,便可以使用ControlNet对应的图像控制条件(如输入的人体关键点)来控制扩散模型生成符合条件的图像

三、ControlNet示例

    本小节将介绍一些已经训练好的ControlNet示例,都来自Huggingface。

3.1 ControlNet与Canny Edge

       Canny Edege是一种多阶段的边缘检测算法,该算法可以从不同的视觉对象中提取有用的结构信息,从而显著降低图像处理过程中的数据处理量,ControlNet与Canny Edge结合使用的效果如下图所示:

3.2 ControlNet与M-LSD Lines

       M-LSD Lines是另一种轻量化的边缘检测算法,擅长提取图像中的直线线条。训练在M-LSD Lines上的ControlNet适合室内环境方面的图片。ControlNet与M-LSD Lines结合使用的效果,如下图所示:

3.3 ControlNet与HED Boundary

       HED Boundary可以保持输入图像更多信息,训练在HED Boundary上的ControlNet适合用来重新上色和进行风格重构。ControlNet与HED Boundary结合使用的效果,如下图所示:

 四、ControlNet实战

    下面以Canny Edge为例,展示如何在Diffusers中使用StableDiffusionControlNetPipeline生成图像。

安装需要使用的库

!pip install -q diffusers==0.14.0 transformers xformers git+https://   github.com/huggingface/accelerate.git

为了对应选择ControlNet,需要安装两个依赖库对图像进行处理,以提取不同的图像控制条件

!pip install -q opencv-contrib-python!pip install -q controlnet_aux

以知名画作《戴珍珠耳环的少女》为例进行展示ControlNet效果

from diffusers import StableDiffusionControlNetPipelinefrom diffusers.utils import load_image image = load_image(    "https://hf.co/datasets/huggingface/documentation-images/ resolve/main/diffusers/input_image_vermeer.png")image

首先将这张图片交给Canny Edge边缘提取器进行预处理

import cv2from PIL import Imageimport numpy as np image = np.array(image) low_threshold = 100high_threshold = 200 image = cv2.Canny(image, low_threshold, high_threshold)image = image[:, :, None]image = np.concatenate([image, image, image], axis=2)canny_image = Image.fromarray(image)canny_image

边缘提取效果,如下图所示:

可以看到Canny Edge能够识别出图像中物体的边缘线条。接下来,需要导入runwaylml/stable-diffusion-v1-5模型以及能够处理Canny Edge的ControlNet模型。为了加快推理速度,采用半精度(float16)。

from diffusers import StableDiffusionControlNetPipeline,ControlNetModelimport torch controlnet = ControlNetModel.from_pretrained("lllyasviel/sd- controlnet-canny", torch_dtype=torch.float16)pipe = StableDiffusionControlNetPipeline.from_pretrained(    "runwayml/stable-diffusion-v1-5", controlnet=controlnet,      torch_dtype=torch.float16)

      使用当前速度最快的扩散模型调度器-UniPCMultistepScheduler,迭代20次就可以达到之前默认调度器50次迭代的效果。

from diffusers import UniPCMultistepSchedulerpipe.scheduler = UniPCMultistepScheduler.from_config(pipe.scheduler.   config)

       使用Canny Edge来控制所生成图像中物体的确切位置和边缘轮廓。下面代码旨在生成一些人物的肖像,这些人物钧摆出与《戴珍珠耳环的少女》相同的姿势。在ControlNet和Canny Edge下,我们只需要在Prompt中提到这些人的姓名就可以了,代码如下:

def image_grid(imgs, rows, cols):    assert len(imgs) == rows * cols     w, h = imgs[0].size    grid = Image.new("RGB", size=(cols * w, rows * h))    grid_w, grid_h = grid.size     for 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(device="cpu").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),    generator=generator,    num_inference_steps=20,) image_grid(output.images, 2, 2)

        生成的人物肖像,如下图所示:

       还可以从一张图片中提取身体姿态,然后用它生成具有完全相同的身体姿态的另一张图片,代码如下:

urls = "yoga1.jpeg", "yoga2.jpeg", "yoga3.jpeg", "yoga4.jpeg"imgs = [    load_image("https://hf.co/datasets/YiYiXu/controlnet-testing/ resolve/main/" + url)     for url in urls] image_grid(imgs, 2, 2)

         原始图片如下图所示:

提取瑜伽的身体姿态,代码如下:

from controlnet_aux import OpenposeDetector model = OpenposeDetector.from_pretrained("lllyasviel/ControlNet") poses = [model(img) for img in imgs]image_grid(poses, 2, 2)

提取效果,如下图所示:

使用Open Pose ControlNet生成一些正在做瑜伽的超级英雄图片,代码如下:

controlnet = ControlNetModel.from_pretrained(    "fusing/stable-diffusion-v1-5-controlnet-openpose",    torch_dtype=torch.float16) model_id = "runwayml/stable-diffusion-v1-5"pipe = StableDiffusionControlNetPipeline.from_pretrained(    model_id,    controlnet=controlnet,    torch_dtype=torch.float16,)pipe.scheduler = UniPCMultistepScheduler.from_config(pipe.scheduler.   config)pipe.enable_model_cpu_of f load()pipe.enable_xformers_memory_efficient_attention() generator = [torch.Generator(device="cpu").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,    generator=generator,    num_inference_steps=20,)image_grid(output.images, 2, 2)

生成的效果,如下图所示:

关于ControlNet更多的使用方法,可以参考如下:

lllyasviel/sd-controlnet-depth

lllyasviel/sd-controlnet-hed

lllyasviel/sd-controlnet-normal

lllyasviel/sd-controlnet-scribbl

lllyasviel/sd-controlnet-seg

lllyasviel/sd-controlnet-openpose

lllyasviel/sd-controlnet-mlsd

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

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

相关文章

振南技术干货集:znFAT 硬刚日本的 FATFS 历险记(9)

注解目录 1、znFAT 的起源 1.1 源于论坛 (那是一个论坛文化兴盛的年代。网友 DIY SDMP3 播放器激起了我的兴趣。) 1.2 硬盘 MP3 推了我一把 (“坤哥”的硬盘 MP3 播放器,让我深陷 FAT 文件系统不能自拔。) 1.3 我…

智能优化算法应用:基于缎蓝园丁鸟算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于缎蓝园丁鸟算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于缎蓝园丁鸟算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.缎蓝园丁鸟算法4.实验参数设定5.算法结果…

WIN10 x86环境部署ARM虚拟机(银河麒麟)

我们经常使用的是x86架构的cpu,而对于不同cpu架构的arm架构的操作系统,我们可以通过QEMU模拟器来进行模拟一个arm环境 1、部署前的准备 arm的镜像: 以此镜像为例:Kylin-Server-10-SP2-aarch64-Release-Build09-20210524.iso QE…

每日一练【移动零】

一、题目描述 283. 移动零 - 力扣(LeetCode) 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 请注意 ,必须在不复制数组的情况下原地对数组进行操作。 二、题目解析 可以…

docker限制容器内存的方法

在服务器中使用 docker 时,如果不对 docker 的可调用内存进行限制,当 docker 内的程序出现不可预测的问题时,就很有可能因为内存爆炸导致服务器主机的瘫痪。而对 docker 进行限制后,可以将瘫痪范围控制在 docker 内。 因此&#…

1、nmap常用命令

文章目录 1. 主机存活探测2. 常见端口扫描、服务版本探测、服务器版本识别3. 全端口(TCP/UDP)扫描4. 最详细的端口扫描5. 三种TCP扫描方式(1)TCP connect 扫描(2)TCP SYN扫描(3)TCP …

两部手机数据传输后备忘录不见了怎么回事

想必很多人都遇到过,当两部手机进行备忘录数据传输后,突然发现备忘录不见了,这让人不禁着急上火,我也曾经遇到过这种事情导致很多重要的内容都丢失了。 一般出现这种情况可能是因为,两部手机使用的是不同的云服务&…

2020年3月25日 Go生态洞察:Go、Go社区与疫情大流行

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…

04 # 第一个 TypeScript 程序

初始化项目以及安装依赖 新建 ts_in_action 文件夾 npm init -y安装好 typescript,就可以执行下面命令查看帮助信息 npm i typescript -g tsc -h创建配置文件,执行下面命令就会生成一个 tsconfig.json 文件 tsc --init使用 tsc 编译一个 js 文件 新…

Element-ui合并table表格列方法

merageCell({ row, column, rowIndex, columnIndex }) {if (columnIndex 0 || columnIndex 1) {const property columnIndex 0 ? name : firstDeptName;// 获取当前行的property,这里看自己的需要,改成根据哪个去判断const currentPropertyVal row…

ChatGPT到底是如何运作?

自从2022年11月30日发布以来,ChatGPT一直占据着科技届的头条位置,随着苹果的创新能力下降,ChatGPT不断给大家带来震撼,2023年11月7日,首届OpenAI开发者大会在洛杉矶举行,业界普遍认为,OpenAI的开…

Text-to-SQL小白入门(九)InstructGPT论文:教你如何训练ChatGPT

论文概述 InstructGPT和ChatGPT 的训练流程基本一致 ,ChatGPT是改进后的InstructGPT,比如InstructGPT是基于GPT-3训练,而ChatGPT是基于GPT-3.5训练。 基本信息 英文标题:Training language models to follow instructions with h…

香港科技大学广州|智能制造学域博士招生宣讲会—华中科技大学专场

时间:2023年12月08日(星期五)15:00 地点:华中科技大学大学生活动中心A座603 报名链接:https://www.wjx.top/vm/mmukLPC.aspx# 宣讲嘉宾: 胡鹏程 副教授 https://facultyprofiles.hkust-gz.edu.cn/faculty-…

RabbitMQ消息队列

简介 MQ(message queue),从字面意思上看就个 FIFO 先入先出的队列,只不过队列中存放的内容是 message 而已,它是一种具有接收数据、存储数据、发送数据等功能的技术服务。 作用:流量削峰、应用解耦、异步处理。 生产者将消息发送…

黑马点评-Feed流的实现方案,基于推拉结合模式实现笔记推送

Feed流实现方案 我们关注了博主之后,当用户发布了动态后我们应该把这些数据推送给粉丝,关注推送也叫作Feed(投喂)流,通过无限下拉刷新获取新的信息 传统的模式内容检索: 粉丝需要主动通过搜索引擎或者是其他方式去查找想看的内容新型Feed流的效果: 系统分析用户到底想看什么,…

okhttp系列-拦截器的执行顺序

1.将拦截器添加到ArrayList final class RealCall implements Call {Response getResponseWithInterceptorChain() throws IOException {//将Interceptor添加到ArrayListList<Interceptor> interceptors new ArrayList<>();interceptors.addAll(client.intercept…

注意力机制(Attention Mechanism)

目录 1. 简介&#xff1a;探索注意力机制的世界 2. 历史背景 3. 核心原理 4. 应用案例 5. 技术挑战与未来趋势 6. 图表和示例 7. Conclusion 1. 简介&#xff1a;探索注意力机制的世界 在当今的人工智能&#xff08;AI&#xff09;和机器学习&#xff08;ML&#xff09;…

戴尔科技推出全新96核Precision 7875塔式工作站

工作站行业一直是快节奏且充满惊喜的。在过去25年中,戴尔Precision一直处于行业前沿,帮助创作者、工程师、建筑师、研究人员等将想法变为现实,并对整个世界产生影响。工作站所发挥的作用至关重要,被视为化不可能为可能的必要工具。如今,人工智能(AI)和生成式AI(GenAI)的浪潮正在…

npm管理发布包-创建与发布

创建与发布 我们可以将自己开发的工具包发布到 npm 服务上&#xff0c;方便自己和其他开发者使用&#xff0c;操作步骤如下 创建文件夹&#xff0c;并创建文件indexjs&#xff0c;在文件中声明函数&#xff0c;使用 module.exports 暴露npm初始化工具包&#xff0c;package.j…

浅谈硬件连通性测试几大优势

硬件连通性测试是确保硬件系统正常运行、提高系统可靠性和降低生产成本的关键步骤。在现代工程和制造中&#xff0c;将连通性测试纳入生产流程是一个明智的选择&#xff0c;有助于确保硬件产品的质量和性能达到最优水平。本文将介绍硬件连通性测试的主要优势有哪些! 一、提高系…