Datawhale X 魔搭 AI夏令营 Task1
Archer_min 2024-08-26 16:01:05 阅读 52
Datawhale X 魔搭 AI夏令营 Task1
赛事解读AI文生图相关概念可图模型及微调简介魔搭零代码生图、微调工具介绍魔搭AI生图相关应用介绍
DataWhale开源组织网站主页:Datawhale
DataWhaleAI夏令营第四期AIGC方向学习手册:Docs
赛事链接:可图Kolors-LoRA风格故事挑战赛_创新应用大赛_天池大赛-阿里云天池的赛制
开通阿里云PAL-DSW免费试用
链接:https://datawhaler.feishu.cn/sync/DkaqdtRoIsuiyAbDBoPcacKUned
在魔搭社区进行授权
链接:https://www.modelscope.cn/my/mynotebook/authorization
报名赛事
赛事链接:https://tianchi.aliyun.com/competition/entrance/532254
点击报名比赛,即可报名成功
在魔搭社区创建PAL实例
链接:https://www.modelscope.cn/my/mynotebook/authorization
成功在魔塔社区创建PAI示例
体验——跑通baseline
打开实例后进入Terminal
首先下载baseline文件
<code> git lfs install
git clone https://www.modelscope.cn/datasets/maochase/kolors.git
跟着其中的教程依次运行每一段代码
也可以直接点上方箭头自动运行代码:
如下是默认的输出结果部分截图:
调整prompt提示词生成新故事
八张图对应故事如下:
1、人鱼孤独地生活在静谧的深海
2、人鱼好奇陆地,决定游到岸边停留
3、岸边有一个女孩,人鱼和女孩聊天,成为朋友,人鱼把贝壳项链送给她
4、每天清晨人鱼为女孩唱歌
5、每天傍晚女孩为人鱼讲述今天发生的新鲜事
6、女孩搬家了再也不会来海边了,人鱼孤独地等待
7、人鱼决定变成人类来到岸上去寻找女孩
8、人鱼找到了女孩并相爱
最后生成的新故事效果(第一次):
????这张属实有些惊悚了,,
前几次的生成效果八张图的人物长得各不相同,缺乏连续性,后来统一了每张图的人物基本特征,加上一致的修饰词,如白色长发人鱼,黑色长发女孩,效果有所改善
最后一次调整效果:
baseline代码结构
导入库:首先,代码导入了需要用到的库,包括 data-juicer 和微调的工具 DiffSynth-Studio数据集构建:下载数据集kolors,处理数据集模型微调:模型微调训练,以及加载训练后的模型图片生成:调用训练好的模型生成图片
代码详情
1、环境安装
安装了一系列所需的库,包括 <code>simple-aesthetics-predictor、data-juicer
、DiffSynth-Studio
,以及一些深度学习相关的工具如 pytorch-lightning
、peft
和 torchvision
。这些库提供了数据处理、模型微调和图片生成所需的功能。
!pip install simple-aesthetics-predictor
!pip install -v -e data-juicer
!pip uninstall pytorch-lightning -y
!pip install peft lightning pandas torchvision
!pip install -e DiffSynth-Studio
2、下载数据集
使用 modelscope.msdatasets
从 AI-ModelScope
下载名为 lowres_anime
的数据集,并将其保存到本地。数据集中的每张图片都会被处理成 RGB 格式,并保存到指定的路径下。每张图片还会与一个简单的文本描述(“二次元”)关联,并生成一个 JSONL 文件,包含这些元数据。
#下载数据集
from modelscope.msdatasets import MsDataset
ds = MsDataset.load(
'AI-ModelScope/lowres_anime',
subset_name='default',code>
split='train',code>
cache_dir="/mnt/workspace/kolors/data"code>
)
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")
3、处理数据集,保存数据处理结果
这一部分使用了 data-juicer
来处理下载的数据集。配置文件 data_juicer_config.yaml
指定了数据处理的全局参数和一系列过滤器操作,包括图像尺寸和长宽比的过滤。处理后的数据被保存到一个新的 JSONL 文件中,并转换为适合模型训练的数据格式。最终结果以 CSV 文件的形式保存,包含图像文件名及其对应的文本描述。
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
import pandas as pd
import os, json
from PIL import Image
from tqdm import tqdm
texts, file_names = [], []
os.makedirs("./data/lora_dataset_processed/train", exist_ok=True)
with open("./data/data-juicer/output/result.jsonl", "r") as file:
for data_id, data in enumerate(tqdm(file.readlines())):
data = json.loads(data)
text = data["text"]
texts.append(text)
image = Image.open(data["image"][0])
image_path = f"./data/lora_dataset_processed/train/{data_id}.jpg"
image.save(image_path)
file_names.append(f"{data_id}.jpg")
data_frame = pd.DataFrame()
data_frame["file_name"] = file_names
data_frame["text"] = texts
data_frame.to_csv("./data/lora_dataset_processed/train/metadata.csv", index=False, encoding="utf-8-sig")code>
data_frame
4、lora微调
代码下载了预训练模型 Kolors
和 SDXL-vae-fp16-fix
,并使用这些模型进行 LoRA(Low-Rank Adaptation)微调。微调通过一个命令行脚本完成,脚本指定了训练时的参数,包括 LoRA 的 rank 和 alpha 值,数据集路径,以及输出模型保存路径等。
# 下载模型
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)
5、加载微调好的模型
使用 ModelManager
来管理和加载模型,并通过 inject_adapter_in_model
函数将 LoRA 参数注入到模型中。最终的模型包括了 text_encoder
、unet
和 vae
,这些模型组件分别负责文本编码、图像生成和变分自编码器操作。
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",code>
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")code>
model.load_state_dict(state_dict, strict=False)
return model
# Load models
model_manager = ModelManager(torch_dtype=torch.float16, device="cuda",code>
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"code>
)
6、图片生成
代码定义了一个生成图像的提示(prompt),并通过 SDXLImagePipeline
进行推理。生成的图像根据提示生成,并保存在本地。整个过程使用了随机种子以确保可重复性。
torch.manual_seed(0)
image = pipe(
prompt="二次元,一个紫色短发小女孩,在家中沙发上坐着,双手托着腮,很无聊,全身,粉色连衣裙",code>
negative_prompt="丑陋、变形、嘈杂、模糊、低对比度",code>
cfg_scale=4,
num_inference_steps=50, height=1024, width=1024,
)
image.save("1.jpg")
文生图相关知识
文生图主要以SD系列基础模型为主,以及在其基础上微调的lora模型和人物基础模型等。
提示词
提示词很重要,一般写法:主体描述,细节描述,修饰词,艺术风格,艺术家
举个例子
【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。
声明
本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。