欢迎光临散文网 会员登陆 & 注册

探讨如何在ComfyUI中进行Upscale

2023-08-12 13:18 作者:但丁jr  | 我要投稿

各位朋友大家好。在这个视频中,我想跟大家探讨一下,在康复 UI 中,如何对我们用 AI 生成的图片进行放大。这个技巧的必要性在于,目前我们使用 stable division,无论是 1.5 版本还是 SDXL,来生成图片时,其初始状态都会有一个画幅的限制。


例如,1.5 版本的模型本身的数据源,在训练时使用的图片可能就是 512x512 的画幅,而 SDXL 则是 1024x1024。因此,如果我们在生成图片时设定了超出原数据画幅的内存空间大小,就会导致生成画面出现错乱。比如说,如果是风景的话,构图可能就不自然;如果是人物的话,肢体可能会出现畸形,如多手臂、多头部,或者脖子过长、躯干过长等问题。


因此,我通常在第一次使用它来生成图片时,画幅不会超过模型元数据的大小,比如我现在使用的是 SD XL,它的原数据是 1024x1024,那么我就会设定画面高度的最大值为 1024。如果我把设定值稍微提高一点,比如设为 1280,有时候你生成的画面可能看起来并没有明显的问题,但是如果仔细观察,往往会发现可能会出现人物的脖子长了或者腰部长了,造成身材比例失调的情况。


所以,当我们第一次生成图片,画幅有限制以后,就使得我们最终生成的画面大小受到了限制。如果你想得到一个相对比较高精度的画面,你就需要对这个画面进行缩放,这个缩放是在生成画面后进行的。这个缩放其实也比较复杂,我研究的也不是很透彻。因为你既可以在 latent 空间进行缩放,也可以在 pixel 空间进行缩放,两者是有区别的。


今天主要是来讲讲如何在 pixel 空间实现一些缩放。我通常会在内存中生成一个画面后,先进行一个图生图的操作。因为在图生图的过程中,我们可以进行一次缩放,对整个画幅进行缩放,然后使得它在 latent 空间里面有更多的噪点加入,再按照我们之前的描述词来进行进一步的采样和生成。这样就可以提高画面的细节度,提高整体的画面质量。


但是,这个过程中存在一个问题,因为如果你把整个画面的画幅放大得很大,那么在图层图的这一步骤中,你需要使用的显存会大量增加。比如说我把现在的画幅放大2倍,也就是说 1024x768 的画幅会变为 2048x1536,这个画幅可能对于很多人的显卡来说压力非常大,因为需要的显存会比较多。


因此,在这个过程中,我们可能需要把缩放值设得稍微小一点。并且,还存在一个问题,就是说你这个放大后,整个画幅加大以后,如果我们设定的噪点值设得比较大,设得比较大的情况下,依然会出现肢体错乱,构图错乱的问题。因为它整个已经超出了模型本身的画幅大小,所以这种方式只适合在图层图时,我们画面不需要有很大变化的情况下使用。在这样的情况下,我们会将噪声值设定为相对较小的值,这样就可以保证最终生成的画面不会出现太多的错乱。


这就是我们在图层图过程中经常采用的一种方式,即先将画幅放大,然后降低噪声,以此来生成最终的画面。例如,我现在的画幅是 1024x768,我将其放大2倍,也就是其实画幅是其原来的四倍。你可以看到,整个画面的总体感觉没有太大的变化,但如果你仔细观察,会发现细节有所不同,画面的清晰度得到了提高。


那么,如果我想进一步提高画幅,因为我们有时候需要更大的画面,我就会用这样的一个画幅再去进行一个缩放。这时候我们就需要专门的缩放模型,这类模型有很多,像比较常见的有 Topaz Gigapixel AI、Adobe Super Resolution 等,但是我比较常用的可能就是这两种。


