从零入门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模型是一种轻量级的神经网络模型,它通过调整预训练模型的权重来实现风格转换,而不需要重新训练整个网络。
赛事任务
-
风格生成:参赛者需要训练LoRA模型以生成多种不同的艺术风格,例如水墨画、水彩画、赛博朋克、日漫等。
-
故事连贯性:基于LoRA模型生成的8张图片需要构成一个连贯的故事。这意味着每张图片都应该在视觉上和叙事上与前后图片相衔接,形成一个完整的故事线。
-
故事内容自定义:参赛者可以自由定义故事的内容,但需要确保故事的连贯性和吸引力。
-
评估标准:除了故事的连贯性,还需要评估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是一种用于微调大型神经网络的技术,通过在模型的关键部分添加低秩矩阵来实现。下面是对代码的分析:
-
定义函数
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
将权重应用到模型上。
-
加载模型:
- 创建一个
ModelManager
对象,指定数据类型为torch.float16
和使用CUDA设备。 - 加载三个模型文件,这些文件可能分别对应于文本编码器、UNet生成器和变分自编码器(VAE)。
- 创建一个
-
创建图像生成管道:
- 使用
SDXLImagePipeline.from_model_manager
方法创建一个图像生成管道,该管道使用上面加载的模型。
- 使用
-
应用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
参数指定了生成图像时的推理步骤数量,这可能影响生成图像的质量和细节。height
和width
参数分别设置了生成图像的高度和宽度,这里都是1024像素,意味着生成的图像将是一个正方形图像。- 这行代码执行完成后,
image
变量将包含生成的图像数据,并保存到当前目录下名为"1.jpg"的文件中。