アップスケールのあれこれ【ComfyUI】

サムネイル_アップスケールのあれこれ AIイラスト

今回はComfyUIでできるアップスケールの備忘録。
ベーシックなアップスケールと、Ultimate SD Upscale というA1111(ComfyUIとは別のAIイラスト生成ツール)で使われているアップスケーラーを試してみる。また、アップスケールした画像の違いなんかも比較する。

今回利用したComfyUIとカスタムノードのバージョン。
ComfyUI [0.3.26]
ComfyUI-Manager [3.3.12]
ComfyUI_UltimateSDUpscale [1.1.2]

- PR -

サンプル画像

アップスケールを試すための元画像が必要なのでテキトーに生成しておいた。

基本的なアップスケール

まずComfyUIの標準ノードでできるアップスケールを試してみる。

ワークフロー

簡単なワークフローを作ってみた。

アップスケールワークフロー
アップスケールワークフロー

ワークフローのJSONデータ。全コピしてComfyUIでペーストすればワークフローが読み込める。

JSON
{
  "last_node_id": 3,
  "last_link_id": 2,
  "nodes": [
    {
      "id": 1,
      "type": "LoadImage",
      "pos": [
        2308.513427734375,
        3651.23583984375
      ],
      "size": [
        315,
        314
      ],
      "flags": {},
      "order": 0,
      "mode": 0,
      "inputs": [],
      "outputs": [
        {
          "name": "IMAGE",
          "type": "IMAGE",
          "links": [
            2
          ],
          "slot_index": 0
        },
        {
          "name": "MASK",
          "type": "MASK",
          "links": null
        }
      ],
      "properties": {
        "cnr_id": "comfy-core",
        "ver": "0.3.26",
        "Node name for S&R": "LoadImage"
      },
      "widgets_values": [
        "2025-03-16_154554_1024x1024_Generated_00001.png",
        "image"
      ]
    },
    {
      "id": 3,
      "type": "PreviewImage",
      "pos": [
        2969.20263671875,
        3650.270263671875
      ],
      "size": [
        384.0254211425781,
        310.1117858886719
      ],
      "flags": {},
      "order": 2,
      "mode": 0,
      "inputs": [
        {
          "name": "images",
          "type": "IMAGE",
          "link": 1
        }
      ],
      "outputs": [],
      "properties": {
        "cnr_id": "comfy-core",
        "ver": "0.3.26",
        "Node name for S&R": "PreviewImage"
      }
    },
    {
      "id": 2,
      "type": "ImageScale",
      "pos": [
        2638.700927734375,
        3651.797119140625
      ],
      "size": [
        315,
        130
      ],
      "flags": {},
      "order": 1,
      "mode": 0,
      "inputs": [
        {
          "name": "image",
          "type": "IMAGE",
          "link": 2
        }
      ],
      "outputs": [
        {
          "name": "IMAGE",
          "type": "IMAGE",
          "links": [
            1
          ],
          "slot_index": 0
        }
      ],
      "properties": {
        "cnr_id": "comfy-core",
        "ver": "0.3.26",
        "Node name for S&R": "ImageScale"
      },
      "widgets_values": [
        "nearest-exact",
        2048,
        2048,
        "disabled"
      ]
    }
  ],
  "links": [
    [
      1,
      2,
      0,
      3,
      0,
      "IMAGE"
    ],
    [
      2,
      1,
      0,
      2,
      0,
      "IMAGE"
    ]
  ],
  "groups": [],
  "config": {},
  "extra": {
    "ds": {
      "scale": 1.798587899092138,
      "offset": [
        -2133.284555219217,
        -3460.7587993264883
      ]
    },
    "ue_links": []
  },
  "version": 0.4
}
Expand

アップスケールに使うノード

使用するノードは “Upscale Image“。設定はシンプルで出力サイズを指定する程度。その他、ノードで指定できる設定値は下記の通り。

