当前位置:AIGC资讯 > AIGC > 正文

Datawhale X 魔搭 AI夏令营 Task1

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文件

   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、环境安装

安装了一系列所需的库,包括 simple-aesthetics-predictordata-juicerDiffSynth-Studio,以及一些深度学习相关的工具如 pytorch-lightningpefttorchvision。这些库提供了数据处理、模型微调和图片生成所需的功能。

!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.msdatasetsAI-ModelScope 下载名为 lowres_anime 的数据集,并将其保存到本地。数据集中的每张图片都会被处理成 RGB 格式,并保存到指定的路径下。每张图片还会与一个简单的文本描述(“二次元”)关联,并生成一个 JSONL 文件,包含这些元数据。

#下载数据集
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")

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")
data_frame

4、lora微调

代码下载了预训练模型 KolorsSDXL-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_encoderunetvae,这些模型组件分别负责文本编码、图像生成和变分自编码器操作。

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"
)

6、图片生成

代码定义了一个生成图像的提示(prompt),并通过 SDXLImagePipeline 进行推理。生成的图像根据提示生成,并保存在本地。整个过程使用了随机种子以确保可重复性。

torch.manual_seed(0)
image = pipe(
    prompt="二次元,一个紫色短发小女孩,在家中沙发上坐着,双手托着腮,很无聊,全身,粉色连衣裙",
    negative_prompt="丑陋、变形、嘈杂、模糊、低对比度",
    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。

总结

### 文章总结:Datawhale X 魔搭 AI夏令营 Task1
#### 赛事介绍
DataWhale 开源组织与魔搭社区合作举办了AI夏令营的Task1,关注AIGC(AI生成内容)方向,具体为可图Kolors-LoRA风格故事挑战赛。参赛者可以通过魔搭平台的零代码和微调工具生成独特的图像故事。
#### 参赛流程
1. **开通阿里云PAL-DSW免费试用**:通过指定链接申请免费试用资源。
2. **在魔搭社区进行授权**:访问链接完成社区授权。
3. **报名赛事**:通过天池大赛平台的赛事链接进行报名。
4. **在魔搭社区创建PAL实例**:再次利用授权链接进入并创建实例。
#### 体验与操作指南
1. **跑通baseline**:登录实例后,下载并运行baseline代码,跟随教程或自动运行代码查看默认输出结果。
2. **调整prompt提示词**:通过更改提示词生成具有连贯性和连续性的故事图像。例如,调节人物特征和统一修饰词来改善图像质量。
#### baseline代码结构
- **导入库**:包括数据处理、模型微调和图片生成所需要的库。
- **数据集构建**:下载并处理`lowres_anime`数据集,生成元数据与图像文件。
- **模型微调**:利用预训练模型`Kolors`和`SDXL-vae-fp16-fix`进行LoRA微调,优化模型以适应特定主题或风格。
- **图片生成**:定义提示词并使用微调后的模型生成图片。
#### 文生图相关知识
- **提示词**:编写包含主体描述、细节、修饰词、艺术风格和艺术家等关键信息的提示词,有助于生成更精细的图像。
- **Lora**:介绍Stable Diffusion中的LoRA(Low-Rank Adaptation),作为一种低秩适应技术,用于基础模型的精细化微调。
- **ComfyUI**:工作流工具,简化模型配置和训练过程,提供直观的前端页面设计和执行AIGC生成任务的流程图工具。
#### 实践提示
- 多次实践和调整提示词,提高图像的一致性和满意度。
- 借助blaseline代码和模型微调工具,快速上手并生成高质量的图片故事。
以上总结涵盖了赛事背景、参赛流程、操作流程以及文生图相关知识,为参赛者提供了全面的参加AI夏令营Task1的实践指导。

更新时间 2024-08-28