AIGC学习笔记 aka 小白进阶攻略 o( ̄▽ ̄)ブ
简介:基于魔搭社区“可图Kolors-LoRA风格故事挑战赛”开展实践学习,从文生图实现方案逐渐进阶,教程偏重图像工作流、微调、图像优化等思路,最后选学AIGC应用方向、数字人技术等内容,从零入门AI生图原理&实践。
赛题解读
-
【报名】
初赛:报名后——2024年8月31日23:59
决赛:2024年9月5日答辩展示
-
【任务】
① 在可图Kolors模型的基础上训练LoRA模型,生成无限风格(水墨画、水彩、赛博朋克、日漫...)
② 基于LoRA模型生成 8 张图片组成连贯故事,故事内容可自定义
-
【评分】
① 美学评分(小于阈值6的提交被视为无效,无法参与主观评分)
② 主观评分(技术运用40%、组图风格连贯性30%、整体视觉效果30%)
-
【提交】
① 文件:训练的LoRA 模型文件、LORA 模型的介绍、使用该模型生成的至少8张图片和对应的prompt,确保可复现生成效果;
② 地址:魔搭模型库(LoRA模型上传,队伍名称-可图Kolors训练-xxxxxx),比赛品牌馆讨论区 (作品发布,天池平台报名队伍名称+LoRA模型链接地址+作品图(8图故事))
-
【数据集】
官方示例数据集;可自行寻找所需的数据集,训练LoRA模型。
Task1:初步尝试Baseline(8.8~8.10)
(速通教程非常详细,小白也完成得极其流畅,感谢)
1.1 实践背景学习
一、文生图的发展
早期:规则和模板匹配
2000年代:概率图 & 统计模型 & 机器学习
2010年代:深度学习 & 卷积神经网络(CNN)& 生成对抗网络(GAN)
2020年代:大模型 & OpenAI的CLIP & DALL-E & Stable Diffusion
二、相关技术的理论知识
- 基础模型
以SD系列(Stable Diffusion)为主。
这个系列按照更新版本依次有 SD 1.x、SD 2.x、SD 1.5、SDXL 1.0、SDXL Turbo,其中,SDXL采用了一种名为“对抗性扩散蒸馏”(Adversarial Diffusion Distillation,ADD)的新技术,使得模型能够同时实现 ①高采样保真度 ②实时图像生成。SDXL Turbo效率更高,但目前未开放商业使用。
此外查阅Q&A文档,本次比赛提交时选用SD_1.5或SD_2.1已足够。
- 微调模型
在基础模型上调出的LoRA、人物基础模型等。
LoRA(Low-Rank Adaptation,低秩适应)是一种轻量级的微调方法,并非指单一的具体模型。在Stable Diffusion这一文本到图像合成模型的框架下,Lora被用来对预训练好的大模型进行针对性优化,以实现对特定主题、风格或任务的精细化控制。
- Prompt
一般写法:主体描述,细节描述,修饰词,艺术风格,艺术家。
关键词靠前的更重要。
分为正向prompt和负向prompt(不希望生成的内容)。
- ComfyUI
一个工作流工具,直观的界面展示配置和训练过程。
在其前端页面上,用户可以基于节点/流程图的界面设计并执行AIGC文生图/视频的pipeline。
(没用过,可以学习一下)
- ControlNet
一个参考图控制组件,附加到预训练的扩散模型(如Stable Diffusion模型)上的可训练神经网络模块。
扩散模型通常用于从随机噪声逐渐生成图像的过程,而ControlNet的作用在于引入额外的控制信号,使得用户能够精确控制图像生成的不同方面(如姿势关键点、分割图、深度图、颜色等)。
1.2 跑通 baseline
Step 1:云资源获取、环境配置等
开通阿里云PAI-DSW试用(5000个算力时/3个月,使用时好像按量计费?约7个/时,记得及时关掉!) → 魔搭社区注册并授权阿里云 → 在魔搭社区创建PAI实例 → 启动!
Step 2:下载baseline文件、导入一些库等
打开后先git下载baseline文件,接着就是逐个运行python代码块(一个.ipynb文件)。
git lfs install
git clone https://www.modelscope.cn/datasets/maochase/kolors.git
pip install了俩工具,分别是 ① Data-Juicer(数据处理和转换)、② DiffSynth-Studio(大模型微调训练)。
!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
Step 3:数据集下载和处理
小白...于是直接运行了orz,先跑通再说!
from modelscope.msdatasets import MsDataset
from data_juicer.utils.mm_utils import SpecialTokens
看最后保存的csv,似乎是给数据集的图片打了标签“二次元”,奠定风格。
Step 4:LoRA微调训练
依然直接运行,先跑通再说!用到SDXL-vae-fp16-fix(基准模型?)。
from diffsynth import download_models
download_models(["Kolors", "SDXL-vae-fp16-fix"])
训练部分的代码注释说,改变 lora_rank(the dimension of the LoRA update matrices)可以调整参数量,于是从默认 16 改成 32 ,尝试一下;max_epochs从 1 改成 2 。
最后loss是0.053,训练速度不太快。
Step 5:加载模型
先跑通再说...。要注意这块代码需与前设一致。
Step 6:图片生成
我主要调整了随机数种子和prompt内容,每张图生成速度都是18s。prompt现在还没啥头绪和技巧,纯靠盲试,把重要的关键词往前放。
我生成的8图如下,故事还是官方示例的少女成长记哈哈哈。顺利跑通感觉不错,部分图片并没有达到预期,期待后续学习和改进!
Step 7:微调结果上传
在终端执行命令
mkdir /mnt/workspace/kolors/output & cd
cp /mnt/workspace/kolors/models/lightning_logs/version_0/checkpoints/epoch=0-step=500.ckpt /mnt/workspace/kolors/output/
cp /mnt/workspace/kolors/story.jpg /mnt/workspace/kolors/output/
→ 打开output文件
→ 分别下载 .jpg 和 .ckpt (保存模型的权重和优化器的中间状态,文件较大) 文件
→ 上传魔搭模型库
→ 创空间查看是否发布
必须记得回到魔搭--我的 notebook,关闭PAI实例!!
1.3 心得
由衷感谢Datawhale的教程和学习资源,让我初步了解文生图的基本技术、完整流程以及如何用代码实现AIGC,小白上手毫无压力!非常期待接下来的学习!
-
Q:如何改变微调的图片风格?
A:我想到的是改变微调数据集的风格(a balance of high quality and more diversity,或许可以关注图片来源、主题、场景、人物、色彩...) & prompt工程(诸如思维链之类的,有待学习)。
-
反思1:对LoRA技术原理、参数还不了解,微调的模型可能比较糙,需要精读代码来优化。
以下来自CSDN:自然语言处理: 第十九章LoRA&QLoRA微调技巧
rank :LoRA的低秩的秩的大小,rank越小低秩矩阵越简单,从而导致在适应过程中学习参数更少、训练速度更快、计算需求降低,但是捕获特定任务信息的能力会降低。rank需要在模型复杂性、适应能力以及欠拟合或过拟合的风险之间进行权衡。
alpha :比例因子(通常设置为 1),用于在前向传播过程中将 LoRA 权重应用于预训练之中,以调整组合结果的大小(原始模型输出加上低秩适应)。这平衡了预训练模型的知识和新的特定于任务的适应。LoRA 权重的值越大,其影响就越大。
dropout : 随机丢失
q & k & v : 是否对自注意力的q & k & v 进行训练
projection : 是否对投影层进行训练
mlp : 是否线性层进行训练
head : 是否输出头进行训练
-
反思2:希望之后可以用到comfyUI工具。
Task2:精读baseline代码 + prompt练习(8.13~8.14)
2.1 魔搭社区的资源
魔搭社区 的各类AIGC工具:模型、数据集、开源内容...
Kolors(可图)模型:快手开源的文本到图像生成模型,中英双语
可图优质咒语书:中文prompt,600+风格
创意海报生成:AI背景图 + 艺术字设计 → 合成图片
研习社 · 魔搭社区:NLP、计算机视觉、多模态等学习资源
2.2 精读baseline代码
① 主体框架
我使用GPT-4o来辅助理解,初步弄清其框架。
返回结果如下:
- 1.依赖库的安装
安装代码运行所需的各种Python库和工具包,包括 simple-aesthetics-predictor、data-juicer、peft、lightning、torchvision 和 DiffSynth-Studio。
- 2.数据集加载和准备
从 ModelScope 加载低分辨率的动漫数据集,并将数据缓存到指定目录。
- 3.数据预处理和存储
将数据集中的图像转换为RGB格式,并保存到本地。同时,生成对应的元数据文件 metadata.jsonl,用于描述图像与文本的映射关系。
- 4.数据过滤与加工
使用 data-juicer 进行数据过滤和预处理,确保图像满足指定的尺寸和比例要求,并将处理后的结果保存到指定的文件中。
- 5.数据重组织与最终保存
将经过处理后的图像和文本信息重新组织,并保存为metadata.csv文件,这个文件将作为后续训练时的数据集使用。
- 6.模型下载与训练
下载所需的预训练模型。 通过指定的参数和路径进行LoRA的微调训练。
- 7.模型加载与推理
加载训练后的LoRA模型,并将其应用于预训练的UNet模型中。通过这个步骤,模型可以结合LoRA进行推理和图像生成。
- 8.图像生成与保存
使用训练好的模型根据输入的提示词生成图像,并将生成的图像保存到指定路径。代码中有多个相似的块,分别用于生成不同的图像。
② 逐行分析和我的收获
依然使用GPT-4o辅助学习,相较 ①主体框架 有种豁然开朗的感觉,学到了很多编程知识,知道怎么替换数据集,也搞明白了LoRA微调训练的核心环节和参数有哪些,比如rank、alpha、learning_rate、batch_size、epoch以及模型的不同layers(task1的疑问✔)。
-
一个小发现:当我的prompt写成 “ 我对python一窍不通,请帮我逐行解析以下代码xxx ” ,GPT会更新它的记忆,为我输出更详细的内容。【与大模型友好沟通技能+1】
以下是我结合GPT-4o的回答,对baseline代码作出的详细注解。(第一次这么仔细地读代码orz,收获满满)
在阅读过程中,我最深的感触是这些文件名和文件路径,一不小心就会弄错和遗漏,或者彼此关系不明确。因此,我必须在一开始就做好清晰的规划,随时检查,以干净的架构来存储所有的过程文件。
另外,我发现代码对数据集的处理是比较细节的,既会过滤掉很多信息,也会保留很多特征,可能一点微小的规则变动都会影响最终成图的效果。把数据集整理成LoRA需要的格式也很必要。如果要提高模型输出能力,必须特别关注数据集的质量和处理方式。
2.3 Prompt 练习:基于话剧的连环画制作
① 创作故事和prompt
我的创作流程:
和LLM对话
→ 生成场景描述和prompt
→ 人工丰富细节并删除冗余
→ 用可灵AI/baseline等途径实战试验
→ 根据成图效果继续调整prompt
→ 直到满意
一开始GPT的输出很冗长,我申明了简约要求后,输出质量提高了很多。
此外,我在可灵官方的prompt指南里学习了5W1H方法,例如:一个戴着贝雷帽 [what] 的老画家 [who] ,站在画架前 [what] ,在黄昏时分 [when] 的花园里 [where] ,专心地作画 [why] ,印象派风格,柔和光影,近景 [how] 。
类似的,我的场景一可以写成:一个黑色长发马尾少女,穿着浅蓝色毛衣和牛仔裤,坐在木质书桌前,专注地盯着书,眉头微皱,桌上堆满书本和笔记本,背景是昏黄灯光下的书架,手绘漫画风。
依次执行以上步骤后,我将最后的 场景 | 正向prompt | 负向prompt 信息汇总成了表格。
表1:无代码文生图用的prompt
表2:代码文生图用的prompt
② 无代码文生图
-
SCEPTER Studio (效果太感人了就不放了)
-
完整的故事生成如下,画面还是比较连续的~
不过我也发现很多需要解决的问题:
-
让AI生图工具写字的效果很差;
-
AI不怎么喜欢画全身图;
-
在多人物描述时,AI很容易把特征张冠李戴;
-
提示词键入过多,许多效果反而不会呈现出来;
-
画风依然不是很统一,细节处有许多破绽(比如书包、发圈、录取通知书的帽穗等)。
-
③ 用代码文生图
完整故事生成如下,强烈的微调数据集风格(二次元),还需要继续学习改进~
一点思考:
-
当场景比较复杂,prompt很多时,必须增加推理步骤
num_inference_steps,否则会生成看起来显然没有画完的图。我最高调成了500。 -
遇到了GPU显存不足的报错。向GPT以及助教请教,已顺利解决。
-
解决办法Ⅰ:输入代码
import gc,gc.collect(),torch.cuda.empty_cache(),释放不用的显存,并通过命令!nvidia-smi随时查看GPU情况。 -
解决办法Ⅱ:重启内核。
-
-
图片风格不满意。我发现魔搭社区有很多方便好用的数据集,针对人物表情、姿势等都有,后续task中将改变数据集试一试。
-
可灵AI无代码文生图的效果,比coding的画面细腻很多,也可以改换风格,速度也快。那对于普通应用者而言,用LoRA微调的优势到底体现在何处呢?
Task3:ComfyUI & 微调 & 数据集(8.16~8.17)
3.1 学习ComfyUI的使用
① 理论知识
ComfyUI 是 GUI(Graphical User Interface,图形用户界面)的一种,是基于节点工作的用户界面,核心模块由模型加载器、提示词管理器、采样器、解码器构成。
Stable Diffusion的基本原理是将一个原本的噪声信号(初始图像)变为无噪声的信号(人可以理解的图像),其中的降噪过程涉及到多次采样。
- seed:控制噪声产生的随机种子
- control_after_generate:控制seed在每次生成后的变化
- steps:降噪的迭代步数,越多则信号越精准,相对的生成时间也越长
- cfg(classifier free guidance):prompt对于最终生成图像的影响有多大,值越高越严格
- scheduler:降噪参数
- denoise:多少内容会被噪声覆盖
② 实操体验
完成了task1的学习期待✔。首先需要在GPU环境下新建一个空白实例,可能是为了避免和之前的task的依赖产生冲突。
git lfs install
git clone https://www.modelscope.cn/datasets/maochase/kolors_test_comfyui.git
mv kolors_test_comfyui/* ./
rm -rf kolors_test_comfyui/
mkdir -p /mnt/workspace/models/lightning_logs/version_0/checkpoints/
mv epoch=0-step=500.ckpt /mnt/workspace/models/lightning_logs/version_0/checkpoints/
下载后执行 ComfyUI.ipynb 所有代码,点开链接就能进入ComfyUI界面。运行过程中,我遇到了下载反复中断、打不开ComfyUI等问题,尝试重启kernel、换谷歌浏览器、新建实例、挂代理等方法之后顺利解决。感谢答疑群和助教老师们,越来越不怕bug啦~
加载工作流脚本文件(kolors_example.json),输入正向和负向prompt,一键生成图片。ComfyUI将整个流程可视化了出来,我能很明确地看到代码框架以及运行到哪一部分(有绿色的进度条),对于修改调整模型来说是很方便的。
也可以加载带LoRA的工作流脚本(kolors_with_lora_example.json),把之前task1训练的LoRA参数传上去再生图片,非常用户友好的操作界面!
3.2 LoRA参数微调
在之前精读baseline代码的时候,我已经了解了很多LoRA微调时的参数含义,并且自己尝试调整过rank、max_epoch等数值的大小,然而最终模型成图的效果并没有显著改变。
| 参数名称 | 参数值 | 说明 |
|---|---|---|
pretrained_unet_path | models/kolors/Kolors/unet/diffusion_pytorch_model.safetensors | 指定预训练UNet模型的路径 |
pretrained_text_encoder_path | models/kolors/Kolors/text_encoder | 指定预训练文本编码器的路径 |
pretrained_fp16_vae_path | models/sdxl-vae-fp16-fix/diffusion_pytorch_model.safetensors | 指定预训练VAE模型的路径 |
lora_rank | 16 | 设置LoRA的秩(rank),影响模型的复杂度和性能 |
lora_alpha | 4 | 设置LoRA的α值,控制微调的强度,α越大则LoRA对基础模型的影响越大 |
dataset_path | data/lora_dataset_processed | 指定用于训练的数据集路径 |
output_path | ./models | 指定训练完成后保存模型的路径 |
max_epochs | 1 | 设置最大训练轮数 |
center_crop | 启用中心裁剪,用于图像预处理 | |
use_gradient_checkpointing | 启用梯度检查点,节省显存 | |
precision | "16-mixed" | 设置训练时的精度 |
目前觉得,可以调整的参数有:lora_rank,lora_alpha,max_epochs。可图比赛官方给出了一些提高图像质量的经验,应该可以借鉴。还需要进一步探索参数的最优组合。
3.3 如何构建微调数据集
同样是在精读代码的时候,我发现数据集从选取到处理都非常重要,也占据整个工作流的一大部分。
-
在选取方面,baseline是低像素的二次元风格,与我的预期并不符合,所以我想在魔搭社区里找别的数据集。(以下是教程里整理的数据来源,先存着以后应该有用!)
- 公开的数据平台
- 魔搭社区
- ImageNet:广泛用于分类任务
- Open Images:由Google维护,带有标签的图片
- Flickr:特别是Flickr30kK和Flickr8K数据集,常用于图像描述任务
- CelebA:人脸图像数据集
- LSUN :包含各种场景类别
- API或爬虫
- Unsplash、Pexels等
- 数据合成
- 利用现有的图形引擎(如Unity、Unreal Engine)或特定软件
- 数据增强
- 旋转、翻转、缩放、颜色变换等方式
- 购买或定制
- 公开的数据平台
-
在处理方式方面,除了利用data-juicer进行图像尺寸、宽高比的过滤,可图比赛官方还给出了利用美学打分进行筛选的方法,应该可以借鉴。
汇总起来,可以考虑应用场景、数据类型、数据质量、数据数量这4个角度来构建一个高质量的数据集。
3.4 最后一次作品
在baseline的基础代码上,结合这几天学到的知识与思考,增加了一些代码模块。作为入门初学者,收获满满~
① 微调数据集来源
出于时间和能力的考量,我选用了魔搭社区的开源数据集 文生图风格定制数据集(from IIC) 中的水彩画风格子集。
dataset_style = 'Watercolor' # 在此处修改风格即可
from modelscope.msdatasets import MsDataset
ds = MsDataset.load(
'iic/style_custom_dataset', subset_name = dataset_style, split='train',
cache_dir="/mnt/workspace/kolors/my_data"
)
-
这个数据集提供6类风格的图片,分别是 watercolor(水彩画风格)、3D(3D风格)、anime(日漫风格)、flatillustration(平面插图风格)、oilpainting(油画风格)、sketch(素描风格)。
在代码的第一行修改,就可以切换到其他图片风格。
-
每种风格的训练集只有30张图片+对应的prompt。在参考了CSDN文章 Generative AI 新世界 | 文生图领域动手实践:预训练模型的微调-CSDN博客 以及论文 DreamBooth: Fine Tuning Text-to-Image Diffusion Models for Subject-DrivenGeneration后,似乎这个数据量也能起到不错的效果。
② 数据处理
在baseline基础上,新增美学评分步骤,并丰富文本描述。
-
美学评分模型由可图比赛官方提供。
!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)from PIL import Image for i in range(30): image = Image.open(f'{target_directory}/{i}.jpg') score = get_aesthetics_score(image) print('picture ',i,': ',score,end='\t') if (i+1) % 2 == 0: print() print('---------- Average aesthetics score: ',evaluate(target_directory),' ----------')依次输出每张图片的美学分数,平均分为6.29,达到比赛要求(6分以上)。
-
baseline中微调数据集的文本描述全部是“二次元”,很简略。我选用的数据集中每张图片都有短文本提示词,我以 prompt + style 的形式,构建文本描述(text),作为LoRA的输入。示例如下。
file_name text 0.jpg a watercolor painting of a child with blue hair, watercolor style 1.jpg an old man in a white hat is shown in this watercolor painting, watercolor style 2.jpg a watercolor painting of a chinese building, watercolor style 3.jpg a painting of a woman carrying a child, watercolor style 4.jpg a painting of a woman with black and white watercolor, watercolor style
③ LoRA参数
-
最重要的秩和正则化参数:LoRA的原理是将原本大参数矩阵分解为两个低秩矩阵A(m×r)& B(r×n),再乘以缩放因子
α / r作为权重输出,故rank和alpha应该是一起调整的。依据大赛官方给出的风格化训练建议,我设定rank为16,α 相应调大成8。 -
其他训练架构类参数:在baseline参数基础上进行调整,并新增
steps_per_epoch和random_flip参数,前者与 max_epochs 一起控制训练步长,后者为随机旋转以提高泛化能力。参数 值 lora_rank 16 lora_alpha 8 max_epochs 5 steps_per_epoch 200 precision 16-mixed center_crop True random_flip True use_gradient_checkpointing True
④ 故事和prompt
-
场景一:少女画家缺少灵感
水彩画,{红色长发少女躺在家里的床上,神色苦恼,手上拿着画笔,全身图,冷色调},美丽,绘画性强,细节丰富,纹理鲜明,艺术感十足。
-
场景二:背着画架出门采风
水彩画 ,{穿浅蓝色长裙、戴贝雷帽、红色长发的少女背着画架出门采风,阳光明媚,四周绿意盎然},美丽,绘画性强,细节丰富,纹理鲜明,艺术感十足。
-
场景三:在湖边专心作画
水彩画,{穿浅蓝色长裙、戴米色贝雷帽、红色长发的少女在湖边专心作画,充满活力},美丽,绘画性强,细节丰富,纹理鲜明,艺术感十足。
-
场景四:在樱花树下睡着
水彩画,{穿浅蓝色长裙、戴米色贝雷帽、红色长发的少女在樱花树下躺着睡觉,花瓣飘落},美丽,绘画性强,细节丰富,纹理鲜明,艺术感十足。
-
场景五:一只小猫从树林窜出
水彩画,{一只猫从树林窜出,穿浅蓝色长裙、戴米色贝雷帽、红色长发的少女转头看向小猫,眼神好奇},美丽,绘画性强,细节丰富,纹理鲜明,艺术感十足。
-
场景六:小猫与少女一起回家
水彩画,{穿浅蓝色长裙、戴米色贝雷帽、红色长发的少女与小猫一起走在回家的路上,夕阳余晖洒满道路,充满活力},美丽,绘画性强,细节丰富,纹理鲜明,艺术感十足。
-
场景七:少女和小猫在家吃饭
水彩画,{红色长发的16岁少女在家里的餐桌旁吃饭,桌上有只猫,晚上,充满活力},美丽,绘画性强,细节丰富,纹理鲜明,艺术感十足。
-
场景八:画了小猫特写,满意睡觉
水彩画,{红色长发的少女在床上睡觉,神色幸福,手上拿着猫的画像,低饱和度,冷色调},美丽,绘画性强,细节丰富,纹理鲜明,艺术感十足。
-
NEGATIVE PROMPT:丑陋、变形、嘈杂、模糊、低对比度、照片、逼真
⑤ 成图
将训练好的LoRA参数保存为epoch=4-step=1000.ckpt文件,加载到ComfyUI界面,生成图片。可调整的采样器参数有 seed,steps,control_after_generate(在循环中持续改变随机数种子以得到不同输出),cfg。
⑥ 作品链接
队伍:咕噜咕噜嗝