Stable Diffusion ComfyUI 基础教程(七)如何使用三大微调模型:Embeddings、Lora、超网络

部署运行你感兴趣的模型镜像

图片

前言:

  1. 在我们绘图过程中我们用到了 Checkpoint 模型和 VAE模型,但是还有另外三种可以辅助我们出图的模型没有给大家介绍,他们分别是 Embeddings(嵌入)、Lora(低秩适应模型)、Hypernetwork(超网络)这三种模型;
  2. 在开始讲解这三个模型之前我们一定要记住不止 Checkpoint(大模型)分 SD1.4、SD1.5、SDXL1.0等基础算法型号,这三个模型同样也分,我们在使用时要选择对应基础算法型号才能正常使用。
  3. 今天我们就讲讲这三种模型分别是什么原理、有什么作用和怎么使 用。

Embeddings:

原理介绍(如果只想知道怎么使用可以跳过原理介绍这段):
  1. Embeddings 翻译成中文就是“嵌入”,他在深度学习领域通常指的是“嵌入式向量”,这些向量是高维空间中的点,能够代表输入数据(如文本或图像)的关键特征。
  2. 我们输入的关键词能被识别,正是因为 Text Encoder 将自然语意的 Prompt 转成了数值向量,这些数值向量他们不仅包含数值信息,还包含数据之间的关系和结构信息。
  3. 想象一下,你正在向别人描述独角兽长什么样,你可能会说‘它像马,有白色的毛发,前额上有一只角’。即使对方从未见过独角兽,通过这些关键描述,他们也能在脑海中形成一个独角兽的形象。在深度学习中,Embeddings模型的作用类似于这种描述。当我们给计算机系统输入一个词,比如‘独角兽’,Embeddings模型会生成一个数值向量,这个向量包含了与‘独角兽’相关的所有关键特征。这样,即使计算机系统‘没见过’独角兽,它也能通过这个向量理解‘独角兽’这个是什么。
  4. 通过上面的例子可以看出他只是在描述什么是“独角兽”,并将其转换成一种数值表示形式,并不直接参与绘画。所以他没有改变大模型的权重参数,也就只能用来固定元素或画面特征,这也是他的局限性。
安装位置:
  1. 我们在部份模型下载网站很有可能看不到 Embeddings 模型,但是他会以 Textual Inversion(文本倒置)这个名字出现,他们是同一个东西(下图是 C 站和 LibLib 的筛选框)。

图片

  1. 模型存放位置在:“ComfyUI_windows_portable\ComfyUI\models\embeddings”目录下,如果你是和 Web UI 共用的模型,那就放在“sd-webui\embeddings”目录下。
作用及如何使用:
  1. 此模型通常用来嵌入元素特征(比如人物特征)、负面信息(用来减少图的崩坏几率)
  2. 使用 Embeddings 模型我们只需要在提示词输入框输入他的“触发词”就可以,一般我们在下载模型的时候会看到作者给出的触发词。

图片

  1. 是不是输入触发词比较麻烦,我们需要记住每个模型的触发词。我们可以通过一个插件去选择 Embeddings 模型,还记得我第一节课给大家推荐的“小瑞士军刀美化辅助(ComfyUI-Custom-Scripts)”插件吗,在输入框输入“embeddings”中的任意一个字母或“模型名称的任意一个字母”即可在弹窗中选择模型,并且点击模型右侧的“ℹ️”还可以查看模型的相关信息及 C 站跳转链接。

图片

  1. 我们用《电锯人》中 Makima 的 Embeddings 模型来对比一下不使用和使用的效果(相同关键词和种子下,上/左图:未使用,下/右图:使用)

图片

