原作者的解释文档,说的非常详细,可以对着文档进行分析,分为两个阶段,一个是训练流程,一个是推理流程,整个过程还是很复杂的,这里面应该有很多可以优化的地方。在训练阶段,经过了图像预处理得到图像排序,再经过人像分割得到人像区域,使用lora训练,lora的结果通过img2img来验证;推理阶段,用用户上传的最正的图像作为参考图像,与模版图像的人脸融合图作为canny图,模板图与训练后产生的lora换脸,作为openpose图,在人脸融合图基础上进行多次lora和controlnet得到最终结果。
训练流程:
用户上传图片,会对图片进行预处理,再lora训练。
1.人像得分排序
人像排序包括:人脸特征向量,图像质量评分,人脸偏移角度。
人脸特征向量,利用retinaface检测脸,并对齐,使其成为标准脸,利用人脸特征提取模型curricularface提取特征量,先计算人像的平均特征,然后计算每一张图片和平均特征的相似程度,相似程度是0-1的相似度分数;图像质量评分;人脸偏移角度,计算双眼的旋转角度,眼睛连线相对于水平线的倾斜角,偏移角为0,得分为1,偏移角为90,得分为0-1,偏移角分数0-1,并选出最正的人像在推理时作为参考人像。
人像排序:相似度分数与图像质量分数相乘,选出最高的topk个人像进行训练。
2.人像分割与修复
人脸分割,lora训练保留人像特征,因此只关注人脸区域即可,显著性分割取出背景,人脸检测选出人脸周围区域;GPEN进行人脸修复,并超分,ABPN人像美肤,产生了比较好的人像图。(lora的学习能力强,不仅能学到人像特征,还能学到模糊、噪声、不清晰等特征)
3.lora训练
kohya_ss的lora,同时训练text encoder和unet。lora模型融合,每100step保留一次lora权重,正常会训练800steps。使用一些模版图像进行img2img,保证出来的人像一定是正脸照。例如800steps,会产生800组验证结果和8个lora模型,使用验证结果与训练图片进行人脸特征向量提取,进行人脸相似度计算,然后选择其中最佳的几个lora模型进行融合,由于每组验证结果包含多张(4),会根据每组验证结果 被选中的比例 作为这个lora模型所占的比重。
推理流程:
1.初步重建
1.1 人脸融合
reference photo是计算偏移角时选出的最正的人像,作为目标脸型进行人脸融合,人像重建是img2img完成,人脸融合算法用于提供一个比较好的基础图片,这样的结果就更像用户,在sd中提供canny。
1.2 人脸裁剪与放射变换
在完成训练后,可以获得一张与用户最为相似的图片,这张图片也是生成的,但是在训练的过程中会将所有的验证图片与训练图片进行人脸相似度比对。裁剪这个人像的图片并且进行放射变换,利用5个人脸关键点,将其贴到模版图像上,获得replaced image,这个图像会在下一步sd重建时使用,提供openpose。
1.3 stable diffusion重建 + 颜色转移
在1.1中完成人脸融合,下一步是使用lora重建,但是光用lora是不够的,还要结合controlnet,从推理图上人脸融合和放射变换似乎重合了,但是他们是提供不同的controlnet模式的。
使用1.1中的人脸融合图像的canny控制(防止人像崩坏)。
使用1.1中的人脸融合图像的颜色控制(使生成的颜色符合模版)。
使用1.2中replaced image的openpose+face openpose控制(使眼睛与轮廓更像本人)。
使用训练的lora。
使用mask对人脸区域进行重建。
2.边缘完善
2.1 人脸融合
再进行一次人脸融合以提升人脸的相似度。
2.2 stable diffusion重建
初步重建后可以获得一个不错的人像,但可能存在边缘上的问题,因此还设立了二次重建用于进行边缘完善,依然是lora+controlnet,但和初步重建不同,重建的是非人脸区域。
使用1.1中的人脸融合图像的tile控制(防止颜色过于失真)。
使用1.1中的canny控制(防止人脸崩坏)。
使用训练的lora。
使用mask对人像周围区域进行重建。
3.后处理
人像美肤和超分。