在视觉方向的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。
EasyPhoto在训练时默认会对训练过程进行验证,然后根据 训练过程中的验证结果,进行最优秀的几个Lora进行融合。
但这个 验证 在显存不足时容易导致 卡住,并且因为验证的频次较多,会影响一定的训练速度,如果机器的配置不足,可以尝试关闭验证来加快训练速度。
然后我们点击下方的开始训练,此时需要在上方填入一下User ID,比如 用户的名字,然后就可以开始训练了。
开始初次训练时会从oss上下载一部分权重,我们耐心等待即可,大概需要下载10G左右的资源,下载进度需要关注终端。
在自动预处理完成后,Lora模型开始训练,我们只需要耐心的等待训练完成即可!
终端显示成这样就已经训练完了,最后这步是在计算验证图像与用户图像之间的人脸 ID 相似性,从而实现 Lora 融合,确保我们的 Lora 是用户的完美数字分身。
一般来讲这个得分相似性在0.50以上是正常的情况,如果得分在0.10以下则需要检查一下环境,可能因为环境不对导致模型并未训练。
训练完后,我们需要将tab页转到Inference。由于Gradio的特性,刚训练好的模型不会自动刷新,可以点击Used id旁的蓝色旋转按钮进行模型刷新。
刷新完后选择刚刚训练的模型,然后选择对应的模板即可开始预测。
EasyPhoto仓库中预设了一些模板,template image中直接点击,即可选择模版进行预测。
预设模板的内容比较有限,可以切到upload image,直接自己上传模板进行预测。
点击upload dir可以上传多图进行批量预测,上传完成后,点击Start Generation即可批量生成。
批量生成时间较久,请耐心等待。
高级选项中包含预测中各个能够设置的参数,大概有下面这么几个,请各位同学按情况进行调整
参数名 | 参数解释 | 调整后的影响 |
---|---|---|
Additional Prompt | 正向提示词,会传入Stable Diffusion模型进行预测。 | 可以根据自身希望增加的元素调整prompt词。 |
Seed | 种子值。 | 用于保证结果的可复现性,为-1时会随机选择一个种子数。 |
Face Fusion Ratio Before | 第一次人脸融合的强度。 | 调节后会影响人物相似度,一般来讲,值越大与训练人物的相似度越高。 |
Face Fusion Ratio After | 第二次人脸融合的强度。 | 调节后会影响人物相似度,一般来讲,值越大与训练人物的相似度越高。 |
First Diffusion steps | 第一次进行Stable Diffusion的总步数。第一次Diffusion主要进行人像区域的调整,使得人像更自然。 | 调节后会影响图片质量与出图速度,一般值越大图片质量越高,出图越慢。 |
First Diffusion denoising strength | 第一次进行Stable Diffusion的重绘比例。 | 调节后会影响图片的重绘比例与出图速度,一般值越大,人像变动越大。 |
Second Diffusion steps | 第二次进行Stable Diffusion的总步数。 第二次Diffusion主要进行人像周围区域的调整,使得图片更和谐。 | 调节后会影响图片质量与出图速度,一般值越大图片质量越高,出图越慢。 |
Second Diffusion denoising strength | 第二次进行Stable Diffusion的重绘比例。 | 调节后会影响图片的重绘比例与出图速度,一般值越大,人像周围变动越大。 |
Crop Face Preprocess | 是否对人像裁剪后再处理。 | 推荐开启,假设输入的是大图,会对人像区域先做裁剪后再进行人像调整,调整结果更精细。 |
Apply Face Fusion Before | 是否进行第一次人脸融合。 | 调节后会影响是否进行第一次人脸融合,会影响人像的相似度。 |
Apply Face Fusion After | 是否进行第二次人脸融合。 | 调节后会影响是否进行第二次人脸融合,会影响人像的相似度。 如果感觉人像发虚则取消该次融合。 |
Apply color shift first | 是否进行第一次DIffusion后的色彩校正。 | 调节后会影响图片的人像自然程度。 |
Apply color shift last | 是否进行第二次DIffusion后的色彩校正。 | 调节后会影响图片的人像自然程度。 |
Background Restore | 是否进行背景的重建。 | 开启后可以对人像区域外背景进行重建,在使用动漫化模型时,可以让整个图片更和谐。 |
选择完user id与模版后,点击start generation即可开始预测。初次预测需要下载一些modelscope的模型,耐心等待一下即可。
等待一段时间后,我们就可以获得预测结果了。
多人预测需要首先设置Num of Faceid,将其设置为需要设置的人数,如画面上有两个人则设置为2:
首先是替换多个人像的情况,User ID与图片上人像从左到右对应,如下图所示:
然后是替换多个人像中单个人像的情况,User ID同样与图片上人像从左到右对应,但需要跳过的人像则使用none即可:
训练加速参考:
https://github.com/aigc-apps/sd-webui-EasyPhoto/wiki/%E8%BF%9B%E9%98%B6%E6%96%87%E6%A1%A3%E2%80%90%E8%AE%AD%E7%BB%83%E5%8A%A0%E9%80%9F
预测加速参考:
https://github.com/aigc-apps/sd-webui-EasyPhoto/wiki/%E8%BF%9B%E9%98%B6%E6%96%87%E6%A1%A3%E2%80%90%E6%8E%A8%E7%90%86%E5%8A%A0%E9%80%9F
常见问题汇总参考:
https://github.com/aigc-apps/sd-webui-EasyPhoto/wiki/FAQ