图片

  1. 很明显的看出下面这张图带有 Makima 的特征,当然和真正的 Makima 还是有一定区别的,要想让图像更加符合人物特征还是要用 Lora 模型。

  2. 我们用的最多的还是用来解决AI不会画手或肢体错乱,颜色混杂等痛点,这时候就有大佬整合一些 AI 画错了的图像(比如:六指,畸形的图像,三条腿…),训练成了 Embeddings 模型也叫 Negative Embeddings(负面词嵌入)模型,我们只需要把他输入到负向关键词里面,在绘图时让他禁止绘制此类案例就可以了。

  3. 常用的 Negative Embeddings(负面词嵌入)模型:

    1. SD1.5:badhandv4、EasyNegative、ng_deepnegative_v1_75t
    2. SDXL1.0:unaestheticXL_AYv1
  4. 我们来看一下效果(相同关键词和种子下,上图:未使用,下图:使用),我们很明显地看出有一定的效果

图片

  1. 当然加了 Embeddings 也并不意味着就能解决这些问题,它只是提高了生成好图片的概率,但是总比不加时效果好了很多。
  2. 在使用 Embeddings 模型时,我们可以多个 Embeddings 模型 进行组合使用,会让我们得到意想不到的效果;
  3. 常用的 Embeddings 模型我也会放在本节课的文件里面,比如对年龄、性别的控制模型。

Lora:

原理介绍(如果只想知道怎么使用可以跳过原理介绍这段):
  1. LoRA:Low-Rank Adaptation Models(低秩适应模型),他的核心思想是在不显著改变原有模型结构的情况下,通过添加一些额外的、低秩(即简化的)矩阵来调整模型的权重,从而提升模型的性能或适应性。
  2. 在微调 Stable Diffusion 模型的情况下,相较于大模型的 Dreambooth(训练方法,输出 Checkpoint 模型)的全面微调模型方法,Lora 的训练参数可以减少很多倍,对硬件性能的要求也降低很多。
  3. 想象一下你有一辆车,这辆车已经可以满足你的日常需求,比如上班通勤。但有一天,你决定参加一场越野赛车比赛。你知道你的车在原有状态下无法应对越野赛的挑战,但你也不想换一辆新车。这时,你可以选择对你的车进行一些改装,比如换上越野轮胎、增强悬挂系统,这样你的车就能适应越野赛的环境。
  4. 在这个例子中,你的原始车辆就像是一个已经训练好的神经网络模型,它在大多数情况下都能很好地工作。然而,当面对新的或特殊的任务(比如越野赛)时,它可能需要一些调整才能更好地适应。LoRA(Low-Rank Adaptation)模型的作用就像是对车辆进行的这些特定改装。通过在原有模型上添加低秩矩阵(相当于对车辆的特定部分进行改装),我们可以使模型更好地适应新的任务,而不需要完全重新设计或训练一个新模型。
安装位置:

模型存放位置在“ComfyUI_windows_portable\ComfyUI\models\loras”目录下,如果你是和 Web UI 共用的模型,那就放在“sd-webui\models\Lora”目录下。

作用及如何使用:
  1. 通常 Lora 模型用来指定目标特征(比如:人物、动作、年龄、服装、材质、视角、风格等);
  2. 在使用上比较简单,“右键-新建节点-加载器-LoRA加载器”;

图片

  1. 看到这个节点我们应该能猜到怎么连接吧,左侧的“模型/CLIP”和“Checkpoint加载器”连接,右侧的“模型/CLIP”分别和“K采样器”、“CLIP文本编码器”连接。
  2. 这时候我们会发现个问题,有两个“CLIP文本编码器”(正向和负向)啊,我们连哪个,还是都连。经过测试只对正向关键词有效果,也就是说,我们可以两个都连接,也可以只连正向关键词对应的“CLIP文本编码器”。
  3. 我们选择个 Lora模型 试一下效果,我以原神中的角色 芭芭拉 为例:

