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


基本的なアップスケール
まずComfyUIの標準ノードでできるアップスケールを試してみる。
ワークフロー
簡単なワークフローを作ってみた。

ワークフローのJSONデータ。全コピしてComfyUIでペーストすればワークフローが読み込める。
{
"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
}
アップスケールに使うノード
使用するノードは “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 という感じ。


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

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

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

{
"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
}
アップスケールに使うノード
必要なノードは “Load Upscale Model” と “Upscale Image (using Model)“。必要な設定はモデルの指定のみ。出力サイズはモデルに依存するようで他の設定はない。(倍率は “x2” や “x4” といった数値がモデル名に含まれている)
アップスケールした画像
で、先程と同様に各種モデルを使いアップスケールを実行した。ちなみに倍率は4倍(1024×1024→4096×4096)で出力。








オリジナル画像との比較
アップスケールした画像を見てみるとどれもボヤッとした感じが無くなり鮮明になっている。また、倍率に差はあるものの先程試したアップスケーラーよりも良くなっているように感じる。
RealESRGANx4
4x-AnimeSharp
4x-UltraSharp
4x-NMKD-Siax_200k
モデルによる違い
モデルごとの出力画像を比較するために並べてみた。
正直違いがわからん。もっと詳細に描き込まれた画像じゃないと違いに気付けないのかもしれない。


Ultimate SD Upscale によるアップスケール
最後に “Ultimate SD Upscale” を使ったアップスケールを試す。
先程と同様にアップスケール専用のモデルを利用するが、これまでのアップスケーラーとはやや異なり、ざっくりと書くとi2iをカマしつつアップスケールするような処理となる。主な特徴は下記。
- 画像を小さなタイル状に分割し個々にアップスケールを行う
- そのため使用メモリは節約できるが時間がかかる
- また、それらの機能によりさらなるアップスケール(4倍以上)も可能
- アップスケール時に再描画されるためディテールの改善あるいは悪化する可能性がある
といった特徴やメリット・デメリットがある。
カスタムノードの追加
“Ultimate SD Upscale” ノードを使うには下記のカスタムノードが必要。インストール後再起動する。

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

{
"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
}
アップスケールに使うノード
必要なノードは “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_width | Bands pass選択時の補修幅(?) |
seam_fix_mask_blur | 継ぎ目の補修でのマスクのぼかし量 |
seam_fix_padding | 継ぎ目の補修をする際に考慮する隣接ピクセルの量 |
force_uniform_tiles | 画像端の処理時に画像サイズに合わせてタイルサイズを変更するかどうか。変更する場合は不規則なタイルサイズとなるため意図しない描画がされる場合がある。 →true |
tiled_decode | タイルごとにデコードする。VRAM節約。(多分・・・) →true |
アップスケールした画像
ダウンロードした各モデルを使い実際にアップスケールしてみた。倍率はこちらも4倍(1024×1024→4096×4096)で出力。








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