Datawhale X 魔塔 AI夏令营 AIGC方向Task1

打印 上一主题 下一主题

主题 1025|帖子 1025|积分 3075

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
小白学习条记,如有错误请各位大佬指正
一、跑通baseline教程

Datawhale 教程链接Datawhale
二、baseline代码分析

1.安装库

  1. !pip install simple-aesthetics-predictor
  2. !pip install -v -e data-juicer  #用于数据处理的工具包
  3. !pip uninstall pytorch-lightning -y #移除之前安装的pytorch-lightning包
  4. !pip install peft lightning pandas torchvision  #用于机器学习和数据处理
  5. !pip install -e DiffSynth-Studio
复制代码
2.下载数据集

  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. )  #用于后续的数据处理
  8. #保存数据集中的图片及元数据
  9. import json, os #用于处理文件和目录操作
  10. from data_juicer.utils.mm_utils import SpecialTokens
  11. from tqdm import tqdm  #显示循环进度条
  12. os.makedirs("./data/lora_dataset/train", exist_ok=True) #创建保存图像的目录
  13. os.makedirs("./data/data-juicer/input", exist_ok=True) #创建保存元数据的目录
  14. with open("./data/data-juicer/input/metadata.jsonl", "w") as f: #打开文件metadata.jsonl以写入模式,保存元数据
  15.     for data_id, data in enumerate(tqdm(ds)): #显示进度条
  16.         image = data["image"].convert("RGB") #将图像转换为RGB模式
  17.         image.save(f"/mnt/workspace/kolors/data/lora_dataset/train/{data_id}.jpg") #将图像保存到指定路径
  18.         metadata = {"text": "二次元", "image": [f"/mnt/workspace/kolors/data/lora_dataset/train/{data_id}.jpg"]}  #创建一个包含文本描述和图像路径的字典
  19.         f.write(json.dumps(metadata)) #将元数据字典转换为JSON格式并写入文件
  20.         f.write("\n") #在文件中写入换行符
复制代码
3.利用 data-juicer 处理数据

  1. data_juicer_config =
  2. """
  3. # global parameters
  4. project_name: 'data-process' 项目名称
  5. dataset_path: './data/data-juicer/input/metadata.jsonl'  # path to your dataset directory or file  数据集路径
  6. np: 4  # number of subprocess to process your dataset  使用的子进程数量
  7. text_keys: 'text'
  8. image_key: 'image'
  9. image_special_token: '<__dj__image>' 关键字配置
  10. export_path: './data/data-juicer/output/result.jsonl' 结果导出路径
  11. # process schedule
  12. # a list of several process operators with their arguments
  13. process:
  14.     - image_shape_filter: 图像尺寸过滤
  15.         min_width: 1024
  16.         min_height: 1024
  17.         any_or_all: any
  18.     - image_aspect_ratio_filter: 图像长宽比过滤
  19.         min_ratio: 0.5
  20.         max_ratio: 2.0
  21.         any_or_all: any
  22. """
  23. with open("data/data-juicer/data_juicer_config.yaml", "w") as file:
  24.     file.write(data_juicer_config.strip()) #写入data_juicer_config.yaml文件
  25. !dj-process --config data/data-juicer/data_juicer_config.yaml #进行数据处理
  26. #保存处理好的数据
  27. import pandas as pd
  28. import os, json
  29. from PIL import Image
  30. from tqdm import tqdm #导入需要用到的库
  31. texts, file_names = [], []
  32. os.makedirs("./data/lora_dataset_processed/train", exist_ok=True) #创建保存处理后图像的目录
  33. with open("./data/data-juicer/output/result.jsonl", "r") as file:  #读取处理后的结果文件
  34.     for data_id, data in enumerate(tqdm(file.readlines())): #提取每条记录中的text和image路径,保存图像到指定目录,并记录图像文件名
  35.         data = json.loads(data)
  36.         text = data["text"]
  37.         texts.append(text)
  38.         image = Image.open(data["image"][0])
  39.         image_path = f"./data/lora_dataset_processed/train/{data_id}.jpg"
  40.         image.save(image_path)
  41.         file_names.append(f"{data_id}.jpg")
  42. data_frame = pd.DataFrame() #创建一个pandas数据框,包含图像文件名和文本描述
  43. data_frame["file_name"] = file_names
  44. data_frame["text"] = texts
  45. data_frame.to_csv("./data/lora_dataset_processed/train/metadata.csv", index=False, encoding="utf-8-sig")  #将数据框保存为CSV文件
  46. data_frame
复制代码
4.训练模子

  1. #下载模型
  2. from diffsynth import download_models
  3. download_models(["Kolors", "SDXL-vae-fp16-fix"]) #导入函数,调用模型
  4. #查看训练脚本的输入参数
  5. !python DiffSynth-Studio/examples/train/kolors/train_kolors_lora.py -h
  6. #开始训练
  7. import os
  8. cmd =
  9. """
  10. python DiffSynth-Studio/examples/train/kolors/train_kolors_lora.py \
  11.   --pretrained_unet_path models/kolors/Kolors/unet/diffusion_pytorch_model.safetensors \ 指定预训练的U-Net模型路径
  12.   --pretrained_text_encoder_path  models/kolors/Kolors/text_encoder \指定预训练的文本编码器路径
  13.   --pretrained_fp16_vae_path  models/sdxl-vae-fp16-fix/diffusion_pytorch_model.safetensors \ 指定预训练的VAE模型路径
  14.   --lora_rank 16 \
  15.   --lora_alpha 4.0 \ 配置lora模型的超参数
  16.   --dataset_path data/lora_dataset_processed \ 指定数据集路径
  17.   --output_path ./models \ 指定训练后的模型保存路径
  18.   --max_epochs 1 \ 指定训练的最大轮次
  19.   --center_crop \ 在图像预处理阶段应用中心裁剪
  20.   --use_gradient_checkpointing \ 启用梯度检查点以减少内存使用
  21.   --precision "16-mixed" 设置训练的精度为16-bit混合精度
  22. """.strip() #定义了一个命令行字符串 cmd,用于启动训练脚本
  23. os.system(cmd)
  24. #加载模型
  25. from diffsynth import ModelManager, SDXLImagePipeline
  26. from peft import LoraConfig, inject_adapter_in_model
  27. import torch  #导入函数
  28. def load_lora(model, lora_rank, lora_alpha, lora_path): #用于加载lora模型
  29.     lora_config = LoraConfig(
  30.         r=lora_rank,
  31.         lora_alpha=lora_alpha,
  32.         init_lora_weights="gaussian",
  33.         target_modules=["to_q", "to_k", "to_v", "to_out"],
  34.     ) #配置lora参数
  35.     model = inject_adapter_in_model(lora_config, model) 将lora配置注入到原始模型中
  36.     state_dict = torch.load(lora_path, map_location="cpu")
  37.     model.load_state_dict(state_dict, strict=False)
  38.     return model
  39. # Load models
  40. model_manager = ModelManager(torch_dtype=torch.float16, device="cuda",
  41.                              file_path_list=[
  42.                                  "models/kolors/Kolors/text_encoder",
  43.                                  "models/kolors/Kolors/unet/diffusion_pytorch_model.safetensors",
  44.                                  "models/kolors/Kolors/vae/diffusion_pytorch_model.safetensors"
  45.                              ])  #加载预训练模型
  46. pipe = SDXLImagePipeline.from_model_manager(model_manager) #创建图像处理管道
  47. # Load LoRA
  48. pipe.unet = load_lora(
  49.     pipe.unet,
  50.     lora_rank=16, # This parameter should be consistent with that in your training script.
  51.     lora_alpha=2.0, # lora_alpha can control the weight of LoRA.
  52.     lora_path="models/lightning_logs/version_0/checkpoints/epoch=0-step=500.ckpt"
  53. )  #应用模型
复制代码
5.生成图像

  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")
  9. torch.manual_seed(1)
  10. image = pipe(
  11.     prompt="二次元,日系动漫,演唱会的观众席,人山人海,一个紫色短发小女孩穿着粉色吊带漏肩连衣裙坐在演唱会的观众席,舞台上衣着华丽的歌星们在唱歌",
  12.     negative_prompt="丑陋、变形、嘈杂、模糊、低对比度",
  13.     cfg_scale=4,
  14.     num_inference_steps=50, height=1024, width=1024,
  15. )
  16. image.save("2.jpg")
  17. torch.manual_seed(2)
  18. image = pipe(
  19.     prompt="二次元,一个紫色短发小女孩穿着粉色吊带漏肩连衣裙坐在演唱会的观众席,露出憧憬的神情",
  20.     negative_prompt="丑陋、变形、嘈杂、模糊、低对比度,色情擦边",
  21.     cfg_scale=4,
  22.     num_inference_steps=50, height=1024, width=1024,
  23. )
  24. image.save("3.jpg")
  25. torch.manual_seed(5)
  26. image = pipe(
  27.     prompt="二次元,一个紫色短发小女孩穿着粉色吊带漏肩连衣裙,对着流星许愿,闭着眼睛,十指交叉,侧面",
  28.     negative_prompt="丑陋、变形、嘈杂、模糊、低对比度,扭曲的手指,多余的手指",
  29.     cfg_scale=4,
  30.     num_inference_steps=50, height=1024, width=1024,
  31. )
  32. image.save("4.jpg")
  33. torch.manual_seed(0)
  34. image = pipe(
  35.     prompt="二次元,一个紫色中等长度头发小女孩穿着粉色吊带漏肩连衣裙,在练习室练习唱歌",
  36.     negative_prompt="丑陋、变形、嘈杂、模糊、低对比度",
  37.     cfg_scale=4,
  38.     num_inference_steps=50, height=1024, width=1024,
  39. )
  40. image.save("5.jpg")
  41. torch.manual_seed(1)
  42. image = pipe(
  43.     prompt="二次元,一个紫色长发小女孩穿着粉色吊带漏肩连衣裙,在练习室练习唱歌,手持话筒",
  44.     negative_prompt="丑陋、变形、嘈杂、模糊、低对比度",
  45.     cfg_scale=4,
  46.     num_inference_steps=50, height=1024, width=1024,
  47. )
  48. image.save("6.jpg")
  49. torch.manual_seed(7)
  50. image = pipe(
  51.     prompt="二次元,紫色长发少女,穿着黑色连衣裙,试衣间,心情忐忑",
  52.     negative_prompt="丑陋、变形、嘈杂、模糊、低对比度",
  53.     cfg_scale=4,
  54.     num_inference_steps=50, height=1024, width=1024,
  55. )
  56. image.save("7.jpg")
  57. torch.manual_seed(0)
  58. image = pipe(
  59.     prompt="二次元,紫色长发少女,穿着黑色礼服,连衣裙,在台上唱歌",
  60.     negative_prompt="丑陋、变形、嘈杂、模糊、低对比度",
  61.     cfg_scale=4,
  62.     num_inference_steps=50, height=1024, width=1024,
  63. )
  64. image.save("8.jpg")
  65. import numpy as np
  66. from PIL import Image #导入处理图像和数组的库
  67. images = [np.array(Image.open(f"{i}.jpg")) for i in range(1, 9)] #读取生成的图像文件,并将它们转换为 NumPy 数组
  68. image = np.concatenate([
  69.     np.concatenate(images[0:2], axis=1),
  70.     np.concatenate(images[2:4], axis=1),
  71.     np.concatenate(images[4:6], axis=1),
  72.     np.concatenate(images[6:8], axis=1),
  73. ], axis=0)  #拼接成一个大图像
  74. image = Image.fromarray(image).resize((1024, 2048)) #将拼接后的图像数组转换回 PIL 图像对象,并调整图像大小
  75. image
