EasyPhoto:基于 SD WebUI 的艺术照生成插件来啦!

news2024/10/1 19:19:29

作者 :wuziheng

背景介绍

最近,基于生成式AI技术批量产出真/像/美的个人写真应用非常受欢迎。同时,随着 Stable Diffusion 领域开源社区的快速发展,社区也涌现了类似 FaceChain 的开源项目,帮助开发者开发个性化的真人写真生成应用。越来越多开发者对这个方向投来关注,希望得到更多灵活的开发方式。

EasyPhoto项目介绍

作为FaceChain-Inpaint功能的开发团队,我们快速上线了一款基于 SD WebUI 插件生态的个性化写真生成开源插件 EasyPhoto。这款插件允许用户通过上传几张同一个人的照片,快速训练Lora模型,然后结合用户自定义的模板图片,生成 真/像/美的写真图片。

1.png

图1

项目地址: https://github.com/aigc-apps/sd-webui-EasyPhoto

欢迎大家多多提ISSUE,一同优化,让每个AIGCer都拥有自己的AI写真相机!

原理介绍

AI真人写真是一个基于 StableDiffusion和AI人脸相关技术,实现的定制化人像Lora模型训练和指定图像生成链路的集合,这里我们简单介绍我们在EasyPhoto中实现的相关技术,下图是EasyPhoto的生成链路介绍,

2.png

图2

EasyPhoto整体分为训练和推理两个阶段, 下文图3详细展示了训练阶段,上图2展示了生成阶段。

EasyPhoto生成

EasyPhoto生成采用基于开源模型StableDiffusion + 人物定制Lora的方式 + ControlNet 的方式完成艺术照生成

  1. 使用人脸检测模型对输入的指定模板进行人脸检测(crop & warp)并结合数字分身进行模板替换。
  2. 采用FaceID模型挑选用户输入的最佳ID Photo和模板照片进行人脸融合(face fusion)。
  3. 使用融合后的图片作为基底图片,使用替换后的人脸作为control条件,加上数字分身对应的Lora,进行图到图局部重绘生成。
  4. 采用基于StableDiffusion + 超分的方式进一步在保持ID的前提下生成高清结果图。

EasyPhoto训练!

3.png

图3

EasyPhoto训练采用了大量的人脸预处理技术,用于把用户上传的图片进行筛选和预处理,并引入相关验证和模型融合技术,参考图3.

  1. 采用FaceID和图像质量分数对所有图片进行聚类和评分,筛选非同ID照片。
  2. 采用人脸检测和主体分割,抠出1筛选后的人脸图片进行人脸检测抠图,并分割去除背景。
  3. 采用美肤模型优化部分低质量人脸,推升训练数据的图片质量。
  4. 采用单一标注的方案,对处理后的训练图片进行打标,并使用相关的Lora 训练。
  5. 训练过程中采用基于FaceID的验证步骤,间隔一定的step保存模型,并最后根据相似度融合模型。

我们将从在后续的章节简单介绍涉及到的相关技术的原理,更多细节也欢迎大家参考Repo的代码。(如果你已经对这一技术路线非常熟悉,欢迎直接跳到第三章 EasyPhoto & SDWebUI)

文图生成(SD/Control/Lora)

StableDiffusion

StableDiffusion作为Stability-AI开源图像生成模型,通常分为SD1.5/SD2.1/SDXL等版本, 是通过对海量的图像文本(LAION-5B)对进行训练结合文本引导的扩散模型(DiffusionModel),使用训练后的模型,通过对输入的文字进行特征提取,引导扩散模型在多次的迭代中生成高质量且符合输入语义的图像。感兴趣的同学可以参考 《stable diffusion原理解读通俗易懂,史诗级万字爆肝长文,…》, 下面的图像就是 stablediffusion 官网 Repo 贴出来的他们的效果。

ControlNet/Lora

针对使用文本控制的StableDiffusion模型,如何对生成的图像内容进行更好的控制,一直是学术界和工业界试图解决的问题,本小节介绍的ControlNet和Lora就是常用的两种技术。也是图2中使用的部分技术,用于控制边缘连贯性和指定ID生成。

ControlNet : 由《Adding Conditional Control to Text-to-Image Diffusion Models》提出的通过添加部分训练过的参数,对StableDiffsion模型进行扩展,用于处理一些额外的输入信号,例如骨架图/边缘图/深度图/人体姿态图等等输入,从而完成利用这些额外输入的信号,引导扩散模型生成与信号相关的图像内容。例如我们在官方 Repo 可以看到的,使用Canny边缘作为信号,控制输出的小狗。

4.png

图4

我们在图2中看到 StableDiffusion有2个输入,其中一个部分就是用于控制边缘连贯性和脸型提示的ControlNet,我们使用了部分的Canny边缘和OpenPose人体姿态。

