当前位置:   article > 正文

Datawhale AI夏令营第四期 Task1 :从零入门AI生图原理&实践

Datawhale AI夏令营第四期 Task1 :从零入门AI生图原理&实践

相信大家对文生图多多少少有所了解,简单的说,就是你使用文本描述一个画面,这段文本我们称为提示词(prompt),将prompt输入到模型中,模型可以生成一张与文本描述相关的图片。下面我将展示文生图模型lora微调的步骤和结果,并在末尾介绍一些进阶知识。

Baseline 流程

开通阿里云PAI-DSW试用

  1. 链接:阿里云免费试用 - 阿里云

  2. 交互式建模 PAI-DSW 立即试用


魔塔关联阿里云

  1. 魔搭社区链接

  2. 关联阿里云

运行 Baseline 代码

  1. 克隆代码仓库
    1. git lfs install
    2. git clone https://www.modelscope.cn/datasets/maochase/kolors.git

  2. 安装依赖库

     
  3. 重启执行所有代码块
  4. 图片结果
生成的图片

上传模型到魔塔

  1. 移动结果文件
    1. # 创建目录
    2. mkdir /mnt/workspace/kolors/output & cd
    3. # 复制模型权重文件到创建的目录
    4. cp /mnt/workspace/kolors/models/lightning_logs/version_0/checkpoints/epoch\=0-step\=500.ckpt /mnt/workspace/kolors/output/
    5. # 复制一张生成的图片到创建的目录,后用作模型封面
    6. cp /mnt/workspace/kolors/1.jpg /mnt/workspace/kolors/output/
  2. 下载结果文件
    下载模型和图片文件到本地
  3. 上传模型,魔搭模型上传链接

关闭PAI实例!!(节省费用)

PAI实例链接

进阶知识

零代码文生图Lora模型训练

  1. 魔搭模型训练链接
  2. 设置信息开始训练


    之后便会得到一个训练好的lora模型。

魔塔热门文生图AI应用

我使用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

Baseline 代码结构

导入库

  1. Data-Juicer
    提供数据处理流水线:定义重复执行的数据清理、数据增强等操作。
    高效的实验管理:方便设置多组参数自动化执行实验,并记录实验结果。
  2. DiffSynth-Studio
    Diffusion engine:支持多种diffusion models,微调训练大模型的工具。

数据集构建

  1. 加载数据集
    1. from modelscope.msdatasets import MsDataset
    2. ds = MsDataset.load(
    3. 'AI-ModelScope/lowres_anime',
    4. subset_name='default',
    5. split='train',
    6. cache_dir="/mnt/workspace/kolors/data"
    7. )
  2. 数据集查看链接
    数据集由两个字段:image和text
  3. 保存数据
    1. import json, os
    2. from data_juicer.utils.mm_utils import SpecialTokens
    3. from tqdm import tqdm
    4. os.makedirs("./data/lora_dataset/train", exist_ok=True)
    5. os.makedirs("./data/data-juicer/input", exist_ok=True)
    6. with open("./data/data-juicer/input/metadata.jsonl", "w") as f:
    7. for data_id, data in enumerate(tqdm(ds)):
    8. image = data["image"].convert("RGB")
    9. image.save(f"/mnt/workspace/kolors/data/lora_dataset/train/{data_id}.jpg")
    10. metadata = {"text": "二次元", "image": [f"/mnt/workspace/kolors/data/lora_dataset/train/{data_id}.jpg"]}
    11. f.write(json.dumps(metadata))
    12. f.write("\n")
  4. 处理数据
    处理配置中process定义了只保留高度或宽度大于1024的图片,过滤掉分辨率过小的图片,并且过滤掉宽高比不在0.5道2.0范围内的图片。
    1. data_juicer_config = """
    2. # global parameters
    3. project_name: 'data-process'
    4. dataset_path: './data/data-juicer/input/metadata.jsonl' # path to your dataset directory or file
    5. np: 4 # number of subprocess to process your dataset
    6. text_keys: 'text'
    7. image_key: 'image'
    8. image_special_token: '<__dj__image>'
    9. export_path: './data/data-juicer/output/result.jsonl'
    10. # process schedule
    11. # a list of several process operators with their arguments
    12. process:
    13. - image_shape_filter:
    14. min_width: 1024
    15. min_height: 1024
    16. any_or_all: any
    17. - image_aspect_ratio_filter:
    18. min_ratio: 0.5
    19. max_ratio: 2.0
    20. any_or_all: any
    21. """
    22. with open("data/data-juicer/data_juicer_config.yaml", "w") as file:
    23. file.write(data_juicer_config.strip())
    24. !dj-process --config data/data-juicer/data_juicer_config.yaml