图片

  1. 是不是知道怎么使用了,但是我们在 Web UI 上可以设置 Lora模型 的权重和使用多个 Lora模型对吧,一个个来说,我们先说怎么设置权重;
  2. 在“LoRA加载器”节点上除了选择模型外是不是还有两个可以设置参数的地方,模型强度、CLIP强度。至于我们设置哪个参数能达到控制权重的效果,完全取决于模型的训练方式。所以我们在不知道受哪个参数影响的情况下,我们可以对两个参数都进行调节,而 Web UI 上是把两个参数整合在一起了。
  3. 至于多个 Lora模型那就更简单了,我们在这个“LoRa模型加载器”后面再连一个就可以了;

图片

图片

  1. 是不是已经学会了怎么使用 Lora模型了,但是我们使用多个 Lora模型 的时候就会让流程图更复杂、更乱,调节权重也比较麻烦,我们可以使用一个插件帮我们解决。

  2. efficiency-nodes-comfyui(效率节点):https://github.com/jags111/efficiency-nodes-comfyui.git

  3. 我们先看一下怎么使用,直接把三个节点都加载出来“右键-新建节点-效率节点-堆栈- LoRA堆”、“右键-新建节点-效率节点-效率加载器”、“右键-新建节点-效率节点-采样-K采样器(效率)”。

  4. 先看“LoRA堆”节点我们可以看到有三类可调节的地方;

    1. 输入模式:和控制权重有关,在这个节点我们可以通过调节一个参数就能控制权重了,如果我们把输入模式改为高级,Lora权重就会分成模型强度、CLIP强度;
    2. Lora数量:用来调节我们使用几个 Lora模型的,当前数值是3,我们就有三个Lora可选;
    3. Lora选择和权重就不用说了吧。
  5. 效率加载器,我们需要操作的地方有:大模型选择、VAE模型选择、Lora模型(不使用选无,如果只使用一个就可以在这个节点选择,多个情况下就使用我们上面说的 Lora堆节点)、正反提示词、宽高、批次;

  6. K采样器基本上一样,没什么大的区别。

图片

图片

图片

  1. 是不是在这三个节点上就很明显的看出减少了很多的连接,我还是以芭芭拉和冰箱贴纸两个Lora为例进行连接;

图片

  1. 是不是简单了很多,这个插件可不止用来帮我们解决 Lora模型的连接的问题,他能帮我们简化很多节点的连接,包括我们下节课要讲的多个 ControlNet 使用,也能减少连接步骤。

Hypernetwork:

原理介绍(如果只想知道怎么使用可以跳过原理介绍这段):
  1. 这个,,,现在用的很少了,我们简单说一下。Hypernetwork 也叫超网络,他的原理是在扩散模型的基础上新建一个神经网络来调整模型参数,就是因为这个原因才叫做超网络模型。
  2. 他在效果上和 Lora 类似,但是因为训练难度大,应用范围小,所以逐渐被 Lora 替代。
安装位置

模型存放位置在“ComfyUI_windows_portable\ComfyUI\models\hypernetworks”目录下,如果你是和 Web UI 共用的模型,那就放在“sd-webui\models\hypernetworks”目录下。

作用及如何使用:
  1. 大多用来控制图像风格;
  2. 在使用上他和 Lora 有些类似,“右键-新建节点-加载器-超网络加载器”;

图片

  1. 可以看到,“超网络加载器”相比“LoRa加载器”少了CLIP的连接,我们只把他串联在“Checkpoint加载器”和“K采样器”之间就可以。
  2. 下面我使用一个 Chibi风格(日语中翻译为小矮子、小家伙)的超网络模型演示一下(相同关键词和种子下,上/左图:未使用,下/右图:使用)。

图片

图片

总结:

  1. 这节课十分的简单,我们每一个微调模型都能多个叠加使用,并且这三类可以同时使用;
  2. 虽然给大家介绍了“效率节点”,但是他不是万能的,我们搭建一个复杂的工作流还是需要了解出图的逻辑。

关于AI绘画技术储备

学好 AI绘画 不论是就业还是做副业赚钱都不错,但要学会 AI绘画 还是要有一个学习规划。最后大家分享一份全套的 AI绘画 学习资料,给那些想学习 AI绘画 的小伙伴们一点帮助!

