文章目录
前言
之前的文章讲了Stable diffusion的基本使用技巧——SD基本使用技巧,接下来主要介绍一下相关插件的使用。本文介绍Face Editor插件的使用和内部理论逻辑,该插件能够很大程度缓解面部崩坏的问题。感兴趣的同学可以仔细看一下整个pipeline,作者的思路还是挺有意思的。
零、关于插件安装
webui可以直接使用交互界面进行安装,只需要提供对应的github链接就行了。
如果无法通过该方式安装,可以尝试将代码下载到本地,然后将文件夹放在/stable-diffusion-webui/stable-diffusion-webui/extensions文件夹中
一、Face Editor使用
github:https://github.com/ototadana/sd-face-editor
选中enabled,输入面部表情prompt即可,可以选择重新绘制的影响区域,如面部,头发,帽子,脖子。 更多详细使用情况可看下面的tips!!!
二、Tips
1)如果对面部轮廓感到不舒服,尝试增加“Mask size”值。这种不适通常发生在面部不正前方的时候。
2)当多个face靠近时,一个face可能会在另一个face的影响下崩溃。在这种情况下,启用“use minimal area”。
3)对于多张face,可以使用由||(两条垂直线)分隔的提示词来定义每个面部的表情。
还有一些更复杂的tips,可能需要改变配置文件等复杂操作,可参考github源码。
三、pipeline与相关组件
1. Face Detector
1.1. RetinaFace
paper:https://arxiv.org/pdf/1905.00641.pdf
RetinaFace是19年基于RetinaNet的专用人脸检测网络,我这里简单介绍一下:
1)模型方面
模型主要基于RetinaNet引入了SSH架构(其实就是并行卷积,类似于经典GoogleNet)
2)loss方面
RetinaFace损失函数如下所示,前两项和 SSD目标检测原理详解的损失函数类似,即:分类损失(确定框中是否为人脸),BBOX回归损失;此外还增加了关键点回归损失和Dense Regression分支带来的损失,这个分支就是将2D的人脸映射到3D模型上,再将3D模型解码为2D图片,然后计算经过了编解码的图片和原始图片的差别。
1.2. lbpcascade_animeface
这个检测器其实就是基于lbp算子提取人脸特征,然后用cascade分类器进行人脸检测。
细节可参考:https://www.jianshu.com/p/c9d4b9ac1009
其代码非常简单:
import cv2
import sys
import os.path
def detect(filename, cascade_file = "../lbpcascade_animeface.xml"):
if not os.path.isfile(cascade_file):
raise RuntimeError("%s: not found" % cascade_file)
cascade = cv2.CascadeClassifier(cascade_file)
image = cv2.imread(filename, cv2.IMREAD_COLOR)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
gray = cv2.equalizeHist(gray)
faces = cascade.detectMultiScale(gray,
# detector options
scaleFactor = 1.1,
minNeighbors = 5,
minSize = (24, 24))
for (x, y, w, h) in faces:
cv2.rectangle(image, (x, y), (x + w, y + h), (0, 0, 255), 2)
cv2.imshow("AnimeFaceDetect", image)
cv2.waitKey(0)
cv2.imwrite("out.png", image)
if len(sys.argv) != 2:
sys.stderr.write("usage: detect.py <filename>\n")
sys.exit(-1)
detect(sys.argv[1])
2. Face Processor
这部分主要是面部处理流程,基于图生图流程编写和面部修复的规则设定,比如设置mask size和人脸分割的部分。整个组件的基本流程如下:
此脚本执行以下步骤:
2.1. img2img
step0
首先,根据提示和其他设置,像往常一样生成图像。这个脚本充当这些图像的后处理器。
step1 人脸检测
检测图像上的人脸。
step2 裁剪和调整人脸的大小
裁剪检测到的人脸图像,并将其大小调整为512x512。
step3 重新创建面部
对图像运行img2img以创建新的人脸图像。
step4 粘贴人脸
调整新人脸图像的大小并将其粘贴到原始图像的位置。
step5 混合整个图像
为了删除粘贴图像时生成的边框,遮罩除面部以外的所有内容,然后运行inpaint。
2.2. Blur
该处理器将高斯模糊应用于检测到的面部区域。模糊的强度可以使用JSON配置的“params”中的radius参数指定。半径越大,模糊效果就越强烈。
2.3. NoOP
该面部处理器不对检测到的面部应用任何处理。当不需要人脸增强或修改,只需要检测或工作流程的其他方面时,可以使用它。
3. Mask Generator
这将作为默认工作流中的遮罩生成器进行操作。与RetinaFace人脸检测器类似,它集成到webui中,使其易于使用,无需额外的软件安装。它基于图像的面部区域,使用BiSeNet生成mask。它可以识别用户指定的“受影响区域”,包括“面部”、“头发”、“帽子”和“颈部”。此选项对其他掩码生成器无效。它包括一个回退机制,如果BiSeNet无法生成适当的掩码,它可以回退到VignetMaskGenerator。
3.1. BiSeNet
BiSeNet结构也是比较经典的实时分割网络结构,整个结构分三部分:1、Spatial Path 2、Context Path 3、Feature Fusion Module
1、Spatial Path:这个分支很简单,就是卷积+bn+relu,下采样8倍。
2、Context Path:先使用Xception快速下采样,尾部接一个全局pooling(下面哪个白色小方块),然后类似u型结构容和特征,只上采样两次,这里用到ARM,用于refine特征。之后上采样(双线性插值)到spatial path分路特征相同大小。
3、Feature Fusion Module:对细节特征和语义特征进行拼接,之后是一个类似senet的结构对信息进行整合。
损失:共有三部分损失,一部分是主loss,另外两部分相当于加了一个在context path的中间监督,三部分loss构成整个loss,比重1:1:1。
3.2. Vignette
此mask生成器通过将高斯(圆形淡出效果)应用于面部区域来创建mask。它比基于深度学习的掩码生成器在计算上要求更低,并且可以在基于深度学习(如BiSeNet或YOLO)的掩码生成器可能会遇到困难的条件下,例如在不寻常的面部方向或表情下,一致地生成掩码。当BiSeNet掩码生成器无法生成适当的掩码时,它将充当该生成器的回退掩码生成器。
总结
Face Editor插件效果还是很好的,我自己使用的情况还是很好,尤其对于生成的全身图像,脸崩的情况比较多,修复后还是很好的!!!