模型微调

  1. 下载模型
    下载Kolors可图基础模型和SDXL-vae-fp16-fix VAE模型
    1. from diffsynth import download_models
    2. download_models(["Kolors", "SDXL-vae-fp16-fix"])
  2. 开始训练
    1. import os
    2. cmd = """
    3. python DiffSynth-Studio/examples/train/kolors/train_kolors_lora.py \
    4. --pretrained_unet_path models/kolors/Kolors/unet/diffusion_pytorch_model.safetensors \
    5. --pretrained_text_encoder_path models/kolors/Kolors/text_encoder \
    6. --pretrained_fp16_vae_path models/sdxl-vae-fp16-fix/diffusion_pytorch_model.safetensors \
    7. --lora_rank 16 \
    8. --lora_alpha 4.0 \
    9. --dataset_path data/lora_dataset_processed \
    10. --output_path ./models \
    11. --max_epochs 1 \
    12. --center_crop \
    13. --use_gradient_checkpointing \
    14. --precision "16-mixed"
    15. """.strip()
    16. 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 设置为混合半精度,可以加快训练速度和减少显存占用

  3. 加载模型使用训练的lora模型

    1. from diffsynth import ModelManager, SDXLImagePipeline
    2. from peft import LoraConfig, inject_adapter_in_model
    3. import torch
    4. def load_lora(model, lora_rank, lora_alpha, lora_path):
    5. lora_config = LoraConfig(
    6. r=lora_rank,
    7. lora_alpha=lora_alpha,
    8. init_lora_weights="gaussian",
    9. target_modules=["to_q", "to_k", "to_v", "to_out"],
    10. )
    11. model = inject_adapter_in_model(lora_config, model)
    12. state_dict = torch.load(lora_path, map_location="cpu")
    13. model.load_state_dict(state_dict, strict=False)
    14. return model
    15. # Load models
    16. model_manager = ModelManager(torch_dtype=torch.float16, device="cuda",
    17. file_path_list=[
    18. "models/kolors/Kolors/text_encoder",
    19. "models/kolors/Kolors/unet/diffusion_pytorch_model.safetensors",
    20. "models/kolors/Kolors/vae/diffusion_pytorch_model.safetensors"
    21. ])
    22. pipe = SDXLImagePipeline.from_model_manager(model_manager)
    23. # Load LoRA
    24. pipe.unet = load_lora(
    25. pipe.unet,
    26. lora_rank=16, # This parameter should be consistent with that in your training script.
    27. lora_alpha=2.0, # lora_alpha can control the weight of LoRA.
    28. lora_path="models/lightning_logs/version_0/checkpoints/epoch=0-step=500.ckpt"
    29. )

    load_lora 函数: 用于加载和应用 LoRA 模型。

    1. LoraConfig: 配置 LoRA 的相关参数。
      r: LoRA 的秩(rank)
      lora_alpha: 控制 LoRA 对模型的影响程度。
      init_lora_weights: 初始化 LoRA 权重,这里使用 "gaussian" 初始化。
      target_modules: 目标模块,在模型的这些模块中注入 LoRA 适配器。
    2. inject_adapter_in_model: 在目标模块中注入 LoRA 适配器。
    3. torch.load: 从指定路径加载模型的状态字典(权重)。
    4. model.load_state_dict: 将加载的权重应用到模型中。

图片生成

  1. torch.manual_seed(0)
  2. image = pipe(
  3. prompt="二次元,一个紫色短发小女孩,在家中沙发上坐着,双手托着腮,很无聊,全身,粉色连衣裙",
  4. negative_prompt="丑陋、变形、嘈杂、模糊、低对比度",
  5. cfg_scale=4,
  6. num_inference_steps=50, height=1024, width=1024,
  7. )
  8. image.save("1.jpg")
  • prompt 正向提示词,生成图片会与prompt相关
  • negative_prompt 反向提示词,生成图片会避开negative_prompt提到的
  • cfg_scale 生成的图片与提示词的相关程度,越大与提示词越相关
  • num_inference_steps 生成图片的迭代次数,步数过小生成的图片模糊或未成形
  • heightwidth指定图片的分辨率
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/988549
推荐阅读
相关标签
  

闽ICP备14008679号