ComfyUIでガチめにhires.fixを実装する
hires.fixとは
Automatic1111 StableDiffusionWebUIで、大きな画像を作成するテクニックである。SD1.x系列は512x512が基準であり、このサイズより大きくなると画像が破綻しやすくなる。一方SDXLは、1024x1024が基準になっている。逆に512x512の方を苦手にしている。この基準サイズより大きな絵を破綻させずに生成するにはまず基準のサイズを作成し、そのサイズを拡大してimg2imgすると言うのがhires.fixの基本的な実装である。かつてhigher.fixと言う名前で実装されていたがSD2が出た時に実装方法が変更されている(最終出力サイズからオリジナルのサイズを逆算すると言う複雑な実装していたからむしろ使いにくかったヤツ)
hires.fixの拡大アルゴリズム
基本的にはLatentのみの実装で、オプションでAI拡大が利用出来る。アニメ絵の拡大にはRealESRGAN_x4plus_anime_6Bが使われることが多い。
実際の実装
実は、LatentとAI拡大でhires.fixの実装が異なる。Latentは潜在空間のままで拡大処理を行う。つまりComfyUIでは生成した画像(VAEを通す前)にLatent Scalerを使う。ところがAI拡大はLatentに対して利用出来ないのでVAEエンコードをしてImageに変換してから拡大処理をし再びVAEデコードしLatentに戻す必要がある。
さらに拡大サイズが固定のためさらにサイズ変換が必要になる。例えば、RealESRGAN_x4plus_anime_6Bの場合、拡大率は4倍固定のため、画像を2倍にしたい場合は後処理として0.5倍する必要がある。
このアルゴリズムはarea(説明を読む限りPixel Mixingっぽい)が推奨になる(実際には1から0.5倍の間はどのアルゴリズムでも大差ない。以前zennに書いたのでそちらを参照)
ComfyUIにおけるサンプル実装
サンプルは以下にある
二通りのサンプルが存在するが、ComfyUIでhires.fixを実装するには実は2つのワークフローを手動切り替えないといけないのである(ワークフローをスイッチできるカスタムノードが有ればオンオフで切り替えられるだろう)
ここで、拡大率を指定するか、サイズを直接指定するかはお好みだが、拡大率の方が使い回しが楽なので拡大率で行っている(hires.fixは、両方実装しないといけないのであるが)
AI拡大
AI拡大にはモデルが必要になる。WebUIとモデルを共有する場合は以下のようにextra_model_paths.yamlを設定すると良い(どこからモデルを取得したか忘れた)
models:
base_path: <モデルのベースパス> # e:\ai\modelsなど
# <省略>
upscale_models: | # ComfyUIは upscale_modelsで管理するが、WebUIはモデルごとにまちまち
ESRGAN
RealESRGAN
SwinIR
LDSR
ScuNET
# <省略>
2passの実行
デフォルトは1回目と2回目のパラメータは同じで、step数は後から変更出来るがサンプラーは変えられないがComfyUIの場合、両方違っても良いので適当に修正して欲しい。img2imgはtxt2imgよりstep数が減らせるはず。
ワークフロー
こんな感じになろう。完全に実装するにはカスタムノードが必須だろう
コメント