ControlNet 是 Stable Diffusion中的一种扩展模型,通过这种扩展模型,我们能够将参考图像的构图(compositions )或者人体姿势迁移到目标图像。
资深 Stable Diffusion 用户都知道,很难精准控制Stable Diffusion生成的图像,比如如何在不同场景中保持原来的构图(compositions )或者人物形象,但是有了ControlNet ,这些问题变得轻松多了。
这篇文章,我带你系统了解:
-
什么是ControlNet;
-
ControlNet的工作原理
-
ControlNet 常用preprocessing
-
如何部署和使用ControlNet
ControlNet 是用来控制Stable Diffusion 模型的一种神经网络模型。Stable Diffusion 本身是一种根据文本或者图像用来生成图像的扩散模型,在生成图像过程中,可以通过 ControlNet 引入更多条件来干预图像生成过程,它可以(也需要) 跟现有 任何 Stable Diffusion 模型搭配使用。
下面举两个例子来说明ControlNet 如何来干预图像生成:
1. 使用canny边缘检测 来控制图像生成
在这个示例图中,有两种条件来控制最终的图像生成:文本条件和canny边缘检测结果(control map)。前者是prompt,大家都很熟悉了,后者需要额外提供参考图像,示例中通过canny 边缘检测器,提取参考图像的边缘信息。两者共同作用于目标图像。
从参考图像中提取额外信息的过程,在Stable Diffusion中有专门的术语叫:preprocessing。
2. 使用OpenPose来迁移人物姿势特征
OpenPose是一种快速检测人体特征的模型,包括手,脚,肩膀,头和眼睛等位置特征。
从上面示例,大家能够看到边缘检测器和OpenPose的一些区别,前者勾勒人物轮廓,目标图像会保留原图中的头发,衣服等轮廓,适合于一些富含边缘信息的主题和背景迁移,而后者更自由,它关注人物的关键姿势特征,但是不会保留那些衣服,头发等的轮廓信息。
实际上,OpenPose相关的有多种preprocessing,比如:
OpenPose: ,nose, eyes, neck, shoulder, elbow, wrist, knees, and ankles.
OpenPose_face: OpenPose + facial details
OpenPose_hand: OpenPose + hands and fingers
OpenPose_faceonly: facial details only
OpenPose_full: All of the above
OpenPose有专门提取脸部特征,手部特征,关节,膝盖,脚踝以及以上特征的组合等多种模型。这么看,OpenPose 也并不是那么粗枝大叶,也可以做到精细控制,为什么有专门针对脸和手的模型呢?因为没有这些模型,Stable Diffusion对手的生成 不在行,经常出现 多手指或者手指变形等情况,人脸的重要性更不用说了,脸部细节直接关系结果图像的成败。
关于OpenPose提取人体特征,我们看几个例子: