资讯动态

[特殊字符] Diffusers Textual Inversion 推理实战:用预训练概念 Embedding 定制 Stable Diffusion 生成

发布时间:2026/9/11 21:11:46 来源:尧图企业网站定制
Diffusers Textual Inversion 推理实战用预训练概念 Embedding 定制 Stable Diffusion 生成【免费下载链接】diffusers Diffusers: State-of-the-art diffusion models for image, video, and audio generation in PyTorch.项目地址: https://gitcode.com/GitHub_Trending/di/diffusersTextual Inversion文本反转是一种仅凭 35 张示例图片即可为 Stable Diffusion 类模型注入新概念的轻量级微调技术其全部成果只是一个几 KB 的词嵌入word embedding。本文以 Diffusers 仓库中的 韩文官方指南docs/source/ko/using-diffusers/textual_inversion_inference.md为主线讲解如何加载社区预训练概念如sd-concepts-library/cat-toy并通过占位 token如cat-toy完成定制化文生图推理同时结合 TextualInversionLoaderMixin 源码 与仓库测试用例深入说明其底层加载原理、参数含义与最佳实践。读完本文你将能够独立完成加载概念 → 构造提示词 → 调参生成 → 可视化结果的完整推理流程并理解如何加载负向 embedding 提升画质。Textual Inversion 是什么Textual Inversion 的核心思路是在冻结整个扩散模型U-Net、VAE、文本编码器的前提下只针对文本编码器的词嵌入矩阵做微调。用 35 张描述同一概念的图片例如某个玩偶、某种画风学习一个与该概念绑定的特殊 token如cat-toy、sks对应的嵌入向量。之后在提示词中写下这个 token就能触发模型生成包含该概念的新图像。这种方案有两个显著特点权重极小最终产物只有几 KB 的嵌入向量易于分享与下载加载时机特殊由于它只是词嵌入必须在先通过DiffusionPipeline.from_pretrained加载完整模型之后再调用TextualInversionLoaderMixin.load_textual_inversion将嵌入注入文本编码器。社区已经把大量训练好的概念收集在 Stable Diffusion Conceptualizer 概念库中韩文指南中直接以该库中的sd-concepts-library/cat-toy作为示例无需自行训练即可体验。准备工作登录、导入依赖与可视化辅助函数登录 Hugging Face部分概念库以及部分需要鉴权的模型仓库需要先登录 Hugging Face 账号韩文指南中的登录方式如下from huggingface_hub import notebook_login notebook_login()在脚本环境中也可以改用huggingface-cli login写入本地凭证存放在~/.huggingfaceload_textual_inversion内部会通过hf_token参数自动读取。导入依赖import os import torch import PIL from PIL import Image from diffusers import StableDiffusionPipeline from transformers import CLIPImageProcessor, CLIPTextModel, CLIPTokenizer说明示例中导入的CLIPImageProcessor、CLIPTextModel、CLIPTokenizer用于展示文本编码器与分词器的类型来源实际最小化推理并不强制手动使用它们——StableDiffusionPipeline.from_pretrained会自行装配好内部的 tokenizer 与 text encoder。若环境内存有限可先import os; os.environ[HF_HUB_DISABLE_SYMLINKS_WARNING] 1抑制软链接告警非必需。定义image_grid可视化函数为了把多张生成结果拼成网格统一查看韩文指南提供了一个小巧的辅助函数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该函数要求图片数量恰好等于rows * cols因此生成时需保证num_rows * num_samples张图片同时产生。选择预训练模型与概念韩文指南的核心示例使用了两个标识pretrained_model_name_or_path stable-diffusion-v1-5/stable-diffusion-v1-5 repo_id_embeds sd-concepts-library/cat-toypretrained_model_name_or_path基础扩散模型这里是 Stable Diffusion v1.5repo_id_embeds概念库仓库 ID仓库内通常包含learned_embeds.safetensors或.bin权重文件。概念库中的每个仓库都对应一个概念与专属 token如cat-toy。也可以从本地路径加载概念权重例如./my_text_inversion_directory/目录或单个.pt文件。加载 Pipeline 并注入概念pipeline StableDiffusionPipeline.from_pretrained(pretrained_model_name_or_path, torch_dtypetorch.float16).to(cuda) pipeline.load_textual_inversion(repo_id_embeds)两点值得注意原文档写作dtypetorch.float16实际参数名应为torch_dtypetorch.float16两者在较新版本中均有兼容处理但推荐使用标准的torch_dtype。.to(cuda)也可替换为mpsApple Silicon、xpu或cpu视运行环境而定。从源码看load_textual_inversion的加载流程TextualInversionLoaderMixin.load_textual_inversion 的内部流程对应源码注释中的 17 步如下确定目标组件从 pipeline 自身上取tokenizer与text_encoder也允许显式传入SDXL 双文本编码器场景必须显式指定归一化输入将字符串包装成列表若未显式指定token则从权重文件内部读取 token校验输入_check_text_inv_inputs要求 pipeline 必须包含 tokenizer 与 text_encoder且多概念加载时tokens与模型列表长度一致、无重复加载权重字典通过load_textual_inversion_state_dicts下载/读取权重文件默认优先尝试learned_embeds.safetensors失败后回退到learned_embeds.bin解析 token 与嵌入_retrieve_tokens_and_embeddings同时兼容三种权重格式——Diffusers 格式单键 state dict、Automatic1111 格式含string_to_param键、裸 PyTorch 张量需显式token扩展多向量 token_extend_tokens_and_embeddings会把多向量嵌入自动拆分为token、token_1、token_2…… 多个 token注入文本编码器先校验嵌入维度与text_encoder输入维度一致再调用resize_token_embeddings扩大嵌入矩阵、tokenizer.add_tokens(token)注册新 token最后把嵌入写入对应行。源码中还贴心处理了加速器钩子enable_model_cpu_offload/enable_sequential_cpu_offload的情况注入前会临时移除CpuOffload/AlignDevicesHook钩子加载完成后再恢复保证显存卸载模式下也能安全加载。仓库测试 test_stable_diffusion.py 中就有with_model_cpu_offload与with_sequential_cpu_offload两个变体专门验证这一行为。构造提示词并生成图像加载完成后在提示词中直接使用占位 tokenprompt a grafitti in a favela wall with a cat-toy on it num_samples 2 num_rows 2随后循环调用 pipeline收集全部图片并拼成网格all_images [] for _ in range(num_rows): images pipeline( prompt, num_images_per_promptnum_samples, num_inference_steps50, guidance_scale7.5, ).images all_images.extend(images) grid image_grid(all_images, num_samples, num_rows) grid核心生成参数解读韩文指南特别提示读者自由调整以下参数观察对画质的影响参数示例值作用num_inference_steps50去噪步数。步数越多细节越充分但耗时越长低步数如 2030配合优秀调度器仍可出图guidance_scale7.5无分类器引导强度。值越大越贴近提示词但过大会导致过饱和、伪影num_images_per_prompt2每次调用生成几张图用于横向对比同一提示词的不同采样结果文本编码器在注入新 token 后分词器会把cat-toy解析为新增的 token id并在编码时替换为对应的学习嵌入从而引导 U-Net 生成带有该概念的图像。整个推理链路与普通 Stable Diffusion 完全一致因此num_inference_steps、guidance_scale等参数的调参经验同样适用。进阶加载负向 Embedding 提升画质除了正向概念Textual Inversion 还可以学习负向嵌入negative embedding用于把模糊丑陋等不希望出现的特征从生成结果中推开常见实现如 EasyNegative。英文版指南 textual_inversion_inference.md 给出了完整示例import torch from diffusers import AutoPipelineForText2Image pipeline AutoPipelineForText2Image.from_pretrained( stable-diffusion-v1-5/stable-diffusion-v1-5, torch_dtypetorch.float16 ).to(cuda) pipeline.load_textual_inversion( EvilEngine/easynegative, weight_nameeasynegative.safetensors, tokeneasynegative ) prompt A cute brown bear eating a slice of pizza, stunning color scheme, masterpiece, illustration negative_prompt easynegative pipeline(prompt, negative_prompt).images[0]注意这里显式传入了两个关键参数weight_name指定仓库内的权重文件名默认learned_embeds.safetensors自定义文件名时必须指定token为权重指定或覆盖触发 token本例为easynegative。随后将easynegative放入negative_prompt即可在生成时抑制对应特征。由于本次加载的模型同时存在多个概念 token新加载的 token 会直接追加到现有词汇表之后互不覆盖可以在一个 pipeline 中同时叠加多个正向与负向概念。深入多向量 Embedding、本地权重与多概念加载多向量概念自动展开某些概念权重保存为(n, embed_dim)的多向量嵌入。load_textual_inversion会将其自动拆分为token、token_1、token_2…… 并全部注册进 tokenizer推理时maybe_convert_prompt源码会把提示词中的token自动展开为完整序列用户无需手动书写带下标的 token。支持本地权重与多种格式pretrained_model_name_or_path可以是Hub 仓库 ID如sd-concepts-library/cat-toy本地目录路径本地单文件路径如./charturnerv2.pt直接传入 torch state dict 或张量。格式上兼容Diffusers 格式与Automatic1111 格式后者 state dict 含string_to_param键社区大量.pt概念文件无需转换即可加载。从源码可以推断文件扩展名.safetensors/.bin/.pt决定了默认的解析分支因此使用非默认文件名时务必配合weight_name。多概念与卸载load_textual_inversion支持一次传入概念列表长度需与tokens一致批量加载多个概念。若需要清理已加载的概念可调用unload_textual_inversion不传tokens时卸载全部概念传入 token 列表时精确卸载指定概念且同时支持 SDXL 的双 tokenizer / 双文本编码器场景分别对text_encoder/text_encoder_2操作。验证与延伸学习仓库测试 test_stable_diffusion.py 覆盖了 Diffusers 格式 Automatic1111 格式 负向嵌入 CPU offload 组合场景可作为加载是否正确的回归参照想从零训练自己的概念可参考训练脚本 examples/textual_inversion/textual_inversion.py 及其 READMESDXL 版本见 textual_inversion_sdxl.py训练完成后产出的learned_embeds.safetensors即可用本文所述流程加载推理更底层的加载细节与完整参数说明cache_dir、force_download、local_files_only、hf_token、revision、subfolder、mirror等见 TextualInversionLoaderMixin 源码 的 docstring。至此你已经掌握 Textual Inversion 从加载到调参推理的完整链路选择基础模型与概念库 →from_pretrainedload_textual_inversion注入嵌入 → 用占位 token 构造提示词 → 调整num_inference_steps、guidance_scale等参数 → 可视化网格对比。利用社区概念库与负向 embedding无需任何训练即可大幅扩展模型的风格与题材控制能力。【免费下载链接】diffusers Diffusers: State-of-the-art diffusion models for image, video, and audio generation in PyTorch.项目地址: https://gitcode.com/GitHub_Trending/di/diffusers创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价