Stable-Diffusion实现真人AI写真

如今要拍摄一组写真,需要服装、道具、灯光、场地、布景、拍摄、后期等过程。整个过程需要统一才能形成好的写真效果。现在有了AI绘图技术,我们可以实现通过AI绘图,只用计算机计算就得到一组接近真实的写真照吗?答案是可以的!

其实基于现有的很多AI工具,都能实现真人AI写真,之前我介绍过了Stable Diffusion的WebUI和ComfyUI,今天我们仍然以所有AI绘图工具中,控图能力最强的Stable Diffusion为例,为大家深入浅出地介绍如何使用Stable Diffusion进行真人AI写真的创作。

一、如何实现

现在,我们来整理一下思路,如何利用AI实现真人写真?大致上,我们大概可以想到以下几个思路:

  • 网图AI换脸
  • AI绘图换脸
  • 真人训练AI绘图

在以上思路中,我们进一步分析拆解,可以发现其实可以得到以下几个关键步骤

  • AI换脸
  • AI绘制人物
  • 真人模型训练

我们就以其中最小关键步骤为切入点来讲解

二、AI换脸

在Stable Diffusion中进行AI换脸是十分容易的,主要得益于WebUI强大的第三方插件商店,目前常用的roop和faceSwap两款插件,可以非常方便快速的实现AI换脸

环境准备

要使用AI换脸插件,我们需要先安装在需要的环境
准备环境的过程中,可能出现各种安装错误,这里不一一列举,大家有问题可以提出来,我看到会为大家解答!

1. 安装Microsoft C++ 生成工具

  1. 进入https://visualstudio.microsoft.com/zh-hans/visual-cpp-build-tools/ 页面,点击“下载生成工具”。
  2. 打开下载的exe文件,选择“使用C++的桌面开发”,然后点击“安装”。安装会占用大约9G空间,建议选择非系统盘并预留空间
  3. 安装完成后,最好重启电脑。

2. 安装insightface

  1. 打开命令行窗口(Win+r,输入cmd,回车,可快速打开命令行窗口)
  2. 进入stable-diffusion-webui的Scripts目录下:“X:\xxx\stable-diffusion-webui根目录\venv\Scripts”
  3. 输入命令pip install insightface==0.7.3(安装特定版本)

以下换脸示例中,我们就以马斯克的一张网图为原型进行换脸替换
马斯克

roop

roop插件是WebUI中的其中一款换脸插件

安装

通过代码仓库安装:扩展->从网址安装->扩展的git仓库网址 输入https://github.com/s0md3v/sd-webui-roop.git再点击安装即可
通过代码仓库安装

通过插件商店安装:扩展->可下载->加载扩展列表 输入roop搜索,再点击安装即可
通过插件商店安装

下载模型

下载 inswapper_128.onnx 模型:https://huggingface.co/ezioruan/inswapper_128.onnx/tree/main
将下载的 inswapper_128.onnx 模型替换到 <webui_dir>/models/roop/ 目录中。

使用

安装完成之后,重启sd-webui,我们就能在文生图和图生图都看到roop插件了。roop插件的界面基本上也一目了然,大概看看就知道怎么使用了。
Roop只会修改五官、眉毛以及脸型,不会改变肤色

  1. 文生图
    我们用以下咒语先画一个帅哥出来
best quality,masterpiece,
1boy,male focus,solo,facial hair,necktie,realistic,formal,suit,brown background,black necktie,looking at viewer,upper body,beard,brown hair,shirt,jacket,tongue,white shirt,black jacket,collared shirt,stubble,brown eyes,black suit,

文生图帅哥
这时,我们还没启用roop,现在我们再启用roop,把马斯克的脸替换上去
roop
于是,我们就得到了这样的图片
融合图片

  1. 图生图
    文生图如此,那图生图其实也大同小异,我们随便从网络抓一个帅哥图片
    网络帅哥
    然后调整我们的SD参数
    SD参数
    按照普通的图生图模式,把重绘幅度拉低到0.3-0.6之间就行,当然最重要的还是启动roop换脸插件
    于是,我们最终得到这样的融合图片
    网络帅哥+马斯克

进阶使用

