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

news2025/1/8 4:29:10

 推荐阅读列表:

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

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

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

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

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

扩散模型实战(六):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

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

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

相关文章

Android : 获取、添加、手机联系人-ContentResolver简单应用

示例图: MainActivity.java package com.example.mygetdata;import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import androidx.core.app.ActivityCompat; import androidx.core.content.ContextCompat;import android.Mani…

vue项目通过HBuilder打包成apk,实现apk自动更新下载

vue 项目通过 HBuilder 打包成 apk,实现 apk 自动更新下载 1、vue 项目通过 HBuilder 打包成 apk vue 项目在终端执行 npm run build 打包成 dist 文件,生成的 dist 文件在 项目根目录下 在 HBuilder 中 新建一个项目 默认选择 5APP 的默认模板项目…

【多属性对象“{a:1,b:2}”】与【单属性对象的数组“[{a:1},{b:2}]”】的相互转换

前端开发的某些场景(比如用echarts开发某些可视化图表)经常需要将【多属性对象,如“{a:1,b:2}”】与【单属性对象的数组,如“[{a:1},{b:2}]”】做相互转换,以下是不通过循环,简洁实现这种转换的方法&#x…

广州华锐互动:线上3D低碳环保主题展厅,沉浸式体验有助于培养环保意识

随着科技的飞速发展,环保已经成为了全球关注的焦点。为了让更多的人了解环保科技的重要性,许多城市都建立了线上3D低碳环保主题展厅。这些展馆通过虚拟现实技术,让人们身临其境地感受到环保科技的魅力,从而提高人们的环保意识。 线…

卡码网语言基础课 | 14. 链表的基础操作Ⅱ

题目: 构建一个单向链表,链表中包含一组整数数据,输出链表中的第 m 个元素(m 从 1 开始计数)。 要求: 1. 使用自定义的链表数据结构 2. 提供一个 linkedList 类来管理链表,包含构建链表、输出…

自动标注好用吗?基于SAM和Label Studio搭建半自动实例分割标注平台

文章目录 一、半自动标注二、缺点三、安装方法1、 python版本要求2、下载playground3、SAM安装4、SAM权重下载5、安装label-studio-ml6、启动SAM接口7、SAM启动日志8、安装并启动label-studio9、label-studio启动日志 四、半自动标注使用方法1、创建project并导入数据2、标签设…

多元系的复相平衡

多元系的复相平衡 多元系的吉布斯函数 G-{T,p,n}系统 吉布斯关系 多元系的热力学基本方程

使用Three.js创建导航立方体

什么是导航立方体? 导航立方体是一个交互式的3D控件,它允许用户通过点击和拖动立方体的各个面来改变3D视图的方向。这是一种非常直观的方式,让用户能够轻松地在3D空间中导航。 创建导航立方体 下面是一个基本的步骤,说明如何使用Three.js创建一个导航立方体: // 创建场景…

ICCV 2023 | 动态蛇形卷积(内含即插即用的代码及测试用例)

论文链接: https://arxiv.org/abs/2307.08388 代码链接: https://github.com/YaoleiQi/DSCNet 下面直接上代码,并且源码中也给了测试用例,是一个即插即用的模块 import os import torch import numpy as np from torch impor…

怎么做excel表格的二维码?文件快速做二维码的教程

Excel表格怎么做成二维码来扫码插看呢?Excel是工作中常用的一种文件格式,想要将表格内容分享给其他人查看,那么将表格生成二维码的方法会更加的方便快捷,其他人只需要扫描二维码就可以查看或者下载文件。表格excel二维码可以通过文…

Rust语言入门教程(六) - 字符串类型

在Rust中, 字符串类型其实是一个比较复杂的话题。在Rust的标准库中,至少都提供了6种字符串类型,我们平常使用的最多的是其中的两种。这两种类型互相之间也有所关联: str: 字符串切片String 字符串 其中, 字…

细说数据仓库上篇

在谈数仓之前,先来看下面几个问题: 数仓为什么要分层? 用空间换时间,通过大量的预处理来提升应用系统的用户体验(效率),因此数据仓库会存在大量冗余的数据;不分层的话,…

高效运维管理的7个要点

T管理和运维工作涵盖了各行业的各岗位中,如何提高工作效率,规避风险,更好的做好IT管理和运维工作,已经成为一个不断探索和研究的新兴课题。因此,应从两个层面加强和完善IT管理和运维工作,可以改善IT运维工作…

为什么要编写测试用例,自己知道不就行了吗

“为什么要编写测试用例,测试用例写给谁看”,这个问题看似简单,但却涵盖了一系列复杂的考虑因素,并不太好回答。 为了向各位学测试的同学们解释清楚“为什么编写测试用例是至关重要的”,我将通过以下5个方面进行展开&…

MySQL-05-MySQL的日志系统

1-redo log(重做日志) 在MySQL里也有这个问题,如果每一次的更新操作都需要写进磁盘,然后磁盘也要找到对应的那条记录,然后再更新,整个过程IO成本、查找成本都很高。MySQL里经常说到的WAL技术,WAL的全称是Write-Ahead L…

pmos防反保护电路的设计,pmos烧毁原因分析

概述 汽车电源系统常在极为恶劣的环境下运行,数以百计的负载挂在汽车电池上,需要同时确定负载状态的汽车电池可能面临极大的挑战。当负载处于不同工作条件和潜在故障状态时,设计人员需要考虑电源线产生的各种脉冲可能带来的影响。 本系列的上…

VSD Viewer for Mac(Visio绘图文件阅读器)

VSD Viewer for Mac版是mac上一款非常强大的Visio绘图文件阅读器,它为打开和打印Visio文件提供了简单的解决方案。可以显示隐藏的图层,查看对象的形状数据,预览超链接。还可以将Visio转换为包含图层,形状数据和超链接的PDF文档。 …

RHEL开发者授权注册

$ sudo subscription-manager register --usernameusername --passwordpassword$ sudo subscription-manager attach --auto查看是否注册 Red Hat 订阅管理,请运行以下命令: $ sudo subscription-manager list --installed

mysql账户密码获取

数据库安装目录 MySQL\data\mysql 里面的user.MYD文件,需要编译查看 数据库里的user表 库下面的user表拿到后,直接解密密码即可 网站配置文件 conn、config、data、sql、common 、inc这些文件 比如pikachu\inc目录下的config.inc.php文件的内容会显示…

详解如何使用VSCode搭建TypeScript环境(适合小白)

搭建Javascript环境 因为TypeScript不能直接在浏览器上运行。它需要编译器来编译并生成JavaScript文件。所以需要首先安装好javascript环境,可以参考文章: 详解如何使用VS code搭建JavaScript环境(适合小白)_vscode配置javascri…