从零入门AI生图原理&实践是 Datawhale 2024 年 AI 夏令营第四期的学习活动(“AIGC”方向),基于魔搭社区“可图Kolors-LoRA风格故事挑战赛”开展的实践学习——
- 适合想 入门并实践 AIGC文生图、工作流搭建、LoRA微调 的学习者参与
学习内容提要:从通过代码实现AI文生图逐渐进阶,教程偏重图像工作流、微调、图像优化等思路,最后会简单介绍AIGC应用方向、数字人技术(选学)
Datawhale学习手册置顶=>从零入门AI生图原理&实践
1. 赛题任务概述
参赛链接:可图Kolors-LoRA风格故事挑战赛
赛事目标:
- 参赛者需在可图Kolors 模型的基础上训练LoRA 模型,生成无限风格,如水墨画风格、水彩风格、赛博朋克风格、日漫风格......
- 基于LoRA 模型生成 8 张图片组成连贯故事,故事内容可自定义;基于8图故事,评估LoRA风格的美感度及连贯性 样例:偶像少女养成日记
赛事流程:
- 初赛:报名后-2024年8月31日23:59
- 决赛:2024年9月5日答辩展示,线上决出一二三等奖(评委主观评分)
2. task01-跑通baseline
2.1 比赛报名
点击参赛链接,同意协议后即可报名成功。
2.2 创建阿里云PAI-DSW实例
每个新用户都有一个免费试用的机会=>阿里云免费试用链接
注意事项:
- 第③步务必选择第二个, 第一个的GPU的显存不够
- 如果创建后未找到实例,可能是现有的实例和新创建的实例不在同一地区,请点击新建实例上方的地区(图中为华东1(杭州))进行切换
2.3 baseline下载
git lfs installgit clone https://www.modelscope.cn/datasets/maochase/kolors.git
2.4 baseline部分代码解读
保存数据集中的图片及元数据
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")
我们将数据集保存为(text, image)的数据对并存储在jsonl文件中
(JSONL文件(JSON Lines)是一种每行包含一个独立的 JSON 对象的文本文件格式。每行都是一个有效的 JSON 对象,使用换行符分隔)
其中text的中文"二次元"是用Unicode编码存储的
模型加载
# 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)
模型使用半精度浮点数(torch.float16),并指定了文本编码器、UNet 模型和 VAE 模型的权重文件
load_lora 函数
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
- lora_rank: LoRA 中低秩矩阵的秩,决定了适配器的容量
- lora_alpha: LoRA 的缩放因子,控制适配器的影响力
- init_lora_weights:LoRA 适配器权重的初始化方法
- target_modules:指定模型中的子模块注入 LoRA 适配器。通常是与注意力机制相关的层,如这里的to_q、to_k、to_v 和 to_out
- inject_adapter_in_model:将 LoRA 适配器注入到模型中
2.5 prompt修改技巧
首先列出最希望图像中包含的核心元素(如风格,主要人物),把次要的细节或补充描述放在句子的后面,这样模型会先生成主元素,再填充细节。
以baseline中图二的prompt为例:
如果我们把主次交换后会出现什么情况?
修改prompt:二次元,日系动漫,演唱会的舞台上衣着华丽的歌星们在唱歌,演唱会的观众席,人山人海,一个紫色短发小女孩穿着粉色吊带漏肩连衣裙坐在演唱会的观众席
由于主体信息的后移,主体信息将次体信息当作了背景信息,最终产生了主次融合后的结果
2.6 生成的一些结果
对于单个人物,由于有详细的描述可以达到较好的结果。但是对于群像图来说,因为我提供的prompt有限,生成的较为粗糙。
3.相关知识学习推荐
对于文生图的发展,我们不必从头开始了解所有技术的详细过程,但是大致知道技术是如何发展的有助于我们更高的理解模型。
在DALL·E 2(内含扩散模型介绍)【论文精读】中,会介绍从GAN,到VAE,VQVAE,再到现在普遍使用的扩散模型(Diffusion)的技术改进思想(视频从28:00开始),十分推荐观看!