Lora : 由《LoRA: Low-Rank Adaptation of Large Language Models》 提出的一种基于低秩矩阵的对大参数模型进行少量参数微调训练的方法,广泛引用在各种大模型的下游使用中。AI真人写真需要保证最后生成的图像和我们想要生成的人是相像的,这就需要我们使用Lora 技术,对输入的少量图片,进行一个简单的训练,从而使得我们可以得到一个小的指定人脸(ID)的模型。当然这一技术也可以广泛用于,风格,物品等其他指定形象的Lora模型训练,大家可以在civitai.com等相关网页上寻找自己想要的Lora模型。

人脸相关AI模型

针对AI写真这一特定领域,如何使用尽量少的图片,快速的训练出又真实又相像的人脸Lora模型,是我们能够产出高质量AI写真的关键,网络上也有大量的文章和视频资料为大家介绍如何训练。这里我们介绍一些在这个过程中,我们使用的开源AI模型,用于提升最后人脸Lora训练的效果。

在这个过程中我们大量的使用了 ModelScope 和其他Github的开源模型,用于完成如下的人脸功能

人脸模型模型卡片功能使用
FaceIDhttps://github.com/deepinsight/insightface对矫正后的人脸提取特征,同一个人的特征距离会更接近EasyPhoto图片预处理,过滤非同ID人脸 ;EasyPhoto训练中途验证模型效果;EasyPhoto预测挑选基图片
人脸检测cv_resnet50_face输出一张图片中人脸的检测框和关键点训练预处理,处理图片并抠图; 预测定位模板人脸和关键点
人脸分割cv_u2net_salient显著目标分割训练预处理,处理图片并去除背景
人脸融合cv_unet-image-face-fusion融合两张输入的人脸图像预测,用于融合挑选出的基图片和生成图片,使得图片更像ID对应的人
人脸美肤cv_unet_skin_retouching_torch对输入的人脸进行美肤训练预处理:处理训练图片,提升图片质量;预测:用于提升输出图片的质量。

EasyPhoto & SDWebUI

SDWebUI [Repo]是社区最常用的StableDiffusion开发工具,从年初开源至今,已在Github 拥有100k 的star,我们提到的文图生成/ControlNet/Lora等功能,都被社区开发者贡献到这一工具中,用于大家快速部署一个可以调试的文图生成服务,所以我们也在SDWebUI下实现了EasyPhoto插件,将上述原理提到的 人脸预处理/训练/艺术照生成全部集成到了这一插件中。

项目地址:https://github.com/aigc-apps/sd-webui-EasyPhoto

用户可以参考SDWebUI的插件使用方式进行安装使用。

EasyPhoto插件简介

EasyPhoto是一款Webui UI插件,用于生成AI肖像画,该代码可用于训练与用户相关的数字分身。

  • 建议使用 5 到 20 张肖像图片进行训练,最好是半身照片且不要佩戴眼镜(少量可以接受)。
  • 训练完成后,EasyPhoto可以在推理部分生成图像。
  • EasyPhoto支持使用预设模板图片与上传自己的图片进行推理。

图1, 图5这些是插件的生成结果,从生成结果来看,插件的生成效果还是非常不错的:

5.png

图5

每个图片背后都有一个模板,EasyPhoto会对模板进行修改使其符合用户的特征。在EasyPhoto插件中,Inference侧已经预置了一些模板,可以用插件预置的模板进行体验;另外,EasyPhoto同样可以自定义模板,在Inference侧有另外一个tab页面,可以用于上传自定义的模板。如下图所示。

6.png

图6

而在Inference预测前,我们需要进行训练,训练需要上传一定数量的用户个人照片,训练的产出是一个Lora模型。该Lora模型会用于Inference预测。

总结而言,EasyPhoto的执行流程非常简单:1、上传用户图片,训练一个与用户相关的Lora模型; 2、选择模板进行预测,获得预测结果。

安装方式一: SDWebUI界面安装

网络良好的情况下!!!在SDWebUI中跳转到Extentions,然后选择install from URL。输入https://github.com/aigc-apps/sd-webui-EasyPhoto,点击下方的install即可安装。

在安装过程中,会自动安装依赖包,这个需要耐心等待一下。安装完需要重启WebUI。

7.png

图7

安装方式二:源码安装

如果你想要使用项目源码安装,直接进入到Webui的extensions文件夹,打开git工具,git clone即可。下载完成后,重新启动webui,便会检查需要的环境库并且安装。

截屏2023-09-07 11.38.02.png

图8

其他安装项:ControlNet

EasyPhoto需要SDWebUI支持ControlNet,具体使用的相关插件是Mikubill/sd-webui-controlnet。在使用 EasyPhoto 之前,您需要安装这个软件源。

  • 此外,我们至少需要三个 Controlnets 用于推理。因此,您需要设置 Multi ControlNet: Max models amount (requires restart)

