4、解构三个重要的Pipeline(SD-Inpainting, ControlNet, AnimateDiff) [代码级手把手解析diffusers库]

news2024/12/29 10:10:47

上一篇我们解析了所有Pipeline的基类DiffusionPipeline。后续各种各样的pipeline都继承了DiffusionPipeline的模型加载保存等功能,然后再配合各个组件实现各种的结构即可。

在这里插入图片描述

事实上,一个Pipeline通常包含了如下模块(from_pretrained函数根据model_index.json文件new了一个Pipeline,挨个扫描子文件夹创建模块加载对应的weight和config):

  • VAE,即变分自编码器,把图像编码到特征,进行生成过程后再把特征解码到图像。(有weight)
  • UNet,用于迭代采样预测噪声的模型。(有weight)
  • Text Encoder,用于把tokens编码为一串向量,用来控制扩散模型的生成。(有weight)
  • Tokenizer,把输入的文本按照字典编码为上面的tokens。
  • Scheduler,我们知道扩散模型有很多采样方法,Scheduler定义了我们用哪种采样方法
  • Safety_checker,NSFW检测器,很多人应该都不想要这个,可以去掉。
  • Feature_extractor,也是NSFW检测器的一部分,也可以去掉。
  • Image Encoder,如果有image作为条件就会需要,计算image embedding,用来控制扩散模型的生成(有weight)
  • Image Processor,配合Image Encoder,在计算emebedding之前进行一些数据增强。
  • ControlNet,如果使用各种control condition就会需要,本质是半个UNet,用于计算condition_images的feature 融合到UNet中(有weight)

本节我将带领大家解构diffusers中3个我觉得最有学习意义的Pipeline:

  • SD-InpaintingStableDiffusionInpaintPipeline
  • ControlNetStableDiffusionControlNetPipeline
  • AnimateDiffAnimateDiffPipeline

理解了上方这几个Pipeline,我们后续就很好对任意的pipeline进行修改和自定义了,无论是需要图像生成结构控制,还是局部重绘,亦或是需要视频生成一致性控制,都可以有一个很好的理解。

对于每个pipeline,我将按照如下方式展开:

  • 首先,进行组件的介绍__init__
  • 然后,按照pipeline的执行顺序__call__,分模块的讲解实现代码和原理。

【注意:SD作为经典的Pipeline我放在前面讲解,后面的Pipeline的某些代码,如果和SD相同,我将不再重复讲解,如果有细微差别,我会专门讲解】

题外话:我们看那典中典的五行代码,最后一行pipeline(xxx),代表着我们用这个对象的名称作为一个函数的调用,那么这种用法就会自动调用StableDiffusionPipeline类中的__call__()函数。事实上,Diffusers库中的大多数类我们首先就要看__init__()函数和__call__()函数。

StableDiffusionInpaintPipeline

组件:

vae: Union[AutoencoderKL, AsymmetricAutoencoderKL],
text_encoder: CLIPTextModel,
tokenizer: CLIPTokenizer,
unet: UNet2DConditionModel,
scheduler: KarrasDiffusionSchedulers,
safety_checker: StableDiffusionSafetyChecker,
feature_extractor: CLIPImageProcessor,
image_encoder: CLIPVisionModelWithProjection = None,

加载模型

