赞
踩
DataWhale的AI夏令营第四期魔搭-AIGC方向是一个专注于AIGC领域的学习活动,它为学习者提供了一个从基础到高级的完整学习路径。通过结合理论教学和实践挑战,学习者可以在图像生成和优化方面获得宝贵的操作经验。这个夏令营不仅是技术学习的平台,也是激发创新思维和实践能力的舞台,为参与者在AIGC领域的未来发展奠定了坚实的基础。
赛题:可图Kolors-LoRA风格故事挑战赛
赛事链接:https://tianchi.aliyun.com/s/ce4dc8bf800db1e58d51263ff357d28f
这是一个关于使用人工智能生成图像的赛题。具体来说,赛题要求参赛者在已有的Kolors模型基础上训练一个LoRA模型,以生成具有不同风格的图像。LoRA模型是一种轻量级的神经网络模型,它通过调整预训练模型的权重来实现风格转换,而不需要重新训练整个网络。
风格生成:参赛者需要训练LoRA模型以生成多种不同的艺术风格,例如水墨画、水彩画、赛博朋克、日漫等。
故事连贯性:基于LoRA模型生成的8张图片需要构成一个连贯的故事。这意味着每张图片都应该在视觉上和叙事上与前后图片相衔接,形成一个完整的故事线。
故事内容自定义:参赛者可以自由定义故事的内容,但需要确保故事的连贯性和吸引力。
评估标准:除了故事的连贯性,还需要评估LoRA风格的美感度,即生成的图像在视觉上是否吸引人,是否能够体现出所选风格的特点。
样例故事“偶像少女养成日记”提供了一个参考框架,讲述了一个小女孩从对偶像的憧憬到最终成为偶像的过程。这个故事通过8个场景展现了少女的成长和变化,每个场景都与前一个场景紧密相连,形成了一个完整的故事。
其中,赛题官方给出了美学分数的评分代码,可帮助评估参赛图像的美学质量。
- 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.ipynb后,这里会有个手动重启Notebook的步骤,需要进行重启
注意:这里的重启并不是指关闭Notebook后重新进入,而是在运行完第一步后中断,再次全部运行,具体步骤如下:
最后,别忘记了提交结果和打卡哦!在文档的附录中会有相应的提交步骤,获得分数后可进行打卡。
对了,也别忘记关闭实例哦!
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
:
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设备。创建图像生成管道:
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"的文件中。Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。