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

从零入门AI生图原理&实践

探索AI图像生成

DataWhale的AI夏令营第四期魔搭-AIGC方向是一个专注于AIGC领域的学习活动,它为学习者提供了一个从基础到高级的完整学习路径。通过结合理论教学和实践挑战,学习者可以在图像生成和优化方面获得宝贵的操作经验。这个夏令营不仅是技术学习的平台,也是激发创新思维和实践能力的舞台,为参与者在AIGC领域的未来发展奠定了坚实的基础。

活动背景

  • 这个学习活动是基于魔搭社区的"可图Kolors-LoRA风格故事挑战赛"进行的实践学习。

目标受众

  • 适合想入门并实践AIGC领域,特别是对文生图(文生图即通过文本生成图像的技术)、工作流搭建、LoRA微调感兴趣的学习者。

学习内容

  • 从文生图实现方案逐渐进阶:学习内容从基础的文生图技术开始,逐步深入到更高级的技术和应用。
  • 教程偏重:重点放在图像工作流的搭建、微调技术、图像优化等方面。
  • 简单介绍:最后,会简要介绍AIGC的应用方向和数字人技术,这部分内容是选学的。

活动特点

  • 这个学习活动可能是为了帮助学习者理解并掌握AIGC领域的核心技术,特别是在图像生成方面。
  • 通过参与"可图Kolors-LoRA风格故事挑战赛",学习者有机会将理论知识应用于实践,提高自己的技能。

活动目的

  • 通过这个夏令营活动,DataWhale旨在培养学习者在AIGC领域的实际操作能力,特别是在图像生成和优化方面。

赛题解读

赛题:可图Kolors-LoRA风格故事挑战赛

赛事链接:https://tianchi.aliyun.com/s/ce4dc8bf800db1e58d51263ff357d28f

 这是一个关于使用人工智能生成图像的赛题。具体来说,赛题要求参赛者在已有的Kolors模型基础上训练一个LoRA模型,以生成具有不同风格的图像。LoRA模型是一种轻量级的神经网络模型,它通过调整预训练模型的权重来实现风格转换,而不需要重新训练整个网络。

赛事任务

  1. 风格生成:参赛者需要训练LoRA模型以生成多种不同的艺术风格,例如水墨画、水彩画、赛博朋克、日漫等。

  2. 故事连贯性:基于LoRA模型生成的8张图片需要构成一个连贯的故事。这意味着每张图片都应该在视觉上和叙事上与前后图片相衔接,形成一个完整的故事线。

  3. 故事内容自定义:参赛者可以自由定义故事的内容,但需要确保故事的连贯性和吸引力。

  4. 评估标准:除了故事的连贯性,还需要评估LoRA风格的美感度,即生成的图像在视觉上是否吸引人,是否能够体现出所选风格的特点。

样例故事“偶像少女养成日记”提供了一个参考框架,讲述了一个小女孩从对偶像的憧憬到最终成为偶像的过程。这个故事通过8个场景展现了少女的成长和变化,每个场景都与前一个场景紧密相连,形成了一个完整的故事。

评分规则

  • 主观评分:由评委根据技术运用、组图风格连贯性、整体视觉效果三个方面进行投票。
    • 技术运用占比40%
    • 组图风格连贯性占比30%
    • 整体视觉效果占比30%
  • 客观评分:美学分数作为评价提交是否有效的标准,低于6分的提交被视为无效提交。

其中,赛题官方给出了美学分数的评分代码,可帮助评估参赛图像的美学质量。

pip install simple-aesthetics-predictor

import torch, os
from PIL import Image
from transformers import CLIPProcessor
from aesthetics_predictor import AestheticsPredictorV2Linear
from modelscope import snapshot_download


model_id = snapshot_download('AI-ModelScope/aesthetics-predictor-v2-sac-logos-ava1-l14-linearMSE', cache_dir="models/")
predictor = AestheticsPredictorV2Linear.from_pretrained(model_id)
processor = CLIPProcessor.from_pretrained(model_id)
device = "cuda"
predictor = predictor.to(device)


def get_aesthetics_score(image):
    inputs = processor(images=image, return_tensors="pt")
    inputs = {k: v.to(device) for k, v in inputs.items()}
    with torch.no_grad():
        outputs = predictor(**inputs)
    prediction = outputs.logits
    return prediction.tolist()[0][0]


def evaluate(folder):
    scores = []
    for file_name in os.listdir(folder):
        if os.path.isfile(os.path.join(folder, file_name)):
            image = Image.open(os.path.join(folder, file_name))
            scores.append(get_aesthetics_score(image))
    if len(scores) == 0:
        return 0
    else:
        return sum(scores) / len(scores)


score = evaluate("./images")
print(score)

baseline速通

具体的baseline操作在文档中有详细的流程,此处分享一些可能会有遗漏的点。

 在执行到这一步的时候有可能会出现下面框内的内容不存在,为空白的情况,

这可能是前面开通试用申请不成功,可尝试重新申请或者刷新页面。

对于之前使用过魔搭平台的,有可能是魔搭平台绑定的阿里云账号与申请账号不一致,可在账号设置中进行修改。

进入了baseline.ipynb后,这里会有个手动重启Notebook的步骤,需要进行重启

注意:这里的重启并不是指关闭Notebook后重新进入,而是在运行完第一步后中断,再次全部运行,具体步骤如下:

最后,别忘记了提交结果和打卡哦!在文档的附录中会有相应的提交步骤,获得分数后可进行打卡。

对了,也别忘记关闭实例哦!

baseline讲解

baseline是一个AI图像生成项目的基线代码,它包括导入数据处理和微调工具的库,构建并处理名为"kolors"的数据集,进行模型微调训练,加载训练后的模型,并最终利用该模型生成图片的完整流程。下面对部分代码进行分析:

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)

这段代码使用 os.system 来执行一个shell命令,该命令运行了一个Python脚本train_kolors_lora.py,用于训练一个特定的模型,用于文本到图像的生成任务。

其中的参数可以用于配置和运行模型训练脚本。下面是对部分参数的解释,可对参数进行合理的修改与添加:

  • -h, --help:显示帮助信息并退出。
  • --pretrained_unet_path PRETRAINED_UNET_PATH:预训练的UNet模型的路径。
  • --lora_target_modules LORA_TARGET_MODULES:指定要在模型中添加LoRA模块的层。
  • --dataset_path DATASET_PATH:数据集的路径。
  • --output_path OUTPUT_PATH:保存训练模型的路径。
  • --steps_per_epoch STEPS_PER_EPOCH:每个训练周期的步数。
  • --height HEIGHT:图像的高度。
  • --width WIDTH:图像的宽度。
  • --center_crop:是否将输入图像中心裁剪到指定分辨率。如果不设置,图像将随机裁剪。
  • --random_flip:是否随机水平翻转图像。
  • --batch_size BATCH_SIZE:训练数据加载器的批量大小(每个设备)。
  • --dataloader_num_workers DATALOADER_NUM_WORKERS:用于数据加载的子进程数量。0表示在主进程中加载数据。
  • --precision {32,16,16-mixed}:训练精度,可以是32位、16位或混合精度。
  • --learning_rate LEARNING_RATE:学习率。
  • --lora_rank LORA_RANK:LoRA更新矩阵的维度。
  • --lora_alpha LORA_ALPHA:LoRA更新矩阵的权重。
  • --use_gradient_checkpointing:是否使用梯度检查点。
  • --accumulate_grad_batches ACCUMULATE_GRAD_BATCHES:梯度累积的批次数。
  • --training_strategy {auto,deepspeed_stage_1,deepspeed_stage_2,deepspeed_stage_3}:训练策略。
  • --max_epochs MAX_EPOCHS:训练周期数。

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

这段代码是用于加载和配置一个使用LoRA(Low-Rank Adaptation)技术的图像生成模型。LoRA是一种用于微调大型神经网络的技术,通过在模型的关键部分添加低秩矩阵来实现。下面是对代码的分析:

  1. 定义函数 load_lora

    • 这个函数用于加载LoRA配置到一个给定的模型中,并从指定的路径加载LoRA权重。
    • 参数说明:
      • model:要微调的原始模型。
      • lora_rank:LoRA的秩,决定了低秩矩阵的大小。
      • lora_alpha:LoRA的缩放因子,用于控制LoRA权重的影响。
      • lora_path:存储LoRA权重的文件路径。
    • 函数首先创建一个 LoraConfig 对象,然后使用 inject_adapter_in_model 函数将LoRA适配器注入到模型中。
    • 接着,使用 torch.load 加载权重,并使用 model.load_state_dict 将权重应用到模型上。
  2. 加载模型

    • 创建一个 ModelManager 对象,指定数据类型为 torch.float16 和使用CUDA设备。
    • 加载三个模型文件,这些文件可能分别对应于文本编码器、UNet生成器和变分自编码器(VAE)。
  3. 创建图像生成管道

    • 使用 SDXLImagePipeline.from_model_manager 方法创建一个图像生成管道,该管道使用上面加载的模型。
  4. 应用LoRA

    • 对图像生成管道中的 unet 组件应用LoRA,提供LoRA的秩、缩放因子和权重文件路径。

这段代码的目的是将LoRA技术应用于一个图像生成模型,以便提高模型对特定任务的适应性。

torch.manual_seed(0)
image = pipe(
    prompt="现实,一个紫色短发小女孩,在家中沙发上坐着,双手托着腮,很无聊,全身,粉色连衣裙",
    negative_prompt="丑陋、变形、嘈杂、模糊、低对比度",
    cfg_scale=4,
    num_inference_steps=50, height=1024, width=1024,
)
image.save("1.jpg")
  • 这行代码调用了名为pipe的对象,是一个图像生成对象,用于根据给定的提示生成图像。
  • prompt参数是一个字符串,包含了生成图像的描述,例如“现实,一个紫色短发小女孩,在家中沙发上坐着,双手托着腮,很无聊,全身,粉色连衣裙”。
  • negative_prompt参数也是一个字符串,包含了不希望出现在生成图像中的描述,例如“丑陋、变形、嘈杂、模糊、低对比度”。
  • cfg_scale参数可能用于控制生成图像的配置或风格的比例。
  • num_inference_steps参数指定了生成图像时的推理步骤数量,这可能影响生成图像的质量和细节。
  • heightwidth参数分别设置了生成图像的高度和宽度,这里都是1024像素,意味着生成的图像将是一个正方形图像。
  • 这行代码执行完成后,image变量将包含生成的图像数据,并保存到当前目录下名为"1.jpg"的文件中。
  • 24
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值