感兴趣的小伙伴,赠送全套AIGC学习资料和安装工具,包含AI绘画、AI人工智能等前沿科技教程,模型插件,具体看下方。

需要的可以微信扫描下方优快云官方认证二维码免费领取【保证100%免费】

一、AIGC所有方向的学习路线

AIGC所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照下面的知识点去找对应的学习资源,保证自己学得较为全面。

在这里插入图片描述

在这里插入图片描述

二、AIGC必备工具

工具都帮大家整理好了,安装就可直接上手!
在这里插入图片描述

三、最新AIGC学习笔记

当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。
在这里插入图片描述
在这里插入图片描述

四、AIGC视频教程合集

观看全面零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

在这里插入图片描述

五、实战案例

纸上得来终觉浅,要学会跟着视频一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
在这里插入图片描述
这份完整版的学习资料已经上传优快云,朋友们如果需要可以微信扫描下方优快云官方认证二维码免费领取【保证100%免费】

您可能感兴趣的与本文相关的镜像

ComfyUI

ComfyUI

AI应用
ComfyUI

ComfyUI是一款易于上手的工作流设计工具,具有以下特点:基于工作流节点设计,可视化工作流搭建,快速切换工作流,对显存占用小,速度快,支持多种插件,如ADetailer、Controlnet和AnimateDIFF等