上面流程中,我们使用默认参数即可,其实它的界面上还有一些可调整的参数

  1. 逗号分割的面部编号
    即我们可以选择替换图片中的第几个人脸,从左往右从0开始(比如我们图片有两个人,我们要替换右边的人脸,则填1),非常适合多人脸替换,我们可以挨个进行替换

  2. 面部修复/面部修复强度
    可以选择面部修复算法为CodeFormer或GFPGAN

  • CodeFormer:对输入图片均有增强效果,如头发,脖子,衣领,脸部,修复有有纹理效果,更接近真实。适合男士脸部
  • GFPGAN:修复后的图片比较光滑,有磨皮效果。适合女士脸部
  1. 放大算法/放大倍数
    即对输入图片进行放大,可以选择不同的放大算法来保证图片放大后的质量

注意:请确保输入图像的脸部不要被头发帽子等遮挡物遮挡

faceSwap

那另一款换脸插件faceSwap其实也和roop非常类似

安装

通过代码仓库安装:扩展->从网址安装->扩展的git仓库网址 输入https://github.com/glucauze/sd-webui-faceswaplab.git再点击安装即可
通过代码仓库安装

通过插件商店安装:扩展->可下载->加载扩展列表 输入faceSwapLab搜索,再点击安装即可
通过插件商店安装

使用

faceSwap
通过faceSwap换脸,我们得到以下效果

文生图换脸

具体过程就不赘述了,同roop一样,文生图和图生图均能换脸

进阶使用

faceSwap,相比于roop来说,要稍微强大一点,它提供的功能更全,提供配置参数更多,不过大体和roop差不多,包括面部序号、面部修复、放大算法以及后重绘等。
值得一提的是,faceSwap提供了一个非常轻量的人脸模型训练功能,它只需要你提供少量图片(当然图片越多效果越好),就能轻松训练一个轻量模型,跟直接替换相比,使用训练的模型进行换脸,可以使得最终结果更像,在插件界面可以选择自己训练好的人脸模型
模型训练

总体来说,不管是roop还是faceSwap,他们都提供了一种快速便捷的AI换脸功能,在很多场景下,这样的方式,其实就能完成真人AI写真了。当然,如果你亲自去尝试了,你还是会发现这样的换脸插件在某些情况下,图片是很难达到预期的,包括脸部融合度,包括画面精细度等。因此,如果需要让写真更加“真”,我们需要继续探索其他的方式!

三、AI绘制人物

在聊真人模型训练之前,我们先要学会如何用SD绘制人物的图片。首先,让我们绘制一个美女出来吧!

1. 大模型

首先确定你要绘制的画面风格,选择一个大模型,一般来说,我会将大模型粗暴的分为写实、动漫、2.5D三大类,然后再去细分不同的画风
比如以下是我收藏的一些写实大模型
写实大模型

我们就以国风大模型为例,选择“国风汉服写实”大模型

2. lora模型

根据实际情况选择是否使用lora模型,lora模型可以是画风lora、可以是人物lora、也可以是特定部位lora
比如以下是我收藏的一些lora模型
lora模型

这里,我不需要选择lora模型

关于模型下载,我一般使用c站和国内的liblib
C站:https://civitai.com
liblib:https://www.liblib.art/

下载模型之后,保存网站上的首图首图,以及作者的一些出图建议,能更加方便下次使用

3.咒语(提示词)

提示词,是出图的关键,Stable Diffusion会根据你的提示词的内容、关系、以及权重等,来决定它会如何进行降噪出图。
一般来说提示词分为几个部分

  1. 画质画风词

画质词
(masterpiece:1.2), best quality, highres,extremely detailed CG,perfect lighting,8k wallpaper,
真实系:photograph, photorealistic,
插画风:Illustration, painting, paintbrush,
二次元:anime, comic, game CG,
3D:3D,C4D render,unreal engine,octane render,

画风词
Cyberpunk 赛博朋克
8bit/16bit pixel 像素风
studio ghibli 宫崎骏风格
pixel style 皮克斯风格
Chinese ink style 水墨画

  1. 画面主体描述

人物、年龄、发型,头发颜色情绪表情,衣服装束,正在干什么

  1. 环境/场景/灯光/构图

比如下雨天的咖啡厅,正面视觉、人物特写

  1. Lora(如果需要)

加载lora、hypernetwork等触发内容

  1. 负面提示词

负面提示词基本可以通用,包括一些低画质,多手多脚之类的
负面词:NSFW, (worst quality:2), (low quality:2), (normal quality:2), lowres, normal quality, ((monochrome)),((grayscale)), skin spots, acnes, skin blemishes, age spot, (ugly:1.331), (duplicate:1.331),(morbid:1.21), (mutilated:1.21), (tranny:1.331), mutated hands, (poorly drawn hands:1.5), blurry, (bad anatomy:1.21), (bad proportions:1.331), extra limbs, (disfigured:1.331), (missing arms:1.331),(extra legs:1.331), (fused fingers:1.5), (too many fingers:1.5), (unclear eyes:1.331), lowers, bad hands, missing fingers, extra digit,bad hands, missing fingers, (((extra arms and legs))),
NSFW:not Suitable For Work不适合在公开场合出现的图片

我们使用以下提示词来画一个国风汉服写实美女

best quality,masterpiece,absurdres,Highly detailed,ultra-fine painting,extreme detail description,Professional,
1girl,full body,hair ornament,holding,necklace,orange with white chest pleated skirt,red waistband,red with white waistband,tang style outfits,transparent background,
hanfu,tang style outfits,

4. 其他参数

这里的很多参数都还有各自能继续深究的点,今天重点不在这,就先略过了,有必要可以出文单独分析

  1. 采样方法:不同的采样方法适用于不同画风
  2. 迭代步数:理论上迭代步数越高,画面越精细,出图时间也越长,但也和采样方法对应,有的采样方法可以在很少的步数内就出图,后续增加的迭代步数所换来的收益就不大了
  3. 高分辨率修复:开启高分辨率修复可以让SD对图像进行二次高清重绘放大
  4. 放大算法:不同的放大算法有不同放大效果,一般写实画风推荐4x-UltralSharp或8x_NMKD_Superscale_150000_G,动漫画风推荐R-ESRGAN 4x Anime6B
  5. 宽高:定义出图尺寸,一般需要参考大模型作者或lora作者给出的参考尺寸,需要更大尺寸图片可以再通过后期放大
  6. 随机种子数:方便重现出图

最终我以如下参数(图中标注为关键参数),来绘制一张国风汉服美女图
参数
国风美女

四、lora模型训练

学会绘制美女之后,下一步我们就需要使用自己训练的lora模型去和绘制的美女融合了,那么我们就需要学习如何训练lora模型

训练步骤

训练一个自己的lora模型分为几个步骤

  1. 准备数据集:准备好需要训练的lora的数据来源
  2. 图片预处理:如果是炼制人物脸部lora,那么尽量让画面纯净,仅包含人物上半身,且只有想要训练的人脸
  3. 数据集打标签:这一步的作用是告诉AI你的图片包含什么元素

对于标签:如果你想保留人物的某个特征,就删掉对应标签,这样AI就会认为这个人就是这个特征;如果你想灵活调整某个特征,那就要把这个特征打上标签。举个例子:如果你有红色头发,你不打红色头发标签,那么炼制的lora模型很大概率会一直出红头发,即保留了这个特征

  1. 开始训练:这个过程的时间长短,取决于你的电脑配置
  2. 测试lora:除了测试训练出来的lora出图是否和原图像以外,也要测试lora的泛化程度,是否存在和原图过于拟合的情况等

工具

lora训练的方式有很多,有通过执行脚本训练,也有通过界面训练。目前比较常用的lora训练工具有sd-trainer和赛博炼丹炉。
注意训练lora对配置有一定要求,显存至少需要6G,我个人是3060ti 8G的显卡,20张图片的训练时长在三个半小时左右

炼丹工具在结尾给下载地址

1.sd-trainer

sd-trainer
一般来说,我们直接选用新手模式进行训练即可,当你真正掌握了其中参数的含义之后,再去尝试专家模型
新手模式下,我们一般只需要修改训练用的底模(即基于什么大模型进行训练),数据集目录,和模型保存名称即可,其他参数如训练轮数,学习率等,都可以在熟悉了训练流程之后再做调整

其中,WD1.4标签器可以帮助对目录下的图片自动打标签(对应前面数据集打标签步骤)
WD1.4标签器

2.赛博炼丹炉

赛博炼丹炉
赛博炼丹炉相对来说界面更加友好,基本上按照界面提示一步一步走即可

  1. 选择大模型,训练风格,召唤词
    根据自己的需求,来选择大模型和风格

选择

  1. 上传数据集图片
    上传训练数据集,训练人物lora尽量为半身像,最好包含人物各个角度的照片

上传数据集图片

  1. 设置预处理参数
    设置训练分辨率(1.5模型一般默认为512x512),模式以及是否勾选脸部加强(训练人物脸部lora要勾选)

上传数据集图片

  1. 数据集打标签

点击预处理之后,炼丹炉会对图片进行人脸识别和裁剪,以及自动打标签
预处理

我们需要对标签再做一遍筛选,看看AI识别的标签是否正确,进行一遍校正
image-1709474293871

  1. 开始训练
    没有问题之后,就可以开始训练,训练时间取决于你的电脑配置

lora测试

不管是sd-trainer还是赛博炼丹炉,训练完成之后,都会得到几个训练好的模型文件,模型文件数量根据你的配置决定,对于赛博炼丹炉来说,默认是每一轮训练结束都生成一个lora模型文件
以下是我之前训练的lora模型
lora模型

训练完成之后,我们就要对这些模型进行测试了,我们需要以1-10(假如训练为10轮,生成了10个lora模型)的全部模型和0.1-1的全部强度两个维度来进行测试,这块我们可以使用stable diffusion的xyz脚本来进行一个测试,最终确定哪个模型下的哪个强度,是我们训练效果最好的

我之前训练的lora模型的真人原型,后续出图示例也以这个原型为准
真人原型

比如我之前训练的模型有iris_20240125002809-000001.safetensors到iris_20240125002809-000010.safetensors,那么我就可以在正想提示词引入lora时,使用参数替换

<lora:iris_20240125002809-MODEL:STRENGTH>

并且在最下方选择使用XYZ脚本进行出图

XYZ参数

配置正向提示词加入“银色头发”,这样,我们能测试lora的泛化程度

(silver hair:1), best quality, masterpiec8K.HDR. highresabsurdres:1.2, Kodak portra 400, film grain, blurrybokeh:1.2, lens flare, (vibrant color:1.2),1girl, red dress, looking at viewer

这样,就能得到一个以模型和强度为维度的二维xyz图表
xyz图表

通过观察xyz图表,我们就可以很快的找到在相似度和泛化度都很合适的lora模型以及使用强度(既很相像,又能出现银色头发)

五、真人AI写真

经过以上一系列步骤,我们就真的可以开始出AI写真了
使用训练的lora模型出真人AI写真,也有几种方式

1. lora文生图直出

这个很好理解,直接用到我们上面提到的绘制美女的方法,加上我们提炼的lora即可

best quality,masterpiece,absurdres,Highly detailed,ultra-fine painting,extreme detail description,Professional,
1girl,full body,hair ornament,holding,necklace,orange with white chest pleated skirt,red waistband,red with white waistband,tang style outfits,transparent background,
<lora:iris_v1_000006_0.7-1:0.8>,hanfu,tang style outfits,

文生图+lora直出

不难发现,虽然生成的美女很漂亮,但是她和原型差的太多了,主要原因是人脸在画面占比太小导致,如果是半身像或近摄,这个相似度会更高

2. 文生图+lora换脸

为了解决全身像相似度太低的问题,有一种解决方式是使用SD中的强大的修脸工具——ADetailer。可能大家知道ADetailer能修复崩坏的人脸,但是不知道大家有没有注意到,ADetailer是可以配置提示词的,也就是说,我在修脸的时候,可以用上自己的lora来进行修脸
ADetailer修脸
提示词中,我们去掉人物lora,仅仅使用ADetailer中的lora,我们再试一次

best quality,masterpiece,absurdres,Highly detailed,ultra-fine painting,extreme detail description,Professional,
1girl,full body,hair ornament,holding,necklace,orange with white chest pleated skirt,red waistband,red with white waistband,tang style outfits,transparent background,
hanfu,tang style outfits,

文生图+lora换脸

这样一来,这个美女就和原型很像了,但是你可能也发现了,原型的人物脸型更饱满,而这个美女,是个很明显的锥子脸,虽然更好看了,但是相似度也就降低了,那这个我们有办法解决吗?
当然了,如果对方要求,我就是想要锥子脸,那么到这一步,就够了

3. lora文生图+lora换脸

解决脸型问题,其实也不难,还记得我们之前去掉了提示词中的人物lora的引用吗?其实只要这里也引用lora,情况就会好很多。首先,我们在文生图时,就以我们的人物lora为基准出图,那么脸型一定是相像的,其次,我们再使用ADetailer进行lora换脸,相当于对自己的脸型再做一次换脸,那它的融合度一定是更高的

best quality,masterpiece,absurdres,Highly detailed,ultra-fine painting,extreme detail description,Professional,
1girl,full body,hair ornament,holding,necklace,orange with white chest pleated skirt,red waistband,red with white waistband,tang style outfits,transparent background,
<lora:iris_v1_000006_0.7-1:0.8>,hanfu,tang style outfits,

lora文生图+lora换脸

4. 文生图+图生图+lora换脸

除了lora文生图以外,我们也可以去掉人物lora来出图,正常绘制美女图,然后通过图生图的ADetailer加lora去做脸部替换,可以通过批量出图,总会有融合度高的脸型。
当然了,这种方式也适用于直接使用网图来进行lora换脸

以上就是通过lora来AI出图的几种方式了,我们再做个简单的总结

方式 优点 缺点 适用场景
lora文生图直出 人脸占比大的近摄画面相似度高,脸部边缘无融合问题 人脸占比小的全身像画面相似度低 半身像,特写像
文生图+lora换脸 解决全身像相似度低的问题 可能出现绘制人物与lora脸型等特征不像的问题,Adetailer易出现脸部边缘边界线 全身像
lora文生图+lora换脸 解决脸型不像的问题 Adetailer易出现脸部边缘边界线 全身像
文生图+图生图+lora换脸 不要求出图过程,可用任意图片脸部替换 Adetailer易出现脸部边缘边界线 其他图片脸部替换

六、AI画手的问题

这个问题,从根上来说,是目前AI算法的通病,很难彻底解决,尽管我们会在负面提示词加很多防止手部崩快的提示词

missing fingers,extra fingers,fused fingers,too many fingers,bad hands,mutated hands,badhandv4

但是你画多了就会发现,并没有什么用,手该崩还是崩,唯一可能好点的可能是某些比较好的模型,对手部训练的比较好,不太容易崩坏
如果你看的足够仔细,你可能也发现了我上面的示例图中,就有手部崩坏的问题。

不管是手部崩坏,还是六指琴魔,解决问题的关键有几个思路:

1. 尽量隐藏手

没错,既然手画的不好,那我们就把手藏起来!有两种方式,要么直接把图片裁切截掉;要么我们可以通过ControlNet的openPose改变人物姿态,让她的手伸出屏幕外

2. 手部优化lora

我个人也收藏了好几个手部优化的lora,有的时候是管用的,有的时候修复的手反而和画面不够融合;并且使用lora优化手,其lora本身很可能会侵入我的整体画面结构,甚至是改变画风
手部优化lora

3. ControlNet深度手部细化

ControlNet深度手部细化

4. ADetailer修手

ADetailer修手

5. 图生图手部重绘

总之,目前还没有解决手部难题的完美方案,只能是多多尝试吧!

其他方式

其实实现AI写真,还有很多方式,但因为我没有亲自尝试,就不再细写

  1. EasyPhoto:据说是个非常厉害的插件,最少只要8张照片,就能完成AI写真,但我本人因为电脑配置问题,在训练模型那一步显存就扛不住了,所以没继续尝试
  2. ComfyUI方式:以上内容都是基于WebUI的AI写真方式,我暂时还没尝试使用ComfyUI进行AI写真,后续准备尝试一下,使用ComfyUI之后,我的电脑甚至可以出SDXL图,很想知道以SDXL来出真人AI写真是什么体验,应该会非常惊艳!

工具下载

  1. 赛博炼丹炉
    链接:https://pan.quark.cn/s/8818001eafbe
    提取码:jku5

  2. sd-trainer
    链接:https://pan.quark.cn/s/569729ed0d64
    提取码:5xLQ