为什么大家都生成 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

  • 使用瓦片系手法

    • 不是生成完整的一张,而是使用分割并合体的 Ultimate SD upscale
    • 如果增加 4 分割、8 分割这样分割的数量,理论上可以制作任意超高分辨率的图像

SDXL 以后的事情

到此为止的话,终究是 SD1.5 世代的前提。 在那之后的模型中,学习分辨率和纵横比的处理正在一点点发生变化。

  • NovelAI Diffusion 以后

    • NovelAI 虽然是在黎明期专注于动漫系的图像生成服务,但在数据集上下了功夫,纵长・横长的图像也用于学习。因此,变得更容易以多样的纵横比生成了。
    • 这之后登场的许多模型,混合各种分辨率的图像进行学习变得普遍了。
  • SDXL

    • 学习分辨率的标准上升到了 1024px × 1024px
    • 在更新的模型中,从低分辨率的图像,到更高分辨率的图像(1〜2 百万像素级),能相对稳定输出的模型也增加了。
    • 由于架构的改良,像以前那样“提高分辨率的瞬间计算量爆炸”这样的极端情况减少了。

虽说如此,即便是现在,接下来的想法也没有改变。

  • 试着以该模型最擅长的“推荐分辨率”进行生成
  • 以此为基准,根据需要使用 Hires.fix 或放大、瓦片系手法进行扩展

首先是 “在那个模型练习过的分辨率带出一张”。 512px 对 SD1.5 来说只是那个起点,仅仅是这么回事。