目录
发展历史
从拟合数据开始,对两点之间不断补足……生成模型的首要任务是学习训练数据的分布。假设有一个未知的真实数据分布 pdata(x)pdata(x),生成模型试图找到一个近似的模型分布 pmodel(x)pmodel(x),使得 pmodel(x)pmodel(x) 尽可能接近 pdata(x)pdata(x)。
1. 早期生成模型:
- 基本概率生成模型(Basic Probabilistic Models): 最早的生成模型是基于统计和概率的方法,如高斯混合模型(GMM)和隐马尔可夫模型(HMM),主要用于简单的模式识别和信号处理。
- 朴素贝叶斯生成模型(Naive Bayes): 这类模型假设特征之间相互独立,并使用条件概率进行生成。虽然简单,但为后续复杂生成模型的发展奠定了基础。
2. 生成对抗网络(GAN, Generative Adversarial Networks):
- GAN的提出(2014年): Ian Goodfellow 等人在 2014 年提出了 GAN。
- GAN 包括两个神经网络——生成器(Generator)和判别器(Discriminator)。生成器试图从噪声中生成逼真的数据(如图像),而判别器则试图区分生成的数据和真实数据。生成器和判别器通过相互对抗的方式进行训练,生成器不断改进,直到它生成的数据足够逼真
- GAN的改进和应用: 之后的几年中,GAN 有了许多变体,如 DCGAN(Deep Convolutional GAN),WGAN(Wasserstein GAN)等。这些改进使得 GAN 在生成图像、视频、音频等领域表现出了强大的能力。
3. 自回归模型(Autoregressive Models):
- PixelRNN 和 PixelCNN: 自回归模型如 PixelRNN 和 PixelCNN 是基于序列建模的生成模型,利用像素之间的依赖关系生成图像。它们通过逐像素预测来生成图像,生成结果往往非常逼真,但生成速度较慢。
- Transformer的应用: 随着 Transformer 模型的引入,自回归生成模型在文本生成领域取得了显著进展,如 GPT 系列模型的成功。Transformer 结构通过并行计算加速了训练过程,并且能够处理长距离依赖关系。
4. 变分自动编码器(VAE, Variational Autoencoders):
- VAE的提出(2013年): VAE 由 Kingma 和 Welling 提出,是一种基于概率图模型的生成模型。VAE 通过对数据进行隐变量编码和解码来生成新样本,它在生成图像、音频等任务中表现良好。
- 原理: VAE 是一种概率生成模型,通过编码器(Encoder)将输入数据压缩到一个潜在空间(通常是一个高斯分布),然后通过解码器(Decoder)从这个潜在空间中生成新数据。VAE 在训练过程中会同时最小化重构误差和潜在分布与目标分布之间的差异(通常通过 KL 散度来衡量)。
- 特点: VAE 具有良好的数学解释性,生成过程具有连续性,但生成的数据可能不如 GAN 那样清晰。
5. 扩散模型(Diffusion Models):
- 扩散模型的基础: 扩散模型是一类基于马尔可夫链的生成模型。通过在数据上逐渐加入噪声(正向扩散过程)并学习如何从噪声中恢复数据(逆向扩散过程)来生成样本。模型首先在训练过程中学习如何在不同程度的噪声下还原数据。生成时,从纯噪声开始,逐步去噪,最终生成目标数据。
- DDPM(2020年): Denoising Diffusion Probabilistic Models (DDPM) 是扩散模型的一种,通过引入正则化技术和更高效的去噪过程,大幅提高了生成质量和效率。
- 详细公式和图解:https://blog.csdn.net/DFCED/article/details/132394895?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522172338448616800225548662%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=172338448616800225548662&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-132394895-null-null.142^v100^pc_search_result_base8&utm_term=%E6%89%A9%E6%95%A3%E6%A8%A1%E5%9E%8B&spm=1018.2226.3001.4187
https://blog.csdn.net/DFCED/article/details/132394895?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522172338448616800225548662%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=172338448616800225548662&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-132394895-null-null.142%5Ev100%5Epc_search_result_base8&utm_term=%E6%89%A9%E6%95%A3%E6%A8%A1%E5%9E%8B&spm=1018.2226.3001.4187
6. 文生图模型(Text-to-Image Models):
- 基于 GAN 的文生图: 早期的文生图模型多基于 GAN,通过生成器来将文本描述转化为图像。典型的例子如 StackGAN,可以逐层生成高分辨率图像。
- 基于 Transformer 和扩散模型的文生图: 随着 Transformer 和扩散模型的发展,文生图模型的生成质量得到了显著提升。如 DALL-E 和 Imagen 等模型结合了大型 Transformer 和扩散模型的优势,能够根据复杂的文本描述生成高质量、细节丰富的图像。
- Stable Diffusion(2022年): Stable Diffusion 是一种基于扩散模型的文生图生成方法,它通过结合扩散过程和大规模的文本-图像对数据训练,实现了高质量的文本到图像生成。
文生图基础知识
运行过程是这样的:
1. 提示词
提示词(Prompts)是指导生成模型(如 Stable Diffusion)生成目标图像的文本描述。
-
主体描述:“一只在草地上奔跑的狗”。
-
细节描述:“一只棕色的狗在阳光明媚的草地上奔跑”。
-
修饰词:,“一只可爱的小狗在翠绿的草地上欢快地奔跑”。
-
艺术风格:现实主义、二次元等。
-
艺术家:例如,“梵高”。
2. Lora
Stable Diffusion中的Lora(LoRA)模型是将原本复杂的权重矩阵近似表示为两个更小的矩阵的乘积。LoRA最初应用于NLP领域,用于微调GPT-3等模型(也就是ChatGPT的前生)。由于GPT参数量超过千亿,训练成本太高,因此LoRA采用了一个办法,仅训练低秩矩阵(low rank matrics),使用时将LoRA模型的参数注入(inject)SD模型,从而改变SD模型的生成风格,或者为SD模型添加新的人物/IP。通过引入低秩矩阵,LoRA 只需微调一小部分参数,能够大幅减少训练时间和计算资源!
- Lora 适用于迁移学习场景,即在已经预训练的模型上进行任务特定的调整。因为预训练模型的知识可以通过低秩矩阵的适应来转移到新的任务中,节省了重新训练整个模型的时间和资源。
*Lora原理
假设你有一个已经训练好的图像生成模型(如 Stable Diffusion)……
- 加载预训练模型
- 引入 LoRA 层
- 微调模型:设置 LoRA 参数
lora_model = LoRA(pretrained_model, rank=4) lora_model.train(impressionist_dataset)
- 生成图像
3. ComfyUI
ComfyUI 是一个工作流工具,主要用于简化和优化 AI 模型的配置和训练过程。在ComfyUI平台的前端页面上,用户可以基于节点/流程图的界面设计并执行AIGC文生图或者文生视频的pipeline。
4. 参考图控制ControlNet
ControlNet用于增强稳定扩散(Stable Diffusion)模型的能力,使其能够更好地控制生成图像的特定特征。通过引入额外的控制信号,用户能够更具体地指导图像生成各个方面(如姿势关键点、分割图、深度图、颜色等)。
OpenPose姿势控制是一个姿势检测工具,可以从图像或视频中提取人体的关键点(例如关节的位置),并生成一个骨骼图。
|
Canny精准绘制通过 Canny 边缘检测,提取图像中的主要轮廓
*和opencv的Canny Canny 边缘检测是一个经典的图像处理算法,用于提取图像中的边缘信息。OpenCV 是一个开源的计算机视觉库,其中包含了 Canny 边缘检测的实现(通过 |
Hed绘制能够在多尺度下检测到更加细致的边缘
|
深度图Midas从单张图像中预测每个像素的深度信息,即相机与场景中物体之间的距离。
|
颜色color控制提供一个颜色参考图来引导模型生成特定色调或颜色分布
|
先安装好库们:
pip install diffusers
pip install transformers
pip install controlnet
# 加载所有需要的检测器
openpose = OpenPoseDetector.from_pretrained("lllyasviel/ControlNet")
canny = CannyDetector()
hed = HEDDetector()
midas = MidasDetector()
color = ColorDetector()
#加载图像
image = load_image("input_image.png")
# 生成特定特征的图像
openpose_image = openpose(image)
canny_image = canny(image)
hed_image = hed(image)
depth_image = midas(image)
color_image = color(image)
# 可以依次应用不同的控制器
generated_image = model(prompt="A futuristic cityscape", controlnet=controlnet, image=openpose_image).images[0]
generated_image.save("output_combined.png")
#最后获取,比如通过ControlNet进行边缘控制生成图像
generated_image = model(prompt="A city skyline", controlnet=controlnet, image=canny_image).images[0]
generated_image.save("output_canny.png")
Baseline运行问题
简要概述
导入库:首先,代码导入了需要用到的库,包括 data-juicer 和微调的工具 DiffSynth-Studio
数据集构建:下载数据集kolors,处理数据集
模型微调:模型微调训练,以及加载训练后的模型
图片生成:调用训练好的模型生成图片
参考教程过程顺利,针对不明白的点进行了探索:
1. 为什么需要手动重启Notebook?
虽然很常见,但是忘掉会很麻烦。有些库在安装后会更新环境变量,只有在重启 kernel 后,这些变量才能被正确加载和使用;重启 kernel 可以清理内存,释放资源;还有python路径更新。
2. 图片生成参数
torch.manual_seed(0)
image = pipe(
prompt="二次元,一个蓝色长发小女孩,在海滩上坐着,双手托着腮,看向远方,全身,白色连衣裙",
negative_prompt="丑陋、变形、嘈杂、模糊、低对比度,扭曲的手指,多余的手指",
cfg_scale=4,
num_inference_steps=50, height=1024, width=1024,
)
image.save("1.jpg")
cfg_scale
(即配置比例或条件比例)用于调节生成的结果如何受输入条件(如提示、描述或边缘图)的影响。
- 较高的
cfg_scale
值通常会提高生成图像的质量和一致性,因为模型会更加强调条件信息,从而生成更符合提示的图像。然而,如果cfg_scale
设置得过高,可能会导致过度拟合提示,生成的图像可能会变得不自然或偏离其他创意方向。- 较低的
cfg_scale
值则允许生成的图像有更多的自由度,可能会导致结果与输入条件不够一致,但可能会带来更多的创意和变异性。
3.LoRA部分学习
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)
--lora_rank 16
:
lora_rank
是 Low-Rank Adaptation (LoRA) 的一个参数。LoRA 是一种用于降低模型训练成本的技术,它通过在原始模型的基础上引入低秩矩阵来进行适配。lora_rank
参数指定了这些低秩矩阵的秩。这里的16
表示低秩矩阵的秩是 16。
--lora_alpha 4.0
:
lora_alpha
是 LoRA 的另一个关键参数,控制低秩矩阵的缩放因子。它影响低秩适配的强度或重要性。这里的4.0
表示低秩矩阵的缩放因子为 4.0。
--pretrained_unet_path
:
- 这个参数指定了预训练的 U-Net 模型的路径。U-Net 是一种常用于图像分割和生成任务的神经网络架构。
--pretrained_text_encoder_path
:
- 指定了预训练的文本编码器的路径。文本编码器用于将输入的文本转换成特征表示。
--pretrained_fp16_vae_path
:
- 指定了预训练的变分自编码器(VAE)的路径。VAE 是一种生成模型,通常用于生成任务。
fp16
表示该模型以半精度浮点数格式存储,以节省内存和计算资源。
--dataset_path
:
- 指定了训练数据集的路径。
data/lora_dataset_processed
表示数据集已经处理过,并准备好用于训练。
--output_path
:
- 指定了模型训练后的输出路径。在这个例子中,模型会被保存到
./models
目录下。
--max_epochs 1
:
- 指定了最大训练轮数。在这里,训练轮数为 1,即仅训练一轮。
--center_crop
:
- 这个选项启用中心裁剪。这通常是对输入图像进行裁剪以适应模型的输入尺寸。
--use_gradient_checkpointing
:
- 启用梯度检查点。这是一种技术,用于在训练过程中节省内存,通过重新计算中间激活值来减少内存使用。
--precision "16-mixed"
:
- 指定训练过程中使用的数值精度。
16-mixed
表示混合精度训练,使用 16 位和 32 位浮点数的混合,以提高训练速度并减少内存使用。
结果和待解决的问题
生成的结果很好,纱裙用透明的方式表现出来,虽然手指藏起来了……
写实风也不错,遗憾的是,”数学公式“尚未被理解……这看起来像魔法文字
接下来会尝试调试
从零入门AI生图原理&实践 是 Datawhale 2024 年 AI 夏令营第四期的学习活动(“AIGC”方向),基于魔搭社区“可图Kolors-LoRA风格故事挑战赛”开展的实践学习——
-
适合想 入门并实践 AIGC文生图、工作流搭建、LoRA微调 的学习者参与
完整操作
这里是其他同学发布的流畅完整的操作过程,跳转直达
赛事
可图Kolors-LoRA风格故事挑战赛 | ||
---|---|---|
赛事链接 | https://tianchi.aliyun.com/s/ce4dc8bf800db1e58d51263ff357d28f | |
赛事任务 |
| |
评分规则介绍 | 1、主观评分由评委对参赛作品进行投票,评审标准可以从技术运用(40%)、组图风格连贯性(30%)、整体视觉效果(30%)几方面进行评判投票。 | 2、客观评分美学分数仅作评价提交是否有效的标准,其中美学分数小于6(阈值可能根据比赛的实际情况调整,解释权归主办方所有)的提交被视为无效提交,无法参与主观评分。 |
此外,我们会核实选手上传的模型文件,赛选手需提交训练的LoRA 模型文件、LORA 模型的介绍、以及使用该模型生成的至少8张图片和对应 prompt,以便我们能够复现生成效果,对于生成效果明显无法复现的,取消获奖资格。 | ||
任务提交格式说明 | 选手在天池平台后,需在魔搭平台上提交作品。步骤如下: | |
1、将训练好的LoRA 模型上传到魔搭模型库
| 2、作品发布在比赛品牌馆讨论区,魔搭社区
| |
赛程安排 | 初赛:报名后-2024年8月31日23:59 进入决赛标准:2024年9月2日,从初赛作品中结合专业技术评委+人气投票筛选30组选手入围决赛(客观评分+评委主观评分) | 决赛:2024年9月5日答辩展示,线上决出一二三等奖(评委主观评分) |
奖项设置 | 奖项 奖金 一等奖(第1名) 10000元*1 二等奖(第2-4名) 3000元*3 三等奖(第5-10名) 1000元*6 人气奖(10个) 500元天猫超市卡*10 | |
数据集分析 | 官方提供了示例数据集,但我们实际上可以自行寻找所需的数据集,用来训练自己的LoRA模型。 |