赞
踩
相信大家对文生图多多少少有所了解,简单的说,就是你使用文本描述一个画面,这段文本我们称为提示词(prompt),将prompt输入到模型中,模型可以生成一张与文本描述相关的图片。下面我将展示文生图模型lora微调的步骤和结果,并在末尾介绍一些进阶知识。
交互式建模 PAI-DSW 立即试用
关联阿里云
- git lfs install
- git clone https://www.modelscope.cn/datasets/maochase/kolors.git
- # 创建目录
- mkdir /mnt/workspace/kolors/output & cd
- # 复制模型权重文件到创建的目录
- cp /mnt/workspace/kolors/models/lightning_logs/version_0/checkpoints/epoch\=0-step\=500.ckpt /mnt/workspace/kolors/output/
- # 复制一张生成的图片到创建的目录,后用作模型封面
- cp /mnt/workspace/kolors/1.jpg /mnt/workspace/kolors/output/
我使用FLUX、可图、SDXL使用相同的prompt分别生成了面向镜头微笑的女生。在对参数没有进行细致的调节的情况下,个人感觉可图生成的图片更加精致。
我对艺术字生成比较感兴趣,于是尝试了多组设计,得到以下较为满意的结果:
工具类型 | 应用名称 | 应用简介 | 体验效果和体验地址 |
基础图片生成工具 | FLUX文生图模型体验空间 | 该应用由阿里muse团队推出,是目前最强的开源文生图模型之一,在文字生成、复杂指令遵循和人手生成上具备优势。 | https://www.modelscope.cn/studios/muse/flux_dev |
可图文生图 | 可图是快手开源的一种名为Kolors(可图)的文本到图像生成模型,该模型具有对英语和汉语的深刻理解,并能够生成高质量、逼真的图像。 生成效果接近Midjourney-v6 水平,而且可输入长达256 tokens的文本,最重要的可以渲染中文。 | https://www.modelscope.cn/studios/AI-ModelScope/Kolors | |
Stable Diffusion XL 1.0 | 所有文生图应用的祖师爷,不必多说,YYDS。继SDXL 0.9的有限、仅供研究发布之后,SDXL的完整版本是目前最好的开源图像生成模型。 | https://www.modelscope.cn/studios/AI-ModelScope/Stable_Diffusion_XL_1.0 | |
办公提效工具 | 锦书 - 创新艺术字 | 创意艺术字生成。通过自定义的概念,对文字进行变形和纹理生成,构建富有创意的个性化字形和纹理。 七夕在即,给正在学习的大家说声:七夕节快乐!!! | https://modelscope.cn/studios/WordArt/WordArt/summary |
创意海报生成 | 做海报不求人!创意海报生成,自由设计,瞬间点亮创意生活。 咱就是说给夏令营生成一个海报,太酷了 | https://modelscope.cn/studios/iic/PosterGenius/summary |
- from modelscope.msdatasets import MsDataset
-
- ds = MsDataset.load(
- 'AI-ModelScope/lowres_anime',
- subset_name='default',
- split='train',
- cache_dir="/mnt/workspace/kolors/data"
- )
- import json, os
- from data_juicer.utils.mm_utils import SpecialTokens
- from tqdm import tqdm
-
-
- os.makedirs("./data/lora_dataset/train", exist_ok=True)
- os.makedirs("./data/data-juicer/input", exist_ok=True)
- with open("./data/data-juicer/input/metadata.jsonl", "w") as f:
- for data_id, data in enumerate(tqdm(ds)):
- image = data["image"].convert("RGB")
- image.save(f"/mnt/workspace/kolors/data/lora_dataset/train/{data_id}.jpg")
- metadata = {"text": "二次元", "image": [f"/mnt/workspace/kolors/data/lora_dataset/train/{data_id}.jpg"]}
- f.write(json.dumps(metadata))
- f.write("\n")
- data_juicer_config = """
- # global parameters
- project_name: 'data-process'
- dataset_path: './data/data-juicer/input/metadata.jsonl' # path to your dataset directory or file
- np: 4 # number of subprocess to process your dataset
- text_keys: 'text'
- image_key: 'image'
- image_special_token: '<__dj__image>'
- export_path: './data/data-juicer/output/result.jsonl'
- # process schedule
- # a list of several process operators with their arguments
- process:
- - image_shape_filter:
- min_width: 1024
- min_height: 1024
- any_or_all: any
- - image_aspect_ratio_filter:
- min_ratio: 0.5
- max_ratio: 2.0
- any_or_all: any
- """
- with open("data/data-juicer/data_juicer_config.yaml", "w") as file:
- file.write(data_juicer_config.strip())
-
- !dj-process --config data/data-juicer/data_juicer_config.yaml
- from diffsynth import download_models
-
- download_models(["Kolors", "SDXL-vae-fp16-fix"])
- import os
-
- cmd = """
- python DiffSynth-Studio/examples/train/kolors/train_kolors_lora.py \
- --pretrained_unet_path models/kolors/Kolors/unet/diffusion_pytorch_model.safetensors \
- --pretrained_text_encoder_path models/kolors/Kolors/text_encoder \
- --pretrained_fp16_vae_path models/sdxl-vae-fp16-fix/diffusion_pytorch_model.safetensors \
- --lora_rank 16 \
- --lora_alpha 4.0 \
- --dataset_path data/lora_dataset_processed \
- --output_path ./models \
- --max_epochs 1 \
- --center_crop \
- --use_gradient_checkpointing \
- --precision "16-mixed"
- """.strip()
-
- os.system(cmd)
--pretrained_unet_path和--pretrained_text_encoder_path指定基础模型unet和text_encoder位置
--pretrained_fp16_vae_path指定vae模型位置
--lora_rank和--lora_alpha指定lora微调的参数,rank越小,低秩矩阵参数越小,训练越快,但模型性能会降低;alpha平衡原始权重矩阵和低秩近似矩阵的影响,alpha越大,低秩近似矩阵对原始权重矩阵影响越大,训练可能不稳定。
--use_gradient_checkpointing 可以节省显存,但会降低训练速度
--precision 设置为混合半精度,可以加快训练速度和减少显存占用
加载模型使用训练的lora模型
- from diffsynth import ModelManager, SDXLImagePipeline
- from peft import LoraConfig, inject_adapter_in_model
- import torch
-
-
- 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 models
- 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)
-
- # 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"
- )
load_lora
函数: 用于加载和应用 LoRA 模型。
LoraConfig
: 配置 LoRA 的相关参数。r
: LoRA 的秩(rank)lora_alpha
: 控制 LoRA 对模型的影响程度。init_lora_weights
: 初始化 LoRA 权重,这里使用 "gaussian" 初始化。target_modules
: 目标模块,在模型的这些模块中注入 LoRA 适配器。inject_adapter_in_model
: 在目标模块中注入 LoRA 适配器。torch.load
: 从指定路径加载模型的状态字典(权重)。model.load_state_dict
: 将加载的权重应用到模型中。- torch.manual_seed(0)
- image = pipe(
- prompt="二次元,一个紫色短发小女孩,在家中沙发上坐着,双手托着腮,很无聊,全身,粉色连衣裙",
- negative_prompt="丑陋、变形、嘈杂、模糊、低对比度",
- cfg_scale=4,
- num_inference_steps=50, height=1024, width=1024,
- )
- image.save("1.jpg")
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。