<think> 我们之前已经讨论过使用LoRA微调Stable Diffusion来控制嘴巴大小,现在用户再次询问具体方法。根据之前的回答,我们需要强调数据准备、环境搭建、模型配置、训练过程和推理等关键步骤。同时,用户引用了一条关于封装Hugging Face格式的实战技巧,我们可以将其融入回答,特别是在模型保存和加载方面。 需要注意的是,用户的问题集中在“如何训练控制嘴巴大小”,所以我们将重点放在如何将嘴巴大小作为条件融入训练,以及如何准备标注数据。 以下是详细步骤: 1. 数据准备:收集包含不同嘴巴大小的人脸图像,并进行标注。标注可以是文本描述(如“small mouth”, “large mouth”)或数值(如嘴巴宽度与脸宽的比值)。同时,为了便于模型学习,我们可以在文本提示中明确包含嘴巴大小的描述。 2. 环境搭建:安装必要的库,包括diffusers, transformers, accelerate, peft等。 3. 模型加载:使用Stable Diffusion预训练模型。 4. LoRA配置:使用PEFT库配置LoRA,将其应用于UNet中的特定模块(如q_proj, v_proj)。 5. 训练过程:将嘴巴大小的标注信息作为条件输入。这里有两种方式: a. 文本条件:将嘴巴大小的描述添加到原始提示词中,例如在原始提示词后加上“with a small mouth”。这样,模型会学习到文本提示与嘴巴大小的关联。 b. 数值条件:如果使用数值标注,可以将数值作为额外的条件输入。这需要修改模型以接受数值条件(例如,通过将数值投影为嵌入向量并与文本嵌入拼接)。 6. 推理:在生成图像时,通过在提示词中指定嘴巴大小(如“a person with a small mouth”)来控制生成效果。 7. 模型保存与加载:训练完成后,将LoRA权重保存为Hugging Face格式(adapter_model.bin和adapter_config.json),便于后续使用。在推理时,可以加载基础Stable Diffusion模型并插入LoRA权重。 8. 评估:使用人工评估或计算生成图像的嘴巴区域与目标大小的相似度(例如,通过人脸关键点检测模型提取嘴巴宽度并比较)。 考虑到用户引用的实战技巧,我们可以在模型保存和加载部分强调封装为Hugging Face格式的好处,并说明如何使用自定义模型进行推理。 下面我们将按照这些步骤详细展开。 </think> ### 使用Stable Diffusion微调LoRA模型训练控制嘴巴大小的方法 #### 1. **数据准备** - **图像收集**:创建包含多样化嘴巴大小的图像数据集(500-1000张) - **标注方案**: - 使用`LabelImg`等工具标注嘴巴关键点 - 定义量化指标: - 嘴巴开合度:$A = \frac{h_{\text{mouth}}}{h_{\text{face}}}$ - 嘴巴宽度比:$W = \frac{w_{\text{mouth}}}{w_{\text{face}}}$ - **提示词工程**: ```python # 示例提示词模板 prompt_template = "portrait, {expression}, mouth_size: {size_label}" size_labels = ["closed", "slightly_open", "wide_open"] ``` #### 2. **环境配置** ```bash # 安装核心库 pip install diffusers==0.21.4 transformers==4.34.1 accelerate==0.24.1 peft==0.6.2 ``` #### 3. **LoRA微调配置** ```python from peft import LoraConfig lora_config = LoraConfig( r=8, # 秩参数,控制模型复杂度 lora_alpha=32, target_modules=["to_k", "to_v"], # 目标注意力层 lora_dropout=0.05, bias="lora_only", modules_to_save=["mouth_encoder"] # 自定义嘴部编码器 ) ``` #### 4. **模型架构修改** ```python # 添加嘴部条件编码器 class MouthConditionEncoder(nn.Module): def __init__(self, input_dim=2, embed_dim=768): super().__init__() self.fc = nn.Sequential( nn.Linear(input_dim, embed_dim//4), nn.ReLU(), nn.Linear(embed_dim//4, embed_dim) ) def forward(self, mouth_params): return self.fc(mouth_params) # 输入为[A, W]向量 # 在UNet中注入条件 unet.mouth_encoder = MouthConditionEncoder() ``` #### 5. **训练流程** ```python from diffusers import DDPMScheduler # 数据加载 dataset = CustomMouthDataset(image_dir, annotation_file) dataloader = DataLoader(dataset, batch_size=4) # 训练循环 for epoch in range(100): for batch in dataloader: # 获取嘴部参数 mouth_params = batch["mouth_params"] # 形状[batch_size, 2] # 添加噪声 noise = torch.randn_like(images) timesteps = torch.randint(0, 1000, (batch_size,)) noisy_images = scheduler.add_noise(images, noise, timesteps) # 前向传播 mouth_emb = unet.mouth_encoder(mouth_params) noise_pred = unet(noisy_images, timesteps, encoder_hidden_states=text_emb, added_cond_embeddings=mouth_emb).sample # 损失计算 loss = F.mse_loss(noise_pred, noise) loss.backward() optimizer.step() ``` #### 6. **推理控制** ```python # 生成时指定嘴部参数 mouth_params = torch.tensor([0.3, 0.5]) # [开合度, 宽度比] # 创建mouth_emb mouth_emb = trained_unet.mouth_encoder(mouth_params.unsqueeze(0)) # 生成图像 image = pipeline( prompt="a smiling person", added_cond_embeddings=mouth_emb, unet=trained_unet ).images[0] ``` #### 7. **模型部署优化** - 将训练好的LoRA权重封装为Hugging Face格式: ```bash python convert_peft_to_hf.py --lora_path mouth_lora --output_dir hf_mouth_lora ``` - 使用私有模型推理: ```bash lama-cleaner --model hf_mouth_lora --mouth_params 0.4,0.6 ``` #### 8. **效果评估指标** - **嘴部对齐度**:$\text{Align} = 1 - \frac{|A_{\text{pred}} - A_{\text{gt}}|}{A_{\text{gt}}}$ - **关键点距离**:$\text{KPD} = \frac{1}{N}\sum_{i=1}^N ||p_i^{\text{pred}} - p_i^{\text{gt}}||_2$ - **用户偏好评分**:通过人工评估(1-5分) > 关键提示:将嘴部参数作为连续条件输入可获得更精细的控制效果[^1]。建议初始训练使用$r=4$的较低秩值,逐步增加复杂度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值