这组缩放操作,我在之前的几个视频里已经反复讲过。我是从 Such的工作流中借鉴过来的,因为我觉得它实现的画质还是不错的。它的主要缩放模型使用的是 MMANMKD,辅助的是 UltraSharp。这两者都是直接对画面进行一次缩放,这个缩放默认是在原有画幅的基础上进一步放大四倍。然后我们会将放大的结果进行叠加。


我这边只是简单地做了一个平均,即两种模型各占一半的比例。所以也不存在哪一个是主模型,哪一个是辅助模型。你可以根据需要调整这两者的融合比例。这样的话,我们得到的画面已经非常高清了。


但是我们有时候可能并不需要这么大的画幅,对吧?这时候我会使用一个节点叫做 "Image Scale to Side",它可以让我根据画面的最长边来进行缩放,我就把它的最长边设定为 3200。这样最终得到的画面是 3200x2400,对于大多数的使用状态来说应该已经足够了。


如果我们有更极端的画幅需求,比如我想在当前的画幅基础上再进一步放大2倍或者4倍,甚至更高,那怎么办呢?显然我无法直接将整个画面放大,然后再进行采样,因为几乎没有显卡能够处理这么大的画面。这时候就有一种方案,就是将放大后的画面切分成小块,然后对每一小块进行计算,最后再进行拼合。


这边就是我安装了一个插件叫做 "Ultimate SD UpScale"。安装后,会在 "Image Upscaling" 下面出现两个节点。这个插件的主要作用就是进行图层图的过程,只不过它不是对整张画面进行图层图,而是把这张画面切分成小块。每一个小块都进行图层图操作后,再把这些小块拼合成一张整体的画面。


这个节点的参数有很多,但其中比较特殊的就是 "Tile Width" 和 "Tile Height",


17:45


这两个参数用来设定画面的切片大小,即每一小块的大小。我们可以看到其切片大小设定为 512x512,这是因为这个插件是针对 SD 1.5 版本设计的,所以它的切片大小应该限定在 1.5 版本的尺寸范围内。如果未来这个插件能够配合 SD XL 使用,我们估计可以将切片大小设定为 1024x1024。


此外,这个插件还有一些其他参数,例如 "Mask Blur"


18:42


用于设定遮罩模糊度,我猜测这可能是因为每一片的边缘可能有一定区域的遮罩,这样在最终拼合画面时,能够在切片边缘进行更好的融合,避免出现明显的切痕。


采样算法方面,我尝试了几种不同的算法,包括 DPM2MSDE 等,发现 DPM2MSDE 的效果最好,其他的采样算法我测试结果不理想。这可能与我处理的图片类型有关,不同的采样算法在不同的案例中可能会有不同的效果。


至于描述词的编写,其实也就是不断地去尝试,没有什么特别深奥的地方。需要大家注意的是,SD XL 的描述词编写方式相对比较复杂,它将描述词分为 G、LG、L、R、Positive R 和 Negative R 等几个部分,每个部分都有其特定的作用和编写方式。


在实际操作中,我发现长句式的描述词在 SD XL 中效果更好,这与 1.5 版本的处理方式有所不同。在XL 版本中,长句式的描述词作用并不大,往往是短语和单词起到更明显的作用。


总体来说,图片的缩放主要有以下几种方式:一种是在图层图的过程中进行缩放,这种方式有一定的画幅限制,因为超出一定画幅后,显卡可能无法进行计算;另一种方式是在完成图层图后,使用专门的缩放模型进行缩放;最后一种方式是使用 "Ultimate SD UpScale" 插件,该插件会将画面切分成小块,对每一小块进行图层图操作,然后再拼合,这种方式适合处理超大画幅的图片。


在实际操作中,我们可以根据自己的需求和显卡的性能,选择合适的缩放方式。这个过程可能需要不断地尝试和调整,但最终能够得到满意的结果。希望这个视频能够对大家有所帮助,如果有任何问题或者有更好的缩放方法,欢迎与我交流。谢谢大家。

探讨如何在ComfyUI中进行Upscale的评论 (共 条)

分享到微博请遵守国家法律