設定項目説明
Upscale_method拡大・縮小の方式は5種類から選択できる。違いは正直わからんので後ほど比較する。
nearest-exact
bilinear
area
bicubic
lanczos
Width主力画像の幅(px)
Height出力画像の高さ(px)
Crop入出力画像サイズが異なる場合における帳尻合わせの方法。
Disabled
伸縮させることでサイズの帳尻合わせをする。なのでアップスケール後の画像は縦横に伸縮する。
Center
出力画像サイズを満たせるまで入力画像を拡大し、画像中央から出力画像サイズで切り抜くことで帳尻合わせをする。なのではみ出た部分は切り捨てられる。

アップスケールした画像

サンプル画像の2枚を “Upscale_method” 5種それぞれを使いアップスケールしてみる。ちなみに倍率は2倍(1024×1024→2048×2048)で出力した。

Upscale_method による違い

出力画像を比較してみる。

まずはアニメ系の画像から見てみるが、パッと見の滑らかさ(ジャギーの少なさ)は bilinear > area = bicubic = lanczox > nearest-exact といった印象。

続いてリアル系の画像を比較。こちらは bilinear = bicubic = lanczox > nearest-exact = area という感じ。

– PR –

モデルを使用したアップスケール

今度は専用のモデルを使いアップスケールしてみる。

アップスケール用モデルのダウンロード

モデルはマネージャーの Model Manager からダウンロードできる。今回は下図4種を試す。ダウンロードしたモデルは "ComfyUI\models\upscale_models" に保存され、ComfyUIの再起動後に利用可能となる。

アップスケールモデルのダウンロード
アップスケールモデルのダウンロード

また、これ系のモデルは他に入手できるサイトもあり、たとえば下記サイト等から入手することもできる。(入手したモデルは “ComfyUI\models\upscale_models” に突っ込み再起動)

OpenModelDB
OpenModelDB is a community driven database of AI Upscaling models. We aim to provide a better way to find and compare mo...

ワークフロー

こちらもワークフローを作ってみる。先程と似たような感じだがモデルローダーが増えている。

アップスケールワークフロー(モデル使用)
アップスケールワークフロー(モデル使用)
JSON
{
  "last_node_id": 7,
  "last_link_id": 5,
  "nodes": [
    {
      "id": 4,
      "type": "LoadImage",
      "pos": [
        2632.078125,
        3553.920166015625
      ],
      "size": [
        315,
        314
      ],
      "flags": {},
      "order": 0,
      "mode": 0,
      "inputs": [],
      "outputs": [
        {
          "name": "IMAGE",
          "type": "IMAGE",
          "links": [
            4
          ],
          "slot_index": 0
        },
        {
          "name": "MASK",
          "type": "MASK",
          "links": null
        }
      ],
      "properties": {
        "cnr_id": "comfy-core",
        "ver": "0.3.26",
        "Node name for S&R": "LoadImage"
      },
      "widgets_values": [
        "2025-03-16_154554_1024x1024_Generated_00001.png",
        "image"
      ]
    },
    {
      "id": 5,
      "type": "ImageUpscaleWithModel",
      "pos": [
        2974.112548828125,
        3553.231689453125
      ],
      "size": [
        340.20001220703125,
        46
      ],
      "flags": {},
      "order": 2,
      "mode": 0,
      "inputs": [
        {
          "name": "upscale_model",
          "type": "UPSCALE_MODEL",
          "link": 3
        },
        {
          "name": "image",
          "type": "IMAGE",
          "link": 4
        }
      ],
      "outputs": [
        {
          "name": "IMAGE",
          "type": "IMAGE",
          "links": [
            5
          ],
          "slot_index": 0
        }
      ],
      "properties": {
        "cnr_id": "comfy-core",
        "ver": "0.3.26",
        "Node name for S&R": "ImageUpscaleWithModel"
      }
    },
    {
      "id": 7,
      "type": "PreviewImage",
      "pos": [
        3338.168701171875,
        3552.543701171875
      ],
      "size": [
        373.1026611328125,
        307.4725341796875
      ],
      "flags": {},
      "order": 3,
      "mode": 0,
      "inputs": [
        {
          "name": "images",
          "type": "IMAGE",
          "link": 5
        }
      ],
      "outputs": [],
      "properties": {
        "cnr_id": "comfy-core",
        "ver": "0.3.26",
        "Node name for S&R": "PreviewImage"
      }
    },
    {
      "id": 6,
      "type": "UpscaleModelLoader",
      "pos": [
        2783.48291015625,
        3412.84033203125
      ],
      "size": [
        315,
        58
      ],
      "flags": {},
      "order": 1,
      "mode": 0,
      "inputs": [],
      "outputs": [
        {
          "name": "UPSCALE_MODEL",
          "type": "UPSCALE_MODEL",
          "links": [
            3
          ],
          "slot_index": 0
        }
      ],
      "properties": {
        "cnr_id": "comfy-core",
        "ver": "0.3.26",
        "Node name for S&R": "UpscaleModelLoader"
      },
      "widgets_values": [
        "RealESRGAN_x4.pth"
      ]
    }
  ],
  "links": [
    [
      3,
      6,
      0,
      5,
      0,
      "UPSCALE_MODEL"
    ],
    [
      4,
      4,
      0,
      5,
      1,
      "IMAGE"
    ],
    [
      5,
      5,
      0,
      7,
      0,
      "IMAGE"
    ]
  ],
  "groups": [],
  "config": {},
  "extra": {
    "ds": {
      "scale": 1.4530724370494552,
      "offset": [
        -2303.8083006257466,
        -3257.3074044858145
      ]
    },
    "ue_links": []
  },
  "version": 0.4
}
Expand

アップスケールに使うノード

必要なノードは “Load Upscale Model” と “Upscale Image (using Model)“。必要な設定はモデルの指定のみ。出力サイズはモデルに依存するようで他の設定はない。(倍率は “x2” や “x4” といった数値がモデル名に含まれている)

アップスケールした画像

で、先程と同様に各種モデルを使いアップスケールを実行した。ちなみに倍率は4倍(1024×1024→4096×4096)で出力。

オリジナル画像との比較

アップスケールした画像を見てみるとどれもボヤッとした感じが無くなり鮮明になっている。また、倍率に差はあるものの先程試したアップスケーラーよりも良くなっているように感じる。

RealESRGANx4

オリジナル RealESRGAN_x4
オリジナル RealESRGAN

4x-AnimeSharp

オリジナル 4x-AnimeSharp
オリジナル 4x-AnimeSharp

4x-UltraSharp

オリジナル 4x-UltraSharp
オリジナル 4x-UltraSharp

4x-NMKD-Siax_200k

オリジナル 4x-NMKD-Siax_200k
オリジナル 4x-NMKD-Siax_200k

モデルによる違い

モデルごとの出力画像を比較するために並べてみた。
正直違いがわからん。もっと詳細に描き込まれた画像じゃないと違いに気付けないのかもしれない。

– PR –

Ultimate SD Upscale によるアップスケール

最後に “Ultimate SD Upscale” を使ったアップスケールを試す。
先程と同様にアップスケール専用のモデルを利用するが、これまでのアップスケーラーとはやや異なり、ざっくりと書くとi2iをカマしつつアップスケールするような処理となる。主な特徴は下記。

  • 画像を小さなタイル状に分割し個々にアップスケールを行う
  • そのため使用メモリは節約できるが時間がかかる
  • また、それらの機能によりさらなるアップスケール(4倍以上)も可能
  • アップスケール時に再描画されるためディテールの改善あるいは悪化する可能性がある

といった特徴やメリット・デメリットがある。

カスタムノードの追加

“Ultimate SD Upscale” ノードを使うには下記のカスタムノードが必要。インストール後再起動する。

ComfuUI_Ultimate SD Upscale カスタムノードのインストール
ComfuUI_Ultimate SD Upscale カスタムノードのインストール

サンプルワークフロー

ワークフローは下図の通り。アップスケールに必要なモデルとプロンプトを入力するノードを追加している。

アップスケールワークフロー(Ultimate SD Upscale)
アップスケールワークフロー(Ultimate SD Upscale)
JSON
{
  "last_node_id": 11,
  "last_link_id": 15,
  "nodes": [
    {
      "id": 11,
      "type": "CLIPTextEncode",
      "pos": [
        2622.076416015625,
        4123.39013671875
      ],
      "size": [
        321.13641357421875,
        131.79364013671875
      ],
      "flags": {},
      "order": 4,
      "mode": 0,
      "inputs": [
        {
          "name": "clip",
          "type": "CLIP",
          "link": 12
        }
      ],
      "outputs": [
        {
          "name": "CONDITIONING",
          "type": "CONDITIONING",
          "links": [
            9
          ],
          "slot_index": 0
        }
      ],
      "properties": {
        "cnr_id": "comfy-core",
        "ver": "0.3.26",
        "Node name for S&R": "CLIPTextEncode"
      },
      "widgets_values": [
        ""
      ]
    },
    {
      "id": 9,
      "type": "CheckpointLoaderSimple",
      "pos": [
        2263.333251953125,
        3947.47900390625
      ],
      "size": [
        315,
        98
      ],
      "flags": {},
      "order": 0,
      "mode": 0,
      "inputs": [],
      "outputs": [
        {
          "name": "MODEL",
          "type": "MODEL",
          "links": [
            10
          ],
          "slot_index": 0
        },
        {
          "name": "CLIP",
          "type": "CLIP",
          "links": [
            11,
            12
          ],
          "slot_index": 1
        },
        {
          "name": "VAE",
          "type": "VAE",
          "links": [
            13
          ],
          "slot_index": 2
        }
      ],
      "properties": {
        "cnr_id": "comfy-core",
        "ver": "0.3.26",
        "Node name for S&R": "CheckpointLoaderSimple"
      },
      "widgets_values": [
        "PONY\\2D\\momoiropony_v15.safetensors"
      ]
    },
    {
      "id": 6,
      "type": "UpscaleModelLoader",
      "pos": [
        2783.48291015625,
        3412.84033203125
      ],
      "size": [
        315,
        58
      ],
      "flags": {},
      "order": 1,
      "mode": 0,
      "inputs": [],
      "outputs": [
        {
          "name": "UPSCALE_MODEL",
          "type": "UPSCALE_MODEL",
          "links": [
            7
          ],
          "slot_index": 0
        }
      ],
      "properties": {
        "cnr_id": "comfy-core",
        "ver": "0.3.26",
        "Node name for S&R": "UpscaleModelLoader"
      },
      "widgets_values": [
        "4x-AnimeSharp.pth"
      ]
    },
    {
      "id": 10,
      "type": "CLIPTextEncode",
      "pos": [
        2623.172119140625,
        3943.204345703125
      ],
      "size": [
        321.13641357421875,
        131.79364013671875
      ],
      "flags": {},
      "order": 3,
      "mode": 0,
      "inputs": [
        {
          "name": "clip",
          "type": "CLIP",
          "link": 11
        }
      ],
      "outputs": [
        {
          "name": "CONDITIONING",
          "type": "CONDITIONING",
          "links": [
            8
          ],
          "slot_index": 0
        }
      ],
      "properties": {
        "cnr_id": "comfy-core",
        "ver": "0.3.26",
        "Node name for S&R": "CLIPTextEncode"
      },
      "widgets_values": [
        "score_9, score_8_up, score_7_up, source_anime, rating_safe, \n\n1girl, solo, \nmedium hair, boul hair, (gradient hair:0.7), (light orange hair:0.8), white hair, wet hair, \nyellow eyes, \nsmile, happy, open mouth, \nWhite blouse, dark red skirt, Tiered skirt, fashion, \nforeshortening, standing, low angle, (legs in foreground:1.1), \n\n\nlarge waterfall with high drop, shallow river, crystal-clear water, playing in water, daytime, nature scene, Blue sky, sunlight, "
      ]
    },
    {
      "id": 4,
      "type": "LoadImage",
      "pos": [
        2632.078125,
        3553.920166015625
      ],
      "size": [
        315,
        314
      ],
      "flags": {},
      "order": 2,
      "mode": 0,
      "inputs": [],
      "outputs": [
        {
          "name": "IMAGE",
          "type": "IMAGE",
          "links": [
            14
          ],
          "slot_index": 0
        },
        {
          "name": "MASK",
          "type": "MASK",
          "links": null
        }
      ],
      "properties": {
        "cnr_id": "comfy-core",
        "ver": "0.3.26",
        "Node name for S&R": "LoadImage"
      },
      "widgets_values": [
        "2025-03-16_154554_1024x1024_Generated_00001.png",
        "image"
      ]
    },
    {
      "id": 8,
      "type": "UltimateSDUpscale",
      "pos": [
        2981.6025390625,
        3551.274169921875
      ],
      "size": [
        315,
        614
      ],
      "flags": {},
      "order": 5,
      "mode": 0,
      "inputs": [
        {
          "name": "image",
          "type": "IMAGE",
          "link": 14
        },
        {
          "name": "model",
          "type": "MODEL",
          "link": 10
        },
        {
          "name": "positive",
          "type": "CONDITIONING",
          "link": 8
        },
        {
          "name": "negative",
          "type": "CONDITIONING",
          "link": 9
        },
        {
          "name": "vae",
          "type": "VAE",
          "link": 13
        },
        {
          "name": "upscale_model",
          "type": "UPSCALE_MODEL",
          "link": 7
        }
      ],
      "outputs": [
        {
          "name": "IMAGE",
          "type": "IMAGE",
          "links": [
            15
          ],
          "slot_index": 0
        }
      ],
      "properties": {
        "cnr_id": "comfyui_ultimatesdupscale",
        "ver": "778a475dde8116a2066fe07f6c9ca15554e0b5be",
        "Node name for S&R": "UltimateSDUpscale"
      },
      "widgets_values": [
        4,
        1123919076865816,
        "randomize",
        20,
        8,
        "euler_ancestral",
        "karras",
        0.30000000000000004,
        "Chess",
        512,
        512,
        8,
        32,
        "Half Tile + Intersections",
        1,
        64,
        8,
        16,
        true,
        true
      ]
    },
    {
      "id": 7,
      "type": "PreviewImage",
      "pos": [
        3319.255859375,
        3551.68408203125
      ],
      "size": [
        373.1026611328125,
        307.4725341796875
      ],
      "flags": {},
      "order": 6,
      "mode": 0,
      "inputs": [
        {
          "name": "images",
          "type": "IMAGE",
          "link": 15
        }
      ],
      "outputs": [],
      "properties": {
        "cnr_id": "comfy-core",
        "ver": "0.3.26",
        "Node name for S&R": "PreviewImage"
      },
      "widgets_values": []
    }
  ],
  "links": [
    [
      7,
      6,
      0,
      8,
      5,
      "UPSCALE_MODEL"
    ],
    [
      8,
      10,
      0,
      8,
      2,
      "CONDITIONING"
    ],
    [
      9,
      11,
      0,
      8,
      3,
      "CONDITIONING"
    ],
    [
      10,
      9,
      0,
      8,
      1,
      "MODEL"
    ],
    [
      11,
      9,
      1,
      10,
      0,
      "CLIP"
    ],
    [
      12,
      9,
      1,
      11,
      0,
      "CLIP"
    ],
    [
      13,
      9,
      2,
      8,
      4,
      "VAE"
    ],
    [
      14,
      4,
      0,
      8,
      0,
      "IMAGE"
    ],
    [
      15,
      8,
      0,
      7,
      0,
      "IMAGE"
    ]
  ],
  "groups": [],
  "config": {},
  "extra": {
    "ds": {
      "scale": 1.1632177155531798,
      "offset": [
        -2083.0032437657965,
        -3301.384795632923
      ]
    },
    "ue_links": []
  },
  "version": 0.4
}
Expand

