为什么大家都生成 512px 附近?
在 Stable Diffusion 1.5 中,基本以 512px × 512px 生成图像。
最近 YouTube 的分辨率是 1920×1080(1080p),平时画画的人可能会准备 3000px 左右的画布。 既然如此,为什么图像生成中大家都生成 512px 附近呢。为什么是这么低的分辨率呢。
理由主要有 2 个。
- 因为是使用 512px 附近的图像进行学习的
- 增大分辨率的话计算成本会一下子跳涨
1. 模型是使用 512px 附近学习的
Stable Diffusion 1.5 几乎是使用 512px × 512px 的正方形图像 进行学习的。
- 纵长・横长的图像,也是裁剪成 512px 的正方形进行学习的
- 结果是,虽然擅长“画 512px 左右的正方形”,但“更大的画”或“极端的纵长・横长”原本就没有练习过

实际上,试着生成 768px 或 1024px,明明写的是 a single dog,狗却会分裂出现好几只。
与其说是 “以 512px 生成”,准确地说是 “只能在 512px 附近顺利生成”,这才是本质理由。
解决方案:Hires.fix
一个解决方案就是 Hires.fix。
- 首先在模型擅长的 512 × 512px 附近生成图像
- 将该图像放大,以放大的图像为草稿再次重绘(image2image)
不是突然让它画不擅长的尺寸,而是 “先经过擅长的尺寸,再变成大图” 这样的思路。
2. 提高分辨率的话计算量会一下子增加
另一个单纯是 计算量的问题。
- 宽・高变成 2 倍的话,像素数就会变成 4 倍
- Diffusion 的步数或模型尺寸是一样的,所以 VRAM 和计算时间几乎会变成“×4”的世界
Stable Diffusion 1.5 的模型本身相对紧凑,但尽管如此,如果突然把 1024px 或 2000px 等大分辨率作为 1 张图像来画,负荷还是相当重的。
解决方案:节约 VRAM 和瓦片系手法
想提高分辨率时的对策,有几个选项。
-
节约 VRAM
- 使用 高速化和轻量化 的技巧,调整模型和精度以抑制 VRAM 消耗
-
使用瓦片系手法
- 不是生成完整的一张,而是使用分割并合体的 Ultimate SD upscale
- 如果增加 4 分割、8 分割这样分割的数量,理论上可以制作任意超高分辨率的图像
SDXL 以后的事情
到此为止的话,终究是 SD1.5 世代的前提。 在那之后的模型中,学习分辨率和纵横比的处理正在一点点发生变化。
-
NovelAI Diffusion 以后
- NovelAI 虽然是在黎明期专注于动漫系的图像生成服务,但在数据集上下了功夫,纵长・横长的图像也用于学习。因此,变得更容易以多样的纵横比生成了。
- 这之后登场的许多模型,混合各种分辨率的图像进行学习变得普遍了。
-
SDXL
- 学习分辨率的标准上升到了 1024px × 1024px。
- 在更新的模型中,从低分辨率的图像,到更高分辨率的图像(1〜2 百万像素级),能相对稳定输出的模型也增加了。
- 由于架构的改良,像以前那样“提高分辨率的瞬间计算量爆炸”这样的极端情况减少了。
虽说如此,即便是现在,接下来的想法也没有改变。
- 试着以该模型最擅长的“推荐分辨率”进行生成
- 以此为基准,根据需要使用 Hires.fix 或放大、瓦片系手法进行扩展
首先是 “在那个模型练习过的分辨率带出一张”。 512px 对 SD1.5 来说只是那个起点,仅仅是这么回事。