9.png

图9

EasyPhoto训练

EasyPhoto训练包含如下2个步骤 1. 上传个人图片 2. 调整训练参数 3点击训练并设置ID, 整体界面如下

10.png

图10

上传训练图片

左边是训练图片,点击Upload Photos即可上传图片,点击Clear Photos可以删除已经上传的图片

调整训练参数

上传完图片后,右边是训练参数,初次训练可不做参数调整。
在这里插入图片描述

图11

这里我们也对参数进行一个介绍

参数名含义
resolution训练时喂入网络的图片大小,默认值为512
validation & save steps验证图片与保存中间权重的steps数,默认值为100,代表每100步验证一次图片并保存权重
max train steps最大训练步数,默认值为800
max steps per photos每张图片的最大训练数,默认为200,与max train steps结合取小。
train batch size训练的批次大小,默认值为1
gradient accumulationsteps进行梯度累计,默认值为4,train batch size=1的时候,每个step相当于喂入四张图片
dataloader num workers数据加载的works数量,windows下不生效,因为设置了会报错,Linux正常设置
learning rate训练Lora的学习率,默认为1e-4
rank Lora权重的特征长度,默认为128
network alphaLora训练的正则化参数,一般为rank的二分之一,默认为64

根据上述表格最终训练步数的计算公式也比较简单。

截屏2023-09-07 14.09.05.png

简单来理解就是: 图片数量少的时候,训练步数为photo_num * max_steps_per_photos。 图片数量多的时候,训练步数为max_train_steps。

训练&设置ID

完成设置后,点击下方的开始训练,此时需要在上方填入一下User ID,比如 用户的名字,然后就可以开始训练了。

12.png

图12

观察训练

!!初次训练时会从我们预备的oss(公用)上下载一部分预训练模型的权重,我们耐心等待即可,下载进度需要关注终端。

13.png

图13

训练正常开始的相关log

14.png

图14

终端显示成这样就已经训练完了,最后这步是在计算验证图像与用户图像之间的人脸 ID 差距,从而实现 Lora 融合,确保我们的 Lora 是用户的完美数字分身。

15.png

图15

EasyPhoto预测

训练完后,我们需要将tab页转到Inference。由于Gradio的特性,刚训练好的模型不会自动刷新,可以点击Used id旁的蓝色旋转按钮进行模型刷新

16.png

图16

  • 刷新完后选择刚刚训练的模型,然后选择对应的模板即可开始预测。
  • 初次预测需要下载一些modelscope的模型,耐心等待一下即可。

预置了部分模板,也可以切到upload image,直接自己上传模板进行预测。然后我们就可以获得预测结果了。

17.png

图17

预测参数说明

关于预测界面的部分参数说明

参数名含义
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是否进行第一次人脸融合

写在最后

EasyPhoto全部使用来自开源社区的模型和相关技术,旨在探讨StableDiffusion在AIGC X 真人写真领域的技术和相关应用,文章所有涉及的图片仅做演示使用,如有侵权请及时联系我们,也请大家引用时表明转载!!!。

非常欢迎大家下载试用,并参与开发,共建真像美的AI写真!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/983565.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

14 合并区间

