当前位置: 首页 > article >正文

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

上一篇我们解析了所有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.kler.cn/a/234043.html

相关文章:

  • JS 实现SSE通讯和了解SSE通讯
  • [代码随想录Day10打卡] 理论基础 232.用栈实现队列 225. 用队列实现栈 20. 有效的括号 1047. 删除字符串中的所有相邻重复项
  • 定时器(QTimer)与随机数生成器(QRandomGenerator)的应用实践——Qt(C++)
  • 【测试框架篇】单元测试框架pytest(1):环境安装和配置
  • c#使用COM接口设置excel单元格宽高匹配图片,如何计算?
  • wordpress搭建主题可配置json
  • redis过期淘汰策略、数据过期策略与持久化方式
  • Multisim14.0仿真(五十五)汽车转向灯设计
  • 骨科器械行业分析:市场规模为360亿元
  • 7 scala的类构造器
  • 物联网数据隐私保护技术
  • Java:JDK8新特性(Stream流)、File类、递归 --黑马笔记
  • MySQL数据库应用实验报告——实验1 表结构创建
  • 疑似针对安全研究人员的窃密与勒索
  • Element-ui date-picker组件报错 date.getHours is not a function
  • Lua: 一门轻量级、高效的脚本语言
  • HiveSQL——借助聚合函数与case when行转列
  • 【Java】案例:检测MySQL是否存在某数据库,没有则创建
  • DC-8靶机渗透详细流程
  • 怎么用postman调用webservice(反推SoapUI)
  • Ubuntu上开启SFTP服务教程
  • 软件安全测试报告如何编写?权威的安全测试报告如何获取?
  • Hive-架构与设计
  • CNN应用Keras Tuner寻找最佳Hidden Layers层数和神经元数量
  • vue3跨组件(多组件)通信:事件总线【Event Bus】
  • 修改GI文件的权限