文章目录
一、文生图的基础知识
1. 提示词
对目标图片的一系列描述?(我看文中的描述得出的)有正向描述词和反向提示词两种,前者是说明我们想要生成的内容,后者是表达我们不想要出现的内容。
2. LoRA
模型的一种微调方法:Low-Rank Adaptation,用于对已经训练好的模型进行更加精细的调整、优化。
3. ComfyUI
可视化工作流工具,简化和优化 AI 模型的配置和训练过程。
4. 参考图
引入额外的控制信号,使得用户能够更具体地指导图像生成的各个方面(如姿势关键点、分割图、深度图、颜色等)
类似于关键词?只是更加的确切。
二、模型代码
1. 依赖库
使用Data-Juicer
和DiffSynth-Studio
,这两个库的作用如下:
- Data-Juicer:数据处理和转换工具,旨在简化数据的提取、转换和加载过程
- DiffSynth-Studio:高效微调训练大模型工具(这个或许就是LoRA部分所需要的吧)
2. LoRA相关函数
def load_lora(model, lora_rank, lora_alpha, lora_path):
lora_config = LoraConfig(
r=lora_rank,
lora_alpha=lora_alpha,
init_lora_weights="gaussian",
target_modules=["to_q", "to_k", "to_v", "to_out"],
)
model = inject_adapter_in_model(lora_config, model)
state_dict = torch.load(lora_path, map_location="cpu")
model.load_state_dict(state_dict, strict=False)
return model
# Load LoRA
pipe.unet = load_lora(
pipe.unet,
lora_rank=16, # This parameter should be consistent with that in your training script.
lora_alpha=2.0, # lora_alpha can control the weight of LoRA.
lora_path="models/lightning_logs/version_0/checkpoints/epoch=0-step=500.ckpt"
)
这个函数用于配置LoRA适配器,并将其运用于模型,其中LoRA配置部分为:
lora_config = LoraConfig(
r=lora_rank,
lora_alpha=lora_alpha,
init_lora_weights="gaussian",
target_modules=["to_q", "to_k", "to_v", "to_out"],
)
(这段代码我知道它在配置但是我不知道它在配置什么,喂给AI了我也没太看懂),AI的解释如下:
- **LoraConfig** 是一个配置对象,定义了 LoRA 适配器的参数。
- **r**: LoRA 的秩(rank),决定了适配器的低秩矩阵的维度。
- **lora_alpha**: LoRA 的缩放因子,用于调整适配器的影响力。
- **init_lora_weights**: 初始化 LoRA 权重的方法,这里选择的是高斯初始化(“gaussian”)。
- **target_modules**: 指定模型中需要插入 LoRA 适配器的层模块。在这里,这些模块是 `"to_q"`、`"to_k"`、`"to_v"` 和 `"to_out"`,通常这些模块是 Transformer 架构中的查询、键、值以及输出投影层。
model = inject_adapter_in_model(lora_config, model)
则是将已经配置好的LoRA注入到模型中,最后将其模型计算权重加到CPU上后将配置好的模型进行返回。
3. 加载、管理模型
model_manager = ModelManager(torch_dtype=torch.float16, device="cuda",
file_path_list=[
"models/kolors/Kolors/text_encoder",
"models/kolors/Kolors/unet/diffusion_pytorch_model.safetensors",
"models/kolors/Kolors/vae/diffusion_pytorch_model.safetensors"
])
pipe = SDXLImagePipeline.from_model_manager(model_manager)
这段代码创建一个 SDXLImagePipeline 对象,用于图像生成或处理任务,它将所有配置好的模型文件全部导入到这个pipe中,以便进行后续的操作。
4. 图像生成
最后就是使用类似的代码进行图像生成了:
torch.manual_seed(0)
image = pipe(
prompt="二次元,一个金色长发女孩,在家中厨房忙碌,正在做饭,半身,白色长裙,还穿着粉色围裙",
negative_prompt="丑陋、变形、嘈杂、模糊、低对比度",
cfg_scale=4,
num_inference_steps=50, height=1024, width=1024,
)
image.save("1.jpg")
之前提到过图像生成时需要的正向/反向提示词,在此处就出现了,就是此处的prompt
和negative_prompt
,这个词应该是我们能够自己进行修改的。
三、对代码的疑惑
1. 还是不懂LoRA是如何工作、使用的,也就是不懂它的原理
2. 在导入模型的时候使用了safetensors文件,这个格式的文件我还没接触过,我对于该文件的存储内容完全不理解
四、最后
附上生成的结果图,只有图一是我修改了提示词的,我就只放这一张图吧,emm还行,挺好看: