Datawhale AI夏令营第四期魔搭-AIGC文生图方向Task1笔记

打印 上一主题 下一主题

主题 515|帖子 515|积分 1545

Datawhale AI夏令营第四期魔搭-AIGC文生图方向Task1笔记

   作者: 福州大学 牢记我是一个温柔的刀客
2024/8/10
  
从零入门AI生图原理&实践 是 Datawhale 2024 年 AI 夏令营第四期的学习活动(“AIGC”方向),基于魔搭社区“ 可图Kolors-LoRA风格故事挑战赛 ”开展的实践学习——


  • 适合想 入门并实践 AIGC文生图、工作流搭建、LoRA微调 的学习者参加
学习内容提要:从文生图实现方案逐渐进阶,教程偏重图像工作流、微调、图像优化等思绪,末了会简朴先容AIGC应用方向、数字人技能(选学)

1 赛题解读


2 文生图的汗青

文生图(Text-to-Image Generation)是一种通过文本天生图像的技能,其发展历程可以追溯到早期的盘算机视觉和天然语言处置处罚研究。这一技能的汗青可以分为几个关键阶段:

3 文生图底子知识先容

文生图重要以SD系列底子模型为主,以及在其底子上微调的lora模型和人物底子模型等。

接下来,我们简朴相识下提示词、lora、ComfyUI和参考图控制这些知识点。
提示词

提示词很重要,一样平常写法:主体描述,细节描述,修饰词,艺术风格,艺术家
   举个例子:
  
【promts】Beautiful and cute girl, smiling, 16 years old, denim jacket, gradient background, soft colors, soft lighting, cinematic edge lighting, light and dark contrast, anime, super detail, 8k
【负向prompts】(lowres, low quality, worst quality:1.2), (text:1.2), deformed, black and white,disfigured, low contrast, cropped, missing fingers
  Lora

Stable Diffusion中的Lora(LoRA)模型是一种轻量级的微调方法,它代表了“Low-Rank Adaptation”,即低秩适应。Lora不是指单一的具体模型,而是指一类通过特定微调技能应用于底子模型的扩展应用。在Stable Diffusion这一文本到图像合成模型的框架下,Lora被用来对预练习好的大模型举行针对性优化,以实现对特定主题、风格或任务的精致化控制。
ComfyUI

ComfyUI 是一个工作流工具,重要用于简化和优化 AI 模型的配置和练习过程。通过直观的界面和集成的功能,用户可以轻松地举行模型微调、数据预处置处罚、图像天生等任务,从而进步工作效率和天生效果。
在ComfyUI平台的前端页面上,用户可以基于节点/流程图的界面设计并执行AIGC文生图或者文生视频的pipeline。

参考图控制

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

4 baseline初体验

step0:开通阿里云PAI-DSW试用

https://free.aliyun.com/?productCode=learn
获得强盛的算力以实现机器学习!
开通免费试用

在魔搭社区举行授权
https://www.modelscope.cn/my/mynotebook/authorization

step1: 报名赛事

https://tianchi.aliyun.com/competition/entrance/532254

Step2:在魔搭社区创建PAI实例!

https://www.modelscope.cn/my/mynotebook/authorization



Step3:30 分钟体验一站式 baseline!

1.下载baseline文件约莫需要两分钟)
  1. git lfs install
  2. git clone https://www.modelscope.cn/datasets/maochase/kolors.git
复制代码

2.进入文件夹,打开baseline文件:

3.安装情况,然后重启kernel:

4.调解prompt,设置你想要的图片风格,依次修改8张图片的描述(可选)

5.依次顺序运行剩余的代码块,点击代码框左上角执行按钮,最终获得图片(约莫需要20分钟)

step4: 微调结果上传魔搭

https://www.modelscope.cn/models/create
1.移动结果文件
   创建terminal,粘贴如下下令,回车执行
  1. 1 mkdir /mnt/workspace/kolors/output & cd
  2. 2 cp /mnt/workspace/kolors/models/lightning_logs/version_0/checkpoints/epoch\=0-step\=500.ckpt /mnt/workspace/kolors/output/
  3. 3 cp /mnt/workspace/kolors/1.jpg /mnt/workspace/kolors/output/
