技术分享 2023 年 3 月 24 日

使用 Depth map library and poser 修复AI图片的手部问题

Midjourney、Stable Diffusion 等工具生成的图片已经越来越真实了,然而在处理手部方面仍存在一些问题,例如AI对手指的处理通常不准确,导致手指黏连、数量异常等问题。为了解决这些问题,有人为 Stable Diffusion 开发了一个名为 Depth map library and poser 的插件,专门用于引导生成和修复AI对手部的处理。本文记录了使用此插件的学习和使用过程,并尝试使用它来修复一张图像中手部的问题。

一、安装配置

  1. 安装
需要安装 ControlNetDepth map library and poser 两个插件,地址如下:
安装完成后可以在插件页面看到这两个插件,刷新网页进行激活。
插件页面
插件页面
  1. 下载模型
推荐下载 control_depth-fp16.safetensorscontrol_canny-fp16.safetensors 两个模型文件。

二、手部修复

常用的修复方式有两种,一种是 text2img 模式,使用同样的 prompt 加上手势图片重新生成整张图片;一种是 img2img 模式,使用 inpaint 对原图的手部进行局部重绘。我使用两种模式都测试过多次之后,只在img2img 模式成功。

2.1 原图

原图如下,这里我们主要是处理右手,可以看到手部明显是有问题的:手指数量不详、长短不一、还黏在一起。
手部异常的图片
手部异常的图片

2.2 手势制作

为了使用 ControlNet 对手部进行引导,我们需要先制作手部图片。Depth map library and poser 自带了一部分手势,我试了好几种,最后只有手指张开的那几个手势成功了,其它稍微复杂一点的手势都做不出想要的效果。
制作方法也很简单,主要步骤如下:
  1. 打开 Depth Library 标签页
  2. 点击 Add backround image 添加待修复的图片,然后调整 WidthHeight 与原图一致或保持比例
  3. Hands 区域选择合适的手势拖拽到右边的预览窗口,然后点击 Add 添加到背景图,如果加的不合适可以选中后点击 Remove selcted 进行删除。
  4. 调整手势使其与与背景图匹配,可以拖角点进行等比缩放、也可以单独拖长边或短边进行只有缩放,拖住外面的点进行旋转
  5. 注意: 这里的手势全部是左手,如果需要用于右手,可以将锚点拉到另外一边进行翻转
手势调整
手势调整
Depth Library 参数设置
Depth Library 参数设置
手势制作完成后点击 Save png 将手势图片保存到本地,最后得到的图片如下:
手势图
手势图

2.3 使用 text2img 模式修复

这个模式测试失败,得到的结果与原图完全无关,查阅网上的资料,有的说是调整 weight 参数,有的说是调整 Guidance start 参数。我这两个都试过了,但是都无法成功。权重调低了完全不生效,权重调高了生成的图片与原图毫无关系。
与原图毫无关系的图片
与原图毫无关系的图片

2.4 使用 img2img 模式修复

  1. 切换到 img2img 标签页,填写下面这条 Prompt
a hand,five fingers,palm of hand,palm outward,clean background
这条 Prompt 的目的是生成一只手部图片,在 txt2img 标签页运行结果如下:
AI生成的手部图片
AI生成的手部图片
  1. inpaint 标签页上传原图,设置图片尺寸,然后mask掉需要修复的手部。
Inpaint 的 mask 涂抹手部
Inpaint 的 mask 涂抹手部
展开 ControlNet 设置,将上一步生成的手势图上传,然后设置 ControlNet 的参数。注意不要启用 Guess Mode
ControlNet 设置
ControlNet 设置
  1. 点击 Generate 按钮就可以生成手部修复图片了,建议设置 Batch size 同时生成多张图片,挑选最合适的结果。
手部修复后的图片
手部修复后的图片
可以看到修复后的图片虽然不是特别完美,但是比之前已经好多了,可以用PS继续处理一下细节。

参考资料