アップスケールに使うノード

必要なノードは “Load Upscale Model” と “Ultimate SD Upscale“。それとチェックポイントとプロンプト、画像の入出力が必要となる。

“Load Upscale Model” は先程利用したものと同じでモデルを読み込むノード。”Ultimate SD Upscale” はアップスケール処理を行うノードとなる。”Ultimate SD Upscale” の設定項目については下記の通り。

ここで試したアップスケールの設定は赤マーカーの設定値。それ以外はデフォ。

設定項目説明
upscale_by倍率
→ 4
seedシード(数値で画像が変化)
control_after_generateシードの変化
fixed(固定)
increment(1ずつ増加)
decrement(1ずつ減少)
randomize(乱数)
stepsノイズ除去の回数
cfgプロンプトの強調度
sampler_nameサンプラー
→euler_a
schedulerスケジューラー
→karras
denoiseノイズの除去量
※これを増やすと絵が変化しやすくなる
→0.3
mode_typeタイル分割後の再描画順
Linear(順に処理)
Chess(1つ飛ばしで処理、継ぎ目の不自然さが軽減される)
None(再描画しない)
tile_widthタイルの幅
tile_heightタイルの高さ
mask_blurタイルマスクのぼかし量、数値を多くすると継ぎ目の不自然さが軽減される(目安としてタイルが512~768pxなら12~16)
tile_padding再描画時に考慮する隣接ピクセルの量
seam_fix_mode継ぎ目の補修。タイルの継ぎ目が目立つようなら有効にする。(記載順で効果が強くなり処理時間も増加する)
None(何もしない)
Bands pass(継ぎ目を中心に狭い範囲を補修)
Half tile(Bands passより広い範囲を補修)
Half tile offset + intersections pass(継ぎ目の交差部分を中心に広い範囲を補修)
→Half tile offset + intersections pass
seam_fix_denoise継ぎ目の補修でのノイズ除去量
seam_fix_widthBands pass選択時の補修幅(?)
seam_fix_mask_blur継ぎ目の補修でのマスクのぼかし量
seam_fix_padding継ぎ目の補修をする際に考慮する隣接ピクセルの量
force_uniform_tiles画像端の処理時に画像サイズに合わせてタイルサイズを変更するかどうか。変更する場合は不規則なタイルサイズとなるため意図しない描画がされる場合がある。
→true
tiled_decodeタイルごとにデコードする。VRAM節約。(多分・・・)
→true

