放大的必要性
在最近摸索 Stable Diffusion 绘图的过程中,我发现了一个比较常见的现象。如果在最开始画图时直接就设置一个较大的宽度和高度(例如1920*1280),很容易让AI不知所措,把很多东西都塞到一幅画里面,或者直接就是出来一幅意义不明的画。即使在提示词中使用了诸如 “solo” 之类的描述也很难抑制这个现象的发生。
所以我认为目前比较好且稳定的方式,是先画一幅宽和高均较小的画,再通过 Hires. fix 功能对其进行放大。根据经验,当宽和高小于1024*1024时,尝试过的大多数模型都可以稳定出图,没有大的结构性的问题。
放大带来的问题
但放大也不是那么容易用的,不良的算法和重绘系数选择很有可能会将一副原本不错的画完全毁掉。在之前尝试某个模型的时候,不管我怎么在反向提示词里面加关于手指异常的提示,最终得到的图就从来没有五根手指的,甚至还有其他的地方变手指的。然而当我观察图片的生成过程时,我才发现最初生成的图片手指确实是好的,手指的异常是在放大的过程中出现的!
由此,才产生了这篇文章,我决定简单对比一下目前内置的这些放大算法效果的差异。我本人对这些不同算法的原理了解并不深刻,这里的对比更多是绘图效果的直接对比。事实上,后来我才慢慢发现不同放大算法的最优重绘幅度差别不小,所以下面的实验并不能很好的展示各个放大算法最好的效果,仅仅算是对于这个功能初步的一些探索吧。
实验条件
- CPU:Intel i5-12400F
- 内存:32GB
- 显卡:NVIDIA GeForce RTX 3060 Ti (8GB)
- 模型:dalcefoPainting_2nd
如果某个测试中没有出现对应的放大算法,那就是爆显存没画出来,请谅解
测试一
测试一的测试条件如下图所示。
测试一条件
仅通过修改放大算法,保持所有参数不变,可以得到如下所示的一系列结果。
Latent
Latent(antialiased)
Latent(bicubic)
Latent(bicubic antialias)
Latent(nearest)
Latent(nearest-exact)
无
Lanczos
最邻近(整数缩放)
Lanczos
SwinIR_4x
最容易发现的一个现象是,在0.8的重绘幅度下,Lantent开头的放大算法都把下面的一束头发重绘成了手臂,而下面几种重绘方式都没有出现这个问题。事实上,根据我的经验,Lantent开头的一系列放大算法在重绘幅度超过0.6时很容易出现异常的肢体,尤其是在裸露的皮肤较多的时候。重绘幅度一高,就很容易出现梦魇融合怪的恐怖场面。
由此我们可以得到这样一个结论:“在使用重绘功能时,如果出现了不理想的肢体情况,可以尝试降低重绘幅度。”
测试二
测试二的实验条件如下图所示。
测试二条件
0.9的重绘幅度,梦魇融合怪来喽。
Latent
Latent(antialiased)
Latent(bicubic)
Latent(bicubic antialias)
Latent(nearest)
Latent(nearest-exact)
无
Lanczos
最邻近(整数缩放)
Lanczos
SwinIR_4x
观察测试条件的截图不难发现,其实模型一开始生成的是一个正常的小姐姐,“这锅我模型不背”!这一组对照实验很好的证明了测试一的结论,如果你不想出现这样的悲惨情况的话,适当调小重绘幅度吧。
测试三
测试三的实验条件如下图所示。
测试三条件
主要参数与测试二完全相同,仅仅将重绘幅度由0.9调整至0.6。
Latent
Latent(antialiased)
Latent(bicubic)
Latent(bicubic antialias)
Latent(nearest)
Latent(nearest-exact)
最邻近(整数缩放)
SwinIR_4x
大家,都恢复正常了!重绘幅度,很神奇吧。所有的放大算法都在0.6的重绘幅度下成功出图了,可喜可贺。
现在就可以来看一看各个算法的绘图效果了。
首先在整体的色彩方面,Latent 系列放大算法获得的图片色彩都比较丰富,而其他方法获得的图片相对有一点灰蒙蒙的。
swinIR_4x 更是重量级,单独看其实也还好,但对比前者,它简直就像盖上了一层灰色的蒙版,然而它又是唯一一个把肚脐的细节保留的放大算法,真是让人又爱又恨。
最邻近(整数缩放) 和 swinIR_4x 的副乳表现不是很好,其实 Latent 系列也没有特别理想,只能说还可以把结果归结为衣服勒的,但上面两位看上去就像单独有赘肉一样,最邻近(整数缩放) 甚至多了一条褶皱,适当的褶皱可以增加真实感,但多了也不好看啊。
只有 Latent(nearest) 和 Latent(nearest-exact) 画出了头上的麻花辫,虽然我也没法判断是他们自己生成的,还是保留原图的。同时这两位也是我认为手指表现比较好的。另外,只有 Latent(nearest) 生成的小姐姐手上是有手环的。我倾向于认为它们更能够保留原图的小细节。
衣服方面,只有 最邻近(整数缩放) 给小姐姐多加了一层蕾丝,不过其实加的也挺好看的,质感也不错,小配饰也很丰富。Latent,*Latent(antialiased)*和 最邻近(整数缩放) 画出了裙子上的丝带。
总的来说,上述这些放大算法各有优劣,Latent 系列的颜色更丰富,其中 Latent(nearest) 和 Latent(nearest-exact) 细节更到位,最邻近(整数缩放) 的衣服更华丽,而 swinIR_4x 对身体曲线的刻画更好。
测试四
测试四的实验条件如下图所示。
测试四条件
主要参数与测试二、三完全相同,仅仅将重绘幅度由0.6调整至0.3。
Latent
Latent(antialiased)
Latent(bicubic)
Latent(bicubic antialias)
Latent(nearest)
Latent(nearest-exact)
你的近视又严重了,该换眼镜了。
重绘幅度难道是越小越好吗?答案显然是否定的,在0.3的重绘幅度下,所有放大算法获得的结果都非常模糊。这告诉我们最好选择0.4以上的重绘幅度,否则放大的结果会比较模糊。
结语
这次的对照实验基本就是这样,以放大算法种类和重绘幅度为核心参数,观察对比了这两者的变化对绘图结果产生的影响,并且得到了一些可用的经验性结论。
在这篇文章拖更的过程中,ControlNet等令AI绘图更加可控的方案已经应运而生,后续我也会继续跟进,学习如何提高AI绘图的可用性。我自诩为所谓“直出党”,不喜欢出图后再修,更偏爱一次搞定的绘图方法。
当前目标:
- 继续尝试,在调参中提高出图质量;
- 学习 ControlNet,提高可控性;
- 学习如何训练模型。