今天我们要分享的内容视频版如下,
视频已添加进度条及配音
,
想要原视频、文中对比图以及模型
的鹿友可以
联系我
获取:
上一篇文章我们分享了ControlNet线条类控制,还没有看过的鹿友欢迎阅读:
今天我们接着分享ControlNet的三维类控制,废话不多说,进入今天的正题吧!
三维类控制包括Depth (深度)和NormalMap (法线贴图),这两种控制在三维软件中比较常见,所以我把它们归类为三维类。
随着Stable Diffusion的更新,这两种控制类型都增加了一些新的预处理,今天大家就跟着老鹿一起把它们梳理一遍吧!
使用过C4D的鹿友应该比较熟悉,在三维渲染的时候,我们通常会多通道渲染保存一张深度图,用于后期添加景深效果。
Depth (深度)也是一样,可以将图片提取成一张用黑白灰表示的深度图,用于表达图片常见中的远近关系,其中白色代表近景,黑色代表远景:
在Stable Diffusion中,如果你希望生成与原图构图类似,但是内容不同的图通常可以选择Depth控制类型:
在Depth中一共有六个预处理器,分别是Midas、Zoe、Leres、Leres++、Anything和Hand_Refiner:
Anything和Hand_Refiner是新增的两个预处理器,其中Hand_Refiner是专门用来修复手部,我们稍后再说。
Anything会有它专门的模型,需要下载下来放置到ControlNet的模型文件夹里:
同时它还有自己的预处理器,通常情况下你点击爆炸图标它会在后台自动下载:
但如果你是因为网络问题下载失败的话就会麻烦一点,因为通过控制台可以看到,在下载模型之前,后台还进行了一些环境部署:
需要先将facebookresearch压缩包解压如图所示的指定路径中,如果cache文件夹里没有torch和hub文件夹,新建即可:
然后把dinov2_vitl14_pretrain存放如图所示的路径里,同样如果没有checkpoints文件夹新建即可:
再将depth_anything_vitl14模型文件存放到ControlNet对应的预处理器文件夹中:
最后再将control_sd15_depth_anything模型存放到ControlNet对应模型文件夹中:
分享给大家的文档里,也写了具体的安装步骤供大家参考:
在Leres和Leres++这两种预处理器中会有两个特有参数,移除近景和移除远景:
作用如同字面意思,就是对远景和近景的修剪,下面是远近各自修剪百分之50之后的对比图:
下面是五种预处理器的对比,可以看到Midas和Zoe忽略了一部分背景的细节,但是前景比较清楚。
Leres和Leres++背景细节最多,但是相对的,前景就会有点模糊。
新的预处理器Anything在处理远近的细节上跟接近Midas和Zoe,但是近景更加清晰锐利:
在实际进行生图测试的时候,我发现用于适配Anything的ControlNet模型生成的图都坏掉了,不知道如果是生成室内效果图会不会好一些。
因此建议多数时候,我们还是用默认的depth模型吧:
最后我们再来说这个新增的Hand_Refiner预处理器,要使用它首先需要将hrnetv2和gaphormer这两个文件放到ControlNet对应的预处理器文件夹中:
然后再将control_sd15_inpaint_depth_hand_fp16存放到ControlNet对应模型文件夹中:
这里我先用sd生成了一张两只手都有问题的女孩图像:
将它发送到图生图局部重绘里,并用画笔涂抹有问题的手部区域:
然后在ControlNet中Depth控制类型中选择Hand_Refiner预处理器以及对应的适配模型,点击爆炸图标可以看到能够提取出一张正确的手部深度图:
相信许多鹿友应该都是我以前写C4D内容的时候关注野鹿志的,所以对法线贴图这个概念并不陌生。
NormalMap (法线贴图)就是用图片的RGB通道记录物体在三维场景中的坐标信息,从而模拟光影以达到凹凸效果。
三维软件中我们通常是在制作材质的时候会用到法线贴图,而在Stable Diffusion中,这项NormalMap控制类型和Depth使用场景类似,主要是通过光影来还原画面的布局:
在NormalMap中一共有三个预处理器,分别是Bae、Midas和Dsine:
其中Midas是以前ControlNet1.0的算法,官方表示已经弃用,大家仅做了解:
在这个算法中有一个Normal Background Threshold的选项,默认数值0.4,数值范围是0-1:
它的作用主要就是移除远景的信息,数值越大,远景的信息越少:
Dsine是新增的一种算法,我在网上暂时没有找到相关的使用说明,它似乎是有专门的ControlNet SDXL模型。
要使用它需要将预处理器模型dsine.pt存放到对应的ControlNet预处理器文件夹中:
同时要将ControlNet模型放到对应的模型文件夹中:
但经过我的测试,它在SD1.5模型下也可以使用,下图中我们可以看到,当我SD大模型选择1.5模型,同时ControlNet模型也使用1.5模型时,控制仍然生效。
而且说实话,我个人并不觉得在这个例子上,SDXL控制会比1.5模型好:
Dsine中会有Fov和Iterations两个参数,同样我在网上暂时没有找到相关说明,只能说下自己的理解:
Fov是视场角的意思,数值默认为60,数值范围0-360,我觉得这里的单位应该是度。
应该是为了模拟三维场景摄像机中不同视场角所看到的光影变化。
从下图我们可以看到,当数值为0和数值为360的时候,法线贴图完全相同,这就是由于360度和0度的位置是一样的:
Iterations是迭代的意思,默认数值为5,参数范围1-20,这个参数我只能从三维软件的使用经验来推测它的用途。
在三维软件中,迭代次数通常指的是对某个数值计算的次数,这里可能就是用迭代次数来对生成的法线贴图进行微调吧。
从下图的对比中我们可以看到,法线贴图的区别并不是很大:
接下来是三种预处理器在默认参数情况下生成法线贴图的对比图,Dsine算法会比Bae更加清晰,而Midas算法和我们常见的法线贴图差异较大:
最后则是三款预处理器生成图的对比,Midas基本可以弃用了,Dsine生成的图也Bae清晰,但是反而少了景深的效果。
至于修改Dsine中的Fov参数,是否也可以得到景深效果我就没有进一步测试了。
说实话,我从来就没有用过NormalMap这个控制类型:
好了以上就是ControlNet三维类控制的所有内容。
如果觉得对自己有所帮助,请不要吝啬自己的一键三连,你们的支持对我很重要,谢谢!