SD模特换装:Inpaint Anything
同类案例:https://cloud.tencent.com/developer/article/2365063
实例
正向: A beautiful woman wearing a white wedding dress adorned with lace, walking along the beach at sunset. Her hair is gently lifted by the breeze, and she is holding a bouquet of white roses. dynamic pose, photography, masterpiece, best quality, 8K, HDR, highres, absurdres: 1.2, Kodak portra 400, film grain, blurry background, bokeh: 1.2, lens flare
反向: nsfw, ugly, paintings, sketches, (worst quality:2), (low quality:2), (normal quality:2), lowres
例如,你有像這樣的穿著衣服的人台照片,這張是我們自己展示室拍的照片。
會用 Stable Diffusion ,不用十分钟,第一张图就出來了。
就算要做調整,一小時也都夠了。例如:
一、人台图真人化生成思路
将假人台变真人还要保留衣服,这要怎么做呢?
这时熟悉Stable Diffusion的朋友就会说:我知道,就是用图生图里Inpaint功能,然后把衣服外的地方做遮罩,让Stable Diffusion重绘。
那遮罩怎么做?如果要用手一笔笔做遮罩那太慢了,要是这样,我就不用特别出这篇。
又会有人说:我知道,先用photoshop把遮罩做出来,再用遮罩重绘功能。
这也是个方法,但现在还可以更智能。
今天我们要使用一个外挂inpainting anything,给一张照片,它可以把照片用色块分别出不同的东西。到时候我们只要选哪些色块要做成遮罩,这样子遮罩就做出来了。
然后再利用重绘的功能,在保留衣服的情况下,把假人真人化。
虽然基本的思路是这样,但是如果你自己动手操作过,你就会知道路上还是有很多的坑。
所以在这篇文章里,我不仅会手把手教你如何把假人变成真人,重要的事情是我还会告诉你我是怎么样把这些坑填平的。
现在就一一跟大家说明。
二、假人台模特真人化准备工具
这篇示范是使用 Automatic 1111 的 WebUI ,并采用 SD 1.5 的模型,我们开始准备吧!
准备 1 :inpaint anything
首先会用到 Inpaint Anything 这个外挂,请检查您的 Automatic 1111 的 WebUI 看看有没有页签 Inpaint Anything 的外挂,没有的话请安装一下
安裝 inpaint anything
到 Install from URL,輸入
https://github.com/Uminosachi/sd-webui-inpaint-anything.git
即可安装
安装好后,回到 install 页签,按下 Apply and quit 即可
准备 2 :Inpaint 专用的模型
这次我会用 epiCPhotoGasm 示范,这模型出来的品质都像是摄影大师照出来的照片,特别适合用在需要真实画面的地方。
我们今天要用的不是他的主要模型,而是要用他的 Inpaint 模型。
请到下方连结,下载它的 Inpaint 模型并安装好,准备等下使用。
https://civitai.com/models/132632?modelVersionId=201346
准备 3 :假人照
我们就用我们的例子这张
这是在自家的展示室拍的,要注意的是他是个黑色的人台,这等一下会惹出些麻烦。这边先预告。
这 3 个东西准备好后,我们就可以开始了。
三、操作示范
这个教学是用 SD 1.5 的模型来示范整个流程。
第 1 步:选 SAM 模型及下载模型
按下 Inpaint Anything 页签,会看到像这样的画面
选择要使用的语义分割模型 Segment Model ID,。我们这里选 sam_vit_l_0b3195.pth 这一个模型。如果你是刚安装好的话,这些模型还没有下载,你要 Download model 钮,它才会下
载。
第 2 步:取得实例分割图
上传图片到 inpaint anything,然后按下 Run Segment Anything 。
你会在右边看到实例分割图
第 3 步:做出初步的遮罩(mask)
如果等下我们要用重绘功能,就要把想要重绘的区域做出遮罩。那现在有语义分隔后的色块,要如何快速的做出遮罩呢?
很简单,只要拿滑鼠在想要做遮罩的色块上点一下就好,不必涂整个色块,只要有点到那个色块等一下就会变成遮罩。
因为我们希望是背景、假人等等要重绘,所以这些地方要选起来,但是但背景有些复杂,做起
来太麻烦,所以我们可以改将点选衣服上的色块,然后将 Invert Mask 打勾就好。
都点选好以后,按下 Create Mask ,你就会看到遮罩结果。
第 4 步: 查看遮罩(mask)结果
检查遮罩结果,看看有没有漏掉的,其实画面如果比较复杂,这样很难看清楚,这里有个诀窍,把旁边的 Mask Only 页签开出来。
上面有两个按钮:
Get mask as alpha of image
Get mask
这两钮按下去以后,你就可以看到遮罩有没有做好。
注意,这边的白色,才是遮罩,是未来要 AI 填充的地方,黑色是要保留的部分,不要弄错了。
第 5 步: 微调遮罩
从这个遮罩图可以发现,除了衣服以外,还有其它地方还没有被遮罩到(也就是有不该出现的
黑色线条)。
这时就手工微调一下。
回到产生遮罩的图,在上面把要加遮罩的地方涂上。如果有要增加黑色的地方,就手动画一下,然后按 Trim mask by skatch 钮,反之,要增加白色的方法,手动画一下,按 Add mask by skatch 钮。
如果觉得图太小不好涂抹,可以用按 S 将图放大,再按一次 S 即可还原。
加黑色:Trim mask by skatch 钮
加白色:Add mask by skatch 钮
涂好以后,按下 Add mask by sketch
。
接着再到 Mask Only 页签里按下 Get mask
及 Get mask as alpha of image
,是不是我们想要
的遮罩。
如果还有其它杂点,就用同样的方式修掉;如果没问题,我们就进下一步。
第 6 步:开始在 inpaint anything 里重绘
当我们的遮罩都做好以后,我们就可以开始请 stable diffusion 帮我们填充背景。
到 inpaint 页签,填上提词和反向提词。因为我想要生成出来的画面是:美丽的女人穿着婚纱,手拿着白色玫瑰。所以输入以下的提词:
A beautiful woman wearing a white wedding dress while holding a bouquet of white roses.
Dynamic pose, photography, masterpiece, best quality, 8K, HDR, highres, absurdres: 1.2,
Kodak portra 400, film grain, blurry background, bokeh: 1.2, lens flare
反向提词如下:
Nsfw, ugly, paintings, sketches, (worst quality:2), (low quality:2), (normal quality:2), lowres
选择一个 inpaint 模型,这几个模型是 inpaint anything 他预设的。
因为我们要做真实的照片,所以使用 Uminosachi/realisticVisionV51_v51VAE-inpainting 这个
模型。
按下 Run Inpainting 后,你就会拿到真人模特儿的图
看来不错,我们来多生几张。
拿到图以后,你以为这次的教学就结束了吗?
还没有!因为真的要用的话,还有些问题
- 没有办法一次出很多张图让我们挑
- 没有办法使用我们想要的模型
那怎么办呢?所以我们需要下一步。
第 7 步: 使用图生图的重绘功能
回到 Mask Only 页签,按下”Send to img 2 img inpaint”。
当您送出遮照后,会跳到图生图的 Inpaint Upload 页签。你会看到你的图片和遮罩都被传过来了
这时候熟 SD 的人就会很开心,回到熟悉的地方了,终于可以选自己喜欢的模型了。
那来选一个模型吧!这里我选 chilloutmix。
再来调图片尺寸,按下三角板后,系统自动把宽高调成和照片一样,不必我们再输入。
现在要来填提词,现在想要改一下,让美女在海边穿着婚纱,她的头发被微风轻轻吹起,她手里拿着一束白玫瑰。所以我们修改提词如下:
A beautiful woman wearing a white wedding dress adorned with lace, walking along the
beach at sunset. Her hair is gently lifted by the breeze, and she is holding a bouquet of white roses. Dynamic pose, photography, masterpiece, best quality, 8K, HDR, highres, absurdres: 1.2,
Kodak portra 400, film grain, blurry background, bokeh: 1.2, lens flare
反向提词不变:
Nsfw, ugly, paintings, sketches, (worst quality:2), (low quality:2), (normal quality:2), lowres
采样器用 DPM++ 2 M Karras ,采样步数设到 40。
其它参数都用预设,如下图:
应都准备好了,现在就生成吧!
出现了怪东西!
为什么 AI 生成的模特儿,不把衣服换好?衣服像是漂在空中一样。
难道是 Masked content 要调?目前预设是 original 。
那调成别的看看,先调成 fill
结果还是没穿好。那调成 latent noise 看看。
画面还更怪了。那难道是要用 latent nothing ?
一样没穿好!这到底怎么回事?为什么衣服总是不穿好?
所以在这边,我们就可以得到一个结论… 它坏了 ….
先别这么快下结论,这其实是我们选错模型。
第 8 步: 选择 epiCPhotoGasm Inpainting 模型重绘
刚刚衣服总是不穿好的原因很简单,我们现在在做的事是重绘,不是纯粹的生成,所以我们要用专门用来做重绘的模型。
ChilloutMix 并不是用来重绘的模型,所以我们现在要改用之前下载好的 epiCPhotoGasm_zinpainting
模型。
换了模型,我们就开始生成吧,这下应该没问题了吧!
我们来看看结果:
我们得到了一个穿上衣服的…漂亮的人台。
这又是怎么回事?刚刚衣服没穿好,现在人不见了,说好的美女呢?难道是运气不好,再生成一次看看。
结果,美女是出现了,但他胸口的黑布是怎么回事?我们并没有要这块布呀!
这原因是因为目前 mask content 的参数是 original ,它在重绘时会参照原图上的结构和颜色进行重绘,所以才会出现人台及黑布,因为这些在原图上都有。那我们要怎么解决这问题?
简单,换别的参数就好了,例如,我们改用 fill ,会得到像下面这样的图。
如果是用 latent noise ,会是像下面的结果
若是用 latent nothing ,则会出现
这样的画面是不是很不错了?都还没有精细的微调就可以有这样子的品质,再优化的话就会更好,那接下来要怎么优化呢?
四、常见问题
这样一操作下来,大家可能有些问题,一一为大家说明。
问题 1 :什么是实例分割?
实例分割指的是指将图片上的东西进行区分,将不同的东西用不同的颜色标示出来,每一种颜色代表一个东西。
这次就是用实例分割,加速我们制作遮罩的时间。
问题 2 :Inpaint Anything 有不同的 Segment Anything Model ,有什么区别?
Segment Anything Model ,也叫 SAM ,在 Inpaint Anything 提供了 9 种,
可以分成4类,我们一一说明。
第 1 类:sam_vit 开头的 – Meta 提供的 SAM 模型
sam_vit 开头的,是 meta 提供的模型。因为 Meta 把他们的语义分割模型命名为 Segment Anything Model ,我们目前所称的 SAM 算是从这里开始算起,应算是这一波 SAM 模型的始祖。
这是一系列的模型是 Meta 在 2023 年 4 月公布的,其它的 SAM 模型都会拿来和这系列做比较。共有 3 种模型,以大小分别为,h (huge), l (large), b (base),huge > large > base ,精准度理论上也是和大小成正比,计算速度也是。
从效果上看, huge 和 large 的差别不大,但和 base 就有明显差别。
Meta SAM 参考资料:
https://segment-anything.com/
https://github.com/facebookresearch/segment-anything
https://huggingface.co/facebook/sam-vit-base/tree/main
https://huggingface.co/facebook/sam-vit-large
https://huggingface.co/facebook/sam-vit-huge
第 2 类: sam_hq_vit 开头的 – Segment Anything in High Quality 系列
若是 sam_hq_vit 开头模型就是苏黎世联邦理工学院视觉智慧与系统小组 (Visual Intelligence and Systems Group at ETH Zürich) 提供的高品质语义分割模型。根据根据他们的论文提供的数据,他们的切割准度比 Meta 还来得好,所以称为high quality。虽然他们分割出来的区域是比 Meta 还来得细,但在我们的例子里面分别不大。
SAM HQ 参考资料:
https://github.com/SysCV/sam-hq
https://huggingface.co/lkeab/hq-sam/tree/main
第 3 类:FastSAM 开头的 – FastSAM 系列
如果要效果不错,又省些内存,可以用 FastSAM 系列,它是由 CASIA-IVA 实验室 (CASIA-IVA-Lab) 提供的。我自己在小 VRAM 的机器上会用这个模型。
它的有 2 种型号,X 和 S。
X 这个型号在我们这次婚纱的例子,效果还可以,但 S 就不适合我们的例子。
FastSAM 资料如下:
https://github.com/CASIA-IVA-Lab/FastSAM
https://huggingface.co/An-619/FastSAM
第 4 类:Mobile SAM
又小又快的 SAM ,用 CPU 也可以跑得很快的 SAM 。但,效果也是最差的一个,只适合分辨大区块的东西。
Mobile SAM 参考资料:
https://github.com/ChaoningZhang/MobileSAM
https://huggingface.co/dhkim2810/MobileSAM/tree/main
问题 3 : Inpaint 的 Masked content 参数控制了什么?
Masked content 的选项有4个,说明如下:
选项 1 :Fill
fill 选项会将重绘区域的图像最大程度地模糊化,仅保留大致的结构和色彩。因此,在需要大规模重绘会使用它。
在我们的范例中,海平面的位置、沙难的走向,都是一致的,连夕阳的颜色也都差不多。
选项 2 : Original
Original 会参考原图,生成出的图,区块、颜色等等会和原图很像。
在我们的范例中,这选项会留人台黑色的部份,并且沙滩的走向也会保留。
选项 3 : Latent noise
Latent noise 把要重绘的部份给杂讯,容易产生不相关内容,适用于需要创意的地方。
在我们这次的示范中你会发现,用 latent noise 生成的图,若 prompt 里有提到小东西(如我们的是白玫瑰),则会重覆出现这小东西。
选项 4 : Latent nothing
Latent nothing 会参考要重绘的区域附近的颜色,找出附近颜色的平均值,再填回重绘区。这种方式非常适用于移除不需要的物件。
但在我们这次的范例中,因为我们是大范围的重绘,所以感觉不出有移除东西。但你观察用 latent nothing 生成的图,你会发现他们的配色和构图会很像,例如沙的颜色也都很像。
五、回顾延伸问题
我们回顾一下刚刚做了什么?
简单说,就是 2 大步骤:
- 用 Inpaint Anything 的语义分割功能做遮罩。
- 再传送到图生图用 inpaint upload 以及 inpaint 专用模型重绘。
光是这样,就可以做出来像今天一样的成果了。
凡事都还可以更好,如果用目前这种方式,仍然还会有几个问题:
- 我要的模型没有 inpaint 模型怎么办?可以用一般模型吗?
- 要怎么改变衣服上的光影?
- 有时会有P图的感觉,要如何才会更自然?
- 如何生成更丰富的图片,不是现在做出来的这几个样子。