在视觉方向的AIGC领域,AI写真是一个靠谱且经过验证的落地方案,随着StableDiffusion领域开源社区的快速发展,社区也涌现了类似 FaceChain 这样基于 Modelscope开源社区结合 diffusers 的开源项目,用于指导用户快速开发个人写真。
然而对于大量使用SDWebUI的 AIGC 同学们,短时间内却没有一个效果足够好的开源插件,去适配真人写真这一功能。
对于AI写真而言,需要注意两个方向的重点,一个是一定要和用户像,另外一个是一定要真实。
最近我参与了一个EasyPhoto的项目,可以根据模板图像生成对应的用户写真,借助Stable Diffusion与Lora的强大生成能力,生成图片可以做到较为相似且真实,近期也开源了出来。
https://github.com/aigc-apps/sd-webui-EasyPhoto
麻烦各位朋友点个Star,这对我来讲还是很重要的!
StableDiffusion作为Stability-AI开源图像生成模型,通常分为SD1.5/SD2.1/SDXL等版本, 是通过对海量的图像文本对进行训练结合文本引导的扩散模型,使用训练后的模型,通过对输入的文字进行特征提取,引导扩散模型在多次的迭代中生成高质量且符合输入语义的图像。下面的图像就是Stable Diffusion官网贴出来的他们的效果。
EasyPhoto AI基于StableDiffusion丰富的开源社区与强大的生成能力,进而生成逼真且自然的AI写真。
ControlNet是《Adding Conditional Control to Text-to-Image Diffusion Models》提出的通过添加部分训练过的参数,对StableDiffsion模型进行扩展,用于处理一些额外的输入信号,例如骨架图/边缘图/深度图/人体姿态图等等输入,从而完成利用这些额外输入的信号,引导扩散模型生成与信号相关的图像内容。例如我们在官方 Repo 可以看到的,使用Canny边缘作为信号,控制输出的小狗。
EasyPhoto 基于多Controlnet强大的控制能力,在保留原模板特点的情况下(如颜色、光照、轮廓),生成非常自然写真图像。
由《LoRA: Low-Rank Adaptation of Large Language Models》 提出的一种基于低秩矩阵的对大参数模型进行少量参数微调训练的方法,广泛引用在各种大模型的下游使用中。AI真人写真需要保证最后生成的图像和我们想要生成的人是相像的,这就需要我们使用Lora 技术,对输入的少量图片,进行一个简单的训练,从而使得我们可以得到一个小的指定人脸(Face id)的模型。
EasyPhoto是一款Webui UI插件,用于生成AI肖像画,该代码可用于训练与用户相关的数字分身。建议使用 5 到 20 张肖像图片进行训练,最好是半身照片且不要佩戴眼镜(少量可以接受)。训练完成后,EasyPhoto可以在推理部分生成图像。EasyPhoto支持使用预设模板图片与上传自己的图片进行推理。
这些是插件的生成结果,从生成结果来看,插件的生成效果还是非常不错的:
每个图片背后都有一个模板,EasyPhoto会对模板进行修改使其符合用户的特征。
在EasyPhoto插件中,Inference侧已经预置了一些模板,可以用插件预置的模板进行体验;另外,EasyPhoto同样可以自定义模板,在Inference侧有另外一个tab页面,可以用于上传自定义的模板。如下图所示。
而在Inference预测前,我们需要进行训练,训练需要上传一定数量的用户个人照片,训练的产出是一个Lora模型。该Lora模型会用于Inference预测。
总结而言,EasyPhoto的执行流程非常简单:
1、上传用户图片,训练一个与用户相关的Lora模型;
2、选择模板进行预测,获得预测结果。
安装过程较为简单,网络良好的情况下,跳转到Extentions,然后选择install from URL。
输入https://github.com/aigc-apps/sd-webui-EasyPhoto,点击下方的install即可安装,在安装过程中,会自动安装依赖包,这个需要耐心等待一下。安装完需要重启WebUI。
直接进入到Webui的extensions文件夹,打开git工具,git clone即可。
下载完成后,重新启动webui,便会检查需要的环境库并且安装。
我们需要使用 Controlnet 进行推理。相关软件源是Mikubill/sd-webui-controlnet。在使用 EasyPhoto 之前,您需要安装这个软件源。
此外,我们至少需要三个 Controlnets 用于推理。因此,您需要设置 Multi ControlNet: Max models amount (requires restart)。
EasyPhoto训练界面如下:
点击Upload Photos后即可开始上传图片,在此处我们最好上传5-15张图片、包含不同角度、不同光照的情况;而我这里用了7张,最好有一些图片是不包括眼镜的,如果都是眼镜,生成结果里面有容易会生成眼镜。
上传完成后,我们就可以在界面上看到已经上传的图像啦!
然后我们来看右边的参数设置部分,这里参数可调节的量还是比较多的,初次训练不做调整,每个参数的解析如下:
参数名 | 含义 |
---|---|
resolution | 训练时喂入网络的图片大小,默认值为512 |
validation & save steps | 验证图片与保存中间权重的steps数,默认值为100,代表每100步验证一次图片并保存权重 |
max train steps | 最大训练步数,默认值为800 |
max steps per photos | 每张图片的最大训练次数,默认为200 |
train batch size | 训练的批次大小,默认值为1 |
gradient accumulationsteps | 是否进行梯度累计,默认值为4,结合train batch size来看,每个Step相当于喂入四张图片 |
dataloader num workers | 数据加载的works数量,windows下不生效,因为设置了会报错,Linux正常设置 |
learning rate | 训练Lora的学习率,默认为1e-4 |
rank Lora | 权重的特征长度,默认为128 |
network alpha | Lora训练的正则化参数,一般为rank的二分之一,默认为64 |
最终训练步数的计算公式也比较简单,Final training step = Min(photo_num * max_steps_per_photos, max_train_steps)。
简单来理解就是:
图片数量少的时候,训练步数为photo_num * max_steps_per_photos。
图片数量多的时候,训练步数为max_train_steps。
然后我们点击下方的开始训练,此时需要在上方填入一下User ID,比如 用户的名字,然后就可以开始训练了。
开始初次训练时会从oss上下载一部分权重,我们耐心等待即可,下载进度需要关注终端。
在自动预处理完成后,Lora模型开始训练,我们只需要耐心的等待训练完成即可!
终端显示成这样就已经训练完了,最后这步是在计算验证图像与用户图像之间的人脸 ID 差距,从而实现 Lora 融合,确保我们的 Lora 是用户的完美数字分身。
训练完后,我们需要将tab页转到Inference。由于Gradio的特性,刚训练好的模型不会自动刷新,可以点击Used id旁的蓝色旋转按钮进行模型刷新。
刷新完后选择刚刚训练的模型,然后选择对应的模板即可开始预测。初次预测需要下载一些modelscope的模型,耐心等待一下即可。预置的男生照片一般般,切到upload image,直接自己上传模板进行预测。
参数名 | 含义 |
---|---|
After Face Fusion Ratio | 第二次人脸融合的比例,越大代表越像 |
First Diffusion steps | 第一次Stable Diffusion的步数 |
First Diffusion denoising strength | 第一次Stable Diffusion重建的比例 |
Second Diffusion steps | 第二次Stable Diffusion的步数 |
Second Diffusion denoising strength | 第二次Stable Diffusion重建的比例 |
Crop Face Preprocess | 是否先裁剪人脸后再进行处理,适合大图 |
Apply Face Fusion Before | 是否进行第一次人脸融合 |
Apply Face Fusion After | 是否进行第一次人脸融合 |