アップスケールした画像

ダウンロードした各モデルを使い実際にアップスケールしてみた。倍率はこちらも4倍(1024×1024→4096×4096)で出力。

オリジナル画像との比較

全体的にな印象として、拡大によるボケやジャギーが軽減されているのはもちろんだが、画像全体が再描画されているということもあり大分ディテールに補正が加えられている。また逆に意図しない色の変化や滲みなども確認できるので一概に良くなったとも言い難い。とはいえこういった問題は、モデル、デノイズ、シード値、サンプラー等の調整次第で軽減できる可能性は十分にある。

RealESRGANx4

オリジナル RealESRGAN_x4
オリジナル RealESRGAN_x4

4x-AnimeSharp

オリジナル 4x-AnimeSharp
オリジナル 4x-AnimeSharp

4x-UltraSharp

オリジナル 4x-UltraSharp
オリジナル 4x-UltraSharp

4x-NMKD-Siax_200k

オリジナル 4x-NMKD-Siax_200k
オリジナル 4x-NMKD-Siax_200k

モデルによる違い

わからんw

そもそもアップスケールの度に再描画されるのでプロンプトやパラメーターに寄るところが大きいし、絵面や雰囲気は Checkpoint や Lora に依存するように感じる。なので色々と試すしか無い。

さいごに

ざくっとまとめてみる。

アップスケーラー画質倍率処理コスト補正
Upscale Image
Upscale Image (using Model)
Ultimate SD Upscale

というわけで個人的な評価はこんな感じ。それぞれ一長一短あるが、仕上げには “Ultimate SD Upscale” を使うのが無難に感じる。

とうわけでアップスケールでした。また時間があれば何か書きます。

用語

用語的なものを一応まとめておく。的を得ているかはわからん。

Q
アップスケール(Upscale)とは
A

画像や動画を高解像度にすること。単純な拡大とは違って画質向上が目的。よくアプスケと略される。

Q
アップスケールで言う倍率とは
A

Width と Height の倍率。つまり、1024×1024 の2倍なら 2048×2048(面積でいうと4倍)、4倍なら 4096×4096(面積で言うと8倍)

コメント

タイトルとURLをコピーしました