合并区间 题解1 左端点排序后合并(可证连续,贪心)题解2 双指针(优化) 以数组 i n t e r v a l s intervals intervals 表示若干个区间的集合,其中单个区间为 i n t e r v a l s [ i ] [ s t a r t i , e n…

计算机视觉-OpenCV入门讲解

🎉作者简介:在读计算机研究生,目前研二。主要研究方向是人工智能和群智能算法方向。目前熟悉python网页爬虫、机器学习、计算机视觉(OpenCV)、群智能算法目前正在学习深度学习的相关内容。 📃个人主页&…

jar包或exe程序设置为windows服务

最近在使用java和python制作客户端时突发奇想,是否能够通过一种方法来讲jar包和exe程序打包成windows服务呢?简单了解了一下是可以的。 首先要用到的是winSW,制作windows服务的过程非常简单,仅需几步制作完成,也不需要…

2023 Google 开发者大会

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…

C++(Liunx) 使用cut截 取出Ubuntu用户的家目录,要求:不能使用“:“作为分割.

使用cut截 取出Ubuntu用户的家目录,要求:不能使用":"作为分割

spawnsync pnpm.cmd enoent

解决: 安装pnpm npm install pnpm -g

深入解析JDK 8 HashMap

HashMap 简介 HashMap 主要用来存放键值对,它基于哈希表的 Map 接口实现,是常用的 Java 集合之一,是非线程安全的。 HashMap 可以存储 null 的 key 和 value,但 null 作为键只能有一个,null 作为值可以有多个 JDK1.8…

自从学会了ChatGPT,我就再没加过班

不会吧不会吧,竟然还有程序员没学会ChatGPT?据说早学会ChatGPT的程序员已经开挂了! 不仅实现了按时下班的人生理想,还拥有了升职加薪的意外收获,在开挂人生的另一边却仍有人担心自己会被ChatGPT取代!因为C…

【高阶数据结构】红黑树 {概念及性质;红黑树的结构;红黑树的实现;红黑树插入操作详细解释;红黑树的验证}

红黑树 一、红黑树的概念 红黑树(Red Black Tree) 是一种自平衡二叉查找树,在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。 通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有…

A145-FR04HS-60变量柱塞泵控制比例放大器

本比例放大器驱动电比例泵、比例压力阀、比例流量阀、比例减压阀、比例方向阀、比例插装阀、比例溢流阀、比例节流阀、比例换向阀控制。 输入指令、最大、最小电流、上升、下降斜坡时间、颤振频率等可现场设置; 带数码显示,可查看设置参数及故障报警提…

vue-cli中总提示组件没有正确注册

这里写目录标题 一、报错提示二、修改办法 一、报错提示 二、修改办法 <template><div><aside-component style"width: 15%"></aside-component></div> </template><script> import AsideComponent from /components/Asi…

JAVA毕业设计096—基于Java+Springboot+Vue的在线教育系统(源码+数据库+18000字论文)

基于JavaSpringbootVue的在线教育系统(源码数据库18000字论文)096 一、系统介绍 本系统前后端分离 本系统分为管理员、用户两种角色(管理员角色权限可自行分配) 用户功能&#xff1a; 注册、登录、课程预告、在线课程观看、学习资料下载、学习文章预览、个人信息管理、消息…

06-JVM对象内存回收机制深度剖析

上一篇&#xff1a;05-JVM内存分配机制深度剖析 堆中几乎放着所有的对象实例&#xff0c;对堆垃圾回收前的第一步就是要判断哪些对象已经死亡&#xff08;即不能再被任何途径使用的对象&#xff09;。 1.引用计数法 给对象中添加一个引用计数器&#xff0c;每当有一个地方引…

最新暴力破解漏洞技术详解

暴力破解漏洞简介 暴力破解漏洞的产生是由于服务器端没有做限制&#xff0c;导致攻击者可以通过暴力的手段破解所需信息&#xff0c;如用户名、密码、短信验证码等。暴力破解的关键在于字典的大小及字典是否具有针对性&#xff0c;如登录时&#xff0c;需要输入4位数字的短信验…

无涯教程-JavaScript - DEC2BIN函数

描述 DEC2BIN函数将十进制数转换为二进制数。 语法 DEC2BIN (number, [places])争论 Argument描述Required/Optionalnumber 要转换的十进制整数。 如果number为负数,则将忽略有效的位置值,并且DEC2BIN返回10个字符(10位)的二进制数字,其中最高有效位是符号位。其余的9位是幅…

使用多线程或异步技术提高图片抓取效率

导语 图片抓取是爬虫技术中常见的需求&#xff0c;但是图片抓取的效率受到很多因素的影响&#xff0c;比如网速、网站反爬机制、图片数量和大小等。本文将介绍如何使用多线程或异步技术来提高图片抓取的效率&#xff0c;以及如何使用爬虫代理IP来避免被网站封禁。 概述 多线…

【无监督学习之聚类】

聚类 0.简介距离 和 相似度1. K均值聚类(kmeans)模型算法特点 2. 谱聚类(Spectral clustering)算法思想特点谱聚类的具体步骤&#xff1a;算法步骤&#xff1a; 3.小结参考资料 0.简介 聚类&#xff1a;针对给定的样本&#xff0c;依据他们的属性的相似度或距离&#xff0c;将…

spring---第一篇

系列文章目录 文章目录 系列文章目录一、如何实现一个IOC容器二、spring是什么?一、如何实现一个IOC容器 1、配置文件配置包扫描路径 2、递归包扫描获取.class文件 3、反射、确定需要交给IOC管理的类 4、对需要注入的类进行依赖注入 配置文件中指定需要扫描的包路径 定义一些…

【漏洞复现】H3C路由器信息泄露任意用户登录

漏洞描述 通过访问特地址得到密码可进行登录。 免责声明 技术文章仅供参考&#xff0c;任何个人和组织使用网络应当遵守宪法法律&#xff0c;遵守公共秩序&#xff0c;尊重社会公德&#xff0c;不得利用网络从事危害国家安全、荣誉和利益&#xff0c;未经授权请勿利用文章中…

【gcc 报错】/usr/bin/ld: this linker was not configured to use sysroots

解决方法&#xff1a;只需把/usr/bin环境变量设置在前面&#xff0c;系统先查找到该目录下的ld即可 vim /etc/profileexport PATH/usr/bin:$PATHsource /etc/profile