背景:
Gpt4多模态模型上来后,MJ也是紧接着发布了V5,微软发布自己Ai作图工具,Abode、unity这些传统老牌作图软件工具也是紧跟着发布自己的AI作图插件工具。这已经标志着Ai作图已经成为计算成像的另一条生成链。
各大厂都已经发布了这么多的工具,开箱即用。我们是否还需要学习Ai作图code层面东西?我个人的回答是必须要,确实是对于一般用户或者艺术家,只要利用工具做内容生成和创造就行,做好美的裁判和艺术的架构。但是对于想在这个行业深入发展的非艺术家和玩玩就可以的从业者,了解了底层模型原理,知道如何训练自己风格和要求的模型来为自己服务是必须的。至少有以下几大好处:
1.有自己的风格和素材积累
2.模型是自己的,想怎么用就怎么用,想怎么改就怎么改
3.可以提炼自己的生产工艺,做出自己特色
4.否则你不过是大厂模型迭代的免费标注员或者燃料而已
上面部分纯粹是自己一些想法,各位看官看看久罢。切入正题,几天前有个读者说是用想实现角色锁定,然后利用大模型的强大表征力生产不同场景和风格的图;他试了dreambooth产出图效果很差,让我帮他看看能不能训一个可用网络。这篇文章会结合这个案例来对角色锁定神器dreambooth做介绍。
技术点介绍:
角色锁定思路:
1.用需要锁定的图来调校图embbeding,调校后的embedding更好的表达要锁定的类:texual inverse
2.训练时候,在图表示的高纬空间,让每个物体元素embeding更好的解耦,这样每个embbding在高维空间就能够尽可能表示单一物体(ID),用的时候就可以锁定物体,修改背景:instructpix2pix
3.训练时候,用身份ID(特殊文字字符)和图的embedding空间anchor(为了学的更好,可以利用这类物体共享参数,相当于先锁定大类的emebbding,特殊个体在学习,锁定细节),同步会对网络参数修改;这个方法和2的区别在于2是对人类修改过程建模,这个方法是对图、文分布做调整:dreambootn
![](https://i-blog.csdnimg.cn/blog_migrate/c258218733423d094e67713f368ed056.png)
通常3-5张图像(要保证效果5-10张更好),和相应的类名(例如“狗”)作为输入,返回一个经过微调/“个性化”的文本到图像模型,该模型编码一个唯一的标识符,指代特定的主题(例如,特定的狗)。然后,在推理阶段,我们可以在不同的句子中插入唯一标识符(上图是[V]),以合成不同背景下的主题。
![](https://i-blog.csdnimg.cn/blog_migrate/e54e42000dde6a22812a8ec76579391c.png)
给定一组约3-5张主题图片,我们可以通过以下两个步骤对文本到图像扩散模型进行微调:
(a) 使用包含唯一标识符和主题类别名称的文本提示(例如,“一张[T]狗的照片”)与输入图像配对来微调低分辨率的文本到图像模型,同时并行应用类别特定的先验保持损失,利用模型对类别的语义先验,通过将类别名称注入文本提示来鼓励模型生成属于该主题类别的多样化实例(例如,“一张狗的照片”)。
(b) 使用从输入图像集中获取的低分辨率和高分辨率图像对来微调超分辨率组件,从而使我们能够保持对主题小细节的高保真度。通过微调模型,能够在不同环境下生成不同的图像,保留了主题细节并展现出场景与主题之间的真实互动。
对应两部分loss,在代码体现:
if args.with_prior_preservation:
# Chunk the noise and noise_pred into two parts and compute the loss on each part separately.
noise_pred, noise_pred_prior = torch.chunk(noise_pred, 2, dim=0)
noise, noise_prior = torch.chunk(noise, 2, dim=0)
# Compute instance loss
loss = F.mse_loss(noise_pred.float(), noise.float(), reduction="none").mean([1, 2, 3]).mean()
# Compute prior loss
prior_loss = F.mse_loss(noise_pred_prior.float(), noise_prior.float(), reduction="mean")
# Add the prior loss to the instance loss.
loss = loss + args.prior_loss_weight * prior_loss
else:
loss = F.mse_loss(noise_pred.float(), noise.float(), reduction="mean")
accelerator.backward(loss)
实操:
1.下载代码
git clone https://github.com/CrazyBoyM/dreambooth-for-diffusion.git
![](https://i-blog.csdnimg.cn/blog_migrate/f3ec0902400c774415558eef93487cfd.png)
下载完文件夹如上
2.把图片下载放到 项目datasets下的test文件夹,执行以下代码做尺寸放缩
python tools/handle_images.py ./datasets/test ./datasets/test2 --width=512 --height=512
![](https://i-blog.csdnimg.cn/blog_migrate/cabbb9c10975ff70ba5b6d607383aaa2.png)
需要训练数据放标蓝的文件夹
3.对裁剪放缩好的图片打标
python tools/label_images.py --path=./datasets/test2
![](https://i-blog.csdnimg.cn/blog_migrate/6837fe2e82149421729ed3c4942d8ac0.png)
txt文件就模型是对每张图自动打的标签,右边文件显示英文就是打的标签样子
4.开始训练
a.如果需要训练特定人、事物: (推荐准备5-10张风格统一、特定对象的图片)
sh train_object.sh
![](https://i-blog.csdnimg.cn/blog_migrate/4fe5d8a4528318f8bfee986162e159c6.png)
5.Lora实现
现在每个锁定角色就要一个模型,很浪费资源,后面文章会详细介绍如何用lora(几十M)增量学习,用更小的存储实现一样效果
小结:
1.介绍了角色锁定的三种思路
2.介绍了dreambooth为何能够通过特殊符号实现角色锁定、细节锁定
3.给了一个github,4步操作就可以实现自己的dreambooth模型
4.这个github属于几个月前项目,diffuser已经把dreambooth项目封装进库,后面在介绍lora时候会用diffuser更精简干净带大家实现dreambooth角色锁定