AIGC应用:Face Editor插件使用(面部优化)


前言

之前的文章讲了Stable diffusion的基本使用技巧——SD基本使用技巧,接下来主要介绍一下相关插件的使用。本文介绍Face Editor插件的使用和内部理论逻辑,该插件能够很大程度缓解面部崩坏的问题。感兴趣的同学可以仔细看一下整个pipeline,作者的思路还是挺有意思的。

请添加图片描述


零、关于插件安装

webui可以直接使用交互界面进行安装,只需要提供对应的github链接就行了。
请添加图片描述
如果无法通过该方式安装,可以尝试将代码下载到本地,然后将文件夹放在/stable-diffusion-webui/stable-diffusion-webui/extensions文件夹中


一、Face Editor使用

githubhttps://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插件效果还是很好的,我自己使用的情况还是很好,尤其对于生成的全身图像,脸崩的情况比较多,修复后还是很好的!!!

  • 9
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值