复制代码
提示:
(1)在训练下令中填入 --modelscope_model_id xxxxx 以及 --modelscope_access_token xxxxx 后,训练步伐会在竣事时自动上传模子到 ModelScope
(2)部分参数可根据现实需求调整,比方 lora_rank 可以控制 LoRA 模子的参数目
(3)prompt为图像中包罗的因素,negative_prompt为图像中不包罗的内容。
6.图像展示



三、相关知识点补充

1.LoRA

       Stable Diffusion中的Lora(LoRA)模子是一种轻量级的微调方法,它代表了“Low-Rank Adaptation”,即低秩顺应。Lora不是指单一的详细模子,而是指一类通过特定微调技术应用于底子模子的扩展应用。在Stable Diffusion这一文本到图像合成模子的框架下,Lora被用来对预训练好的大模子举行针对性优化,以实现对特定主题、风格或任务的精致化控制。
      LoRA(Low-Rank Adaptation)本质上是对特征矩阵举行低秩分解的一种近似数值分解技术,可以大幅降低特征矩阵的参数目,但是会伴随着一定的有损压缩。从传统深度学习期间走来的读者,可以发现其实LoRA本质上是基于Stable Diffusion的一种轻量化技术。
2.ComfyUI

       ComfyUI 是一个工作流工具,重要用于简化和优化 AI 模子的设置和训练过程。通过直观的界面和集成的功能,用户可以轻松地举行模子微调、数据预处理、图像生成等任务,从而进步工作效率和生成效果。
3.参考图控制

ControlNet是一种用于精确控制图像生成过程的技术组件。它是一个附加到预训练的扩散模子(如Stable Diffusion模子)上的可训练神经网络模块。扩散模子通常用于从随机噪声逐渐生成图像的过程,而ControlNet的作用在于引入额外的控制信号,使得用户能够更详细地引导图像生成的各个方面(如姿势关键点、分割图、深度图、颜色等)。
参考图控制类型
简介
OpenPose姿势控制

输入是一张姿势图片(大概利用真人图片提取姿势)作为AI绘画的参考图,输入prompt后,之后AI就可以依据此生成一副相同姿势的图片;
Canny精准绘制
输入是一张线稿图作为AI绘画的参考图,输入prompt后,之后AI就可以根据此生成一幅根据线稿的精准绘制。
Hed绘制

Hed是一种可以获取渐变线条的线稿图控制方式,相比canny更加的灵活。
深度图Midas
输入是一张深度图,输入prompt后,之后AI就可以根据此生成一幅根据深度图的绘制。
颜色color控制
通过参考图控制和颜色控制,实现更加精准和个性化的图像生成效果。

4.提示词

       写法:主体\(形貌1, 形貌2, 形貌3\)
       有些教程中提到大括号 { } 表现增长 1.01 权重,ComfyUI 文档中说明大括号的作用为动态提示,并非增长权重。
        可以同时利用多个括号,用几个括号就代表几个底子权重值相乘:
 (keyword): 1.1
 ((keyword)): 1.21
(((keyword))): 1.331
5.文本到图像Stable Diffusion

       Stable Diffusion是一种潜在的扩散模子,可以从文本中生成AI图像。 它不是在高维图像空间中操作,而是首先将图像压缩到潜空间中。Stable Diffusion是一个文本到图像的生成模子。给它一个文本指令作为输入,它将返回给你一张与输入指令匹配的图像。



参考
1.Datawhale AI夏令营教程Datawhale
2.知乎文章https://zhuanlan.zhihu.com/p/639229126
3.知乎文章https://zhuanlan.zhihu.com/p/687923903
4.How does Stable Diffusion work?


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

老婆出轨

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表