复制代码

2.下载结果文件
   双击进入output文件夹,分别下载两个文件到当地
  

3.创建并上传模型所需内容

4.来到创空间,查察本身的模型是否发布

恭喜你,至此你已完成AIGC方向LoRA模型的微调,并成功天生了八张图片,组成一个温馨有意义的小故事,接下来,我们关注一下技能层面,即盘算机是怎样做到文生图的.

5.代码解读


1.情况安装
  1. !pip install simple-aesthetics-predictor
  2. !pip install -v -e data-juicer
  3. !pip uninstall pytorch-lightning -y
  4. !pip install peft lightning pandas torchvision
  5. !pip install -e DiffSynth-Studio
复制代码
2.下载数据集
  1. #下载数据集
  2. from modelscope.msdatasets import MsDataset
  3. ds = MsDataset.load(
  4.     'AI-ModelScope/lowres_anime',
  5.     subset_name='default',
  6.     split='train',
  7.     cache_dir="/mnt/workspace/kolors/data"
  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:
  15.     for data_id, data in enumerate(tqdm(ds)):
  16.         image = data["image"].convert("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))
  20.         f.write("\n")
复制代码
3.处置处罚数据集,生存数据处置处罚结果
  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
  25. import pandas as pd
  26. import os, json
  27. from PIL import Image
  28. from tqdm import tqdm
  29. texts, file_names = [], []
  30. os.makedirs("./data/lora_dataset_processed/train", exist_ok=True)
  31. with open("./data/data-juicer/output/result.jsonl", "r") as file:
  32.     for data_id, data in enumerate(tqdm(file.readlines())):
  33.         data = json.loads(data)
  34.         text = data["text"]
  35.         texts.append(text)
  36.         image = Image.open(data["image"][0])
  37.         image_path = f"./data/lora_dataset_processed/train/{data_id}.jpg"
  38.         image.save(image_path)
  39.         file_names.append(f"{data_id}.jpg")
  40. data_frame = pd.DataFrame()
  41. data_frame["file_name"] = file_names
  42. data_frame["text"] = texts
  43. data_frame.to_csv("./data/lora_dataset_processed/train/metadata.csv", index=False, encoding="utf-8-sig")
  44. data_frame
复制代码
4.lora微调
  1. # 下载模型
  2. from diffsynth import download_models
  3. download_models(["Kolors", "SDXL-vae-fp16-fix"])
  4. #模型训练
  5. import os
  6. cmd = """
  7. python DiffSynth-Studio/examples/train/kolors/train_kolors_lora.py \
  8.   --pretrained_unet_path models/kolors/Kolors/unet/diffusion_pytorch_model.safetensors \
  9.   --pretrained_text_encoder_path models/kolors/Kolors/text_encoder \
  10.   --pretrained_fp16_vae_path models/sdxl-vae-fp16-fix/diffusion_pytorch_model.safetensors \
  11.   --lora_rank 16 \
  12.   --lora_alpha 4.0 \
  13.   --dataset_path data/lora_dataset_processed \
  14.   --output_path ./models \
  15.   --max_epochs 1 \
  16.   --center_crop \
  17.   --use_gradient_checkpointing \
  18.   --precision "16-mixed"
  19. """.strip()
  20. os.system(cmd)
复制代码
5.加载微调好的模型
  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. )
复制代码
6.图片天生
  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")
复制代码
6.微调结果示例:

微调过程:


末了一块代码的意思是让这八块图拼成一个四行两列的小拼图:
  1. import numpy as np
  2. from PIL import Image
  3. images = [np.array(Image.open(f"{i}.jpg")) for i in range(1, 9)]
  4. image = np.concatenate([
  5.     np.concatenate(images[0:2], axis=1),
  6.     np.concatenate(images[2:4], axis=1),
  7.     np.concatenate(images[4:6], axis=1),
  8.     np.concatenate(images[6:8], axis=1),
  9. ], axis=0)
  10. image = Image.fromarray(image).resize((1024, 2048))
  11. image
复制代码
结果展示:








           感谢观看,点个关注,主页有更多人工智能干货哦~      

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

本帖子中包含更多资源

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

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

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

本版积分规则

冬雨财经

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表