根据上节可知,StableDiffusionInpaintPipeline调用from_pretrained依次加载各个模块,再最后执行__init__()函数:这一段把所有模块组合起来,并为pipeline注册对应的配置信息(一个FrozenDictself._internal_dict中)。

	def __init__(
        self,
        vae: Union[AutoencoderKL, AsymmetricAutoencoderKL

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

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

相关文章

disql备份还原

disql备份还原 前言 本文档根据官方文档,进行整理。 一、概述 在 disql 工具中使用 BACKUP 语句你可以备份整个数据库。通常情况下,在数据库实例配置归档后输入以下语句即可备份数据库: BACKUP DATABASE BACKUPSET db_bak_01;语句执行完…

spring boot(2.4.x 开始)和spring cloud项目中配置文件application和bootstrap加载顺序

在前面的文章基础上 https://blog.csdn.net/zlpzlpzyd/article/details/136060312 spring boot 2.4.x 版本之前通过 ConfigFileApplicationListener 加载配置 https://github.com/spring-projects/spring-boot/blob/v2.3.12.RELEASE/spring-boot-project/spring-boot/src/mai…

使用耳机壳UV树脂制作私模定制耳塞有哪些选择呢?

私模定制耳塞人士的选择可以从以下几个方面考虑: 专业经验:选择有丰富经验的私模定制耳塞人士,能够更好地理解用户需求,提供更专业的建议和服务。可以通过查看其作品和客户评价来了解其经验和口碑。材料质量:选择使用…

第五篇:MySQL常见数据类型

MySQL中的数据类型有很多,主要分为三类:数值类型、字符串类型、日期时间类型 三个表格都在此网盘中,需要者可移步自取,如果觉得有帮助希望点个赞~ MySQL常见数据类型表 数值类型 (注:decimal类型举例,如1…

【闲谈】开源软件的崛起与影响

随着信息技术的快速发展,开源软件已经成为软件开发的趋势,并产生了深远的影响。开源软件的低成本、可协作性和透明度等特点,使得越来越多的企业和个人选择使用开源软件,促进了软件行业的繁荣。然而,在使用开源软件的过…

STM32 STD/HAL库驱动W25Q64模块读写字库数据+OLED0.96显示例程

STM32 STD/HAL库驱动W25Q64 模块读写字库数据OLED0.96显示例程 🎬原创作者对W25Q64保存汉字字库演示: W25Q64保存汉字字库 🎞测试字体显示效果: 📑功能实现说明 利用W25Q64保存汉字字库,OLED显示汉字的时…

vue electron 应用在windows系统上以管理员权限打开应用

打开package.json文件,在build下的win增加配置 "requestedExecutionLevel": "requireAdministrator",

商汤科技「日日新4.0」正式发布,多维度升级大模型体系,能力比肩GPT-4!

文 | BFT机器人 近日,商汤科技正式发布「日日新SenseNova 4.0」,宣告大模型体系多维度全面升级。这款模型具备更全面的知识覆盖、更可靠的推理能力,以及更优越的长文本理解和数字推理能力。同时,它还支持跨模态交互,为…

给定具体日期 返回给定日期是星期几 calendar.weekday(year,month,day)

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 给定具体日期 返回给定日期是星期几 calendar.weekday(year,month,day) [太阳]选择题 如果2024年2月12日是星期一,请问最后一个print语句的运行结果是? import calenda…

【Spring学习】Spring Data Redis:RedisTemplate、Repository、Cache注解

1,spring-data-redis官网 1)特点 提供了对不同Redis客户端的整合(Lettuce和Jedis)提供了RedisTemplate统一API来操作Redis支持Redis的发布订阅模型支持Redis哨兵和Redis集群支持基于Lettuce的响应式编程支持基于JDK、JSON、字符…

【教3妹学编程-算法题】执行操作后的最大分割数量

2哥 : 3妹,今年过年收到压岁钱了没呢。 3妹:切,我都多大了啊,肯定没收了啊 2哥 : 俺也一样,不仅没收到,小侄子小外甥都得给,还倒贴好几千 3妹:哈哈哈哈,2叔叔&#xff0c…

JAVA学习笔记9

1.Java API 文档 1.java类的组织形式 2.字符类型(char) 1.基本介绍 ​ *字符类型可以表示单个字符,字符类型是char,char是两个字节(可以存放汉字),多个字符我们用字符串String ​ eg:char c1 ‘a’; ​ char c2…

AJAX——常用请求方法

1 请求方法 请求方法:对服务器资源,要执行的操作 2 数据提交 场景:当数据需要在服务器上保存 3 axios请求配置 url:请求的URL网址 method:请求的方法,GET可以省略(不区分大小写) …

牛客网SQL进阶114:更新记录

官网链接: 更新记录(二)_牛客题霸_牛客网现有一张试卷作答记录表exam_record,其中包含多年来的用户作答试卷记录,结构如下表。题目来自【牛客题霸】https://www.nowcoder.com/practice/0c2e81c6b62e4a0f848fa7693291d…

Excel下载接口

💗wei_shuo的个人主页 💫wei_shuo的学习社区 🌐Hello World ! Excel下载接口 需求分析 页面表格的数据下载,保存到Excel表格搜索后的数据点击下载,下载的数据需要是搜索后的数据 Controller HTTP 响应对象:…

【HTTP】localhost和127.0.0.1的区别是什么?

目录 localhost是什么呢? 从域名到程序 localhost和127.0.0.1的区别是什么? 域名的等级划分 多网站共用一个IP和端口 私有IP地址 IPv6 今天在网上逛的时候看到一个问题,没想到大家讨论的很热烈,就是标题中这个: …

python常用的深度学习框架

目录 一:介绍 二:使用 Python中有几个非常受欢迎的深度学习框架,它们提供了构建和训练神经网络所需的各种工具和库。以下是一些最常用的Python深度学习框架: 一:介绍 TensorFlow:由Google开发的TensorF…

LeetCode Python -8.字符串转整数

文章目录 题目答案运行结果 题目 请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C 中的 atoi 函数)。 函数 myAtoi(string s) 的算法如下: 读入字符串并丢弃无用的前导空格检查下一个…

C语言--------数据在内存中的存储

1.整数在内存中的存储 整数在内存是以补码的形式存在的; 整型家族包括char,int ,long long,short类型; 因为char类型是以ASCII值形式存在,所以也是整形家族; 这四种都包括signed,unsigned两种,即有符号和无符号&am…

ncc匹配提速总结

我们ncc最原始的匹配方法是:学习模板w*h个像素都要带入ncc公式计算 第一种提速,学习模板是w*h,而我们支取其中的w/2*h/2,匹配窗口同理,计算量只有1/4。 另外一种因为ncc是线性匹配,我们在这上面也做了文章&#xff0…