なぜみんな 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 消費を抑える
  • タイル系手法を使う

    • 1 枚を丸ごと生成するのではなく、分割して合体する Ultimate SD upscale を使う
    • 4 分割、8 分割と分割する数を増やせば、理論上はいくらでも超高解像度の画像を作ることができます

SDXL 以降の話

ここまでの話は、あくまで SD1.5 世代の前提です。 その後のモデルでは、学習解像度やアスペクト比の扱いが少しずつ変わってきています。

  • NovelAI Diffusion 以降

    • NovelAI は黎明期にアニメ系へ特化した画像生成サービスですが、データセットを工夫しており、縦長・横長の画像も学習に使っていました。これにより、多様なアスペクト比で生成しやすくなりました。
    • これ以降に登場した多くのモデルは、様々な解像度の画像を混ぜて学習するのが一般的になっています。
  • SDXL

    • 学習解像度の基準が 1024px × 1024px に上がりました。
    • さらに新しいモデルでは、低解像度の画像から、もっと高解像度の画像(1〜2 メガピクセル級)まで、比較的安定して出力できるものも増えてきています。
    • アーキテクチャの改良により、昔ほど「解像度を上げた瞬間に計算量が爆発する」といった極端さは減っています。

とはいえ、今でも次の考え方は変わりません。

  • そのモデルが最も得意とする「推奨解像度」で生成してみる
  • それを基準に、必要に応じて Hires.fix やアップスケール、タイル系手法で拡張していく

まずは 「そのモデルが練習している解像度帯で 1 枚出す」。 512px は、SD1.5 にとってそのスタート地点だった、というだけの話ですね。