背景目标
平时都是在用 AI 工具生成美女写真,审美已经麻木疲劳了,翻来覆去就那么几样,所以我想下定决心自己亲手实现一次模型训练和生成过程。一旦把整个工程的流程走通,就可以按照自己的兴趣爱好,搜集相应的图片生成自己想要的内容。
目标是:
- 实现扩散模型,并生成美女写真图片
前期准备
- Stable Diffusion WebUI
- tensorflow-gpu 2.10
- Anaconda 虚拟环境
- Python 3.10
- 显卡 4090
数据生成
手头没有那么多美女图片,怎么办?灵机一动,利用 Stable Diffusion 生成一波。选择 麦橘写实 基础模型,填入常见的正向和负面提示词,主要是 '一个美丽的女孩'、'面部特写'、'看着观众'、'微笑' 等提示词。每次生成 100 张图片,生成了 10 次,剔除了吓人的鬼图,剩下了 972 张图片,效果如下,都是美女的写真。用 Stable Diffusion 生成的美女图来当作我的扩散模型的训练数据,然后用扩散模型再去生成美女图片,这简直是递归妙用。

理论基础

整个论文中对于模型的数学推导很复杂,涉及到很多高数的内容,但是最后繁重求简之后,得到的结论却是非常简单的,我们可以直接使用结论来复现模型的结构。要实现扩散模型生成数据需要两步:
训练阶段:使用定义好的 超参数 在 不同时间步 对 原图 进行添加 不同程度的噪声,这些噪声作为我们的 标签,然后使用 扩散模型 生成 预测噪声,计算 预测噪声 和 原噪声 的损失值,最后计算梯度 更新扩散模型,不断重复这个过程直到收敛。
采样阶段:模型训练好,从一个正态分布的 全噪声图 中,不断使用 扩散模型去噪,逐渐 生成原图。
扩散模型
扩散模型主要使用的是 Unet 的网络结构框架,U-Net 的最初是应用在 医学图像分割,但是扩散模型在此基础上进行了些变化,主要有 6 个部分:
- 编码器(Encoder)部分:U-Net 的编码器部分由多个
卷积层组成,用于从输入图像中提取特征信息。这些卷积层通常包括卷积操作、激活函数和池化层。编码器的任务是逐渐降低图像分辨率,同时提取高级语义特征。 - 中间连接(Bottleneck):U-Net 的中间连接部分将编码器的输出连接到解码器的输入。这个连接允许网络在不同分辨率上
融合低级和高级特征信息,以便更好地还原细节。 - 解码器(Decoder)部分:解码器部分由多个
卷积层和 操作组成,用于逐步 的分辨率,并生成预测噪声结果。

