【第1回】ComfyUI でAI動画をアップスケール——SeedVR2 と 4x-UltraSharp を比べて Shorts 用に高画質化
Grok で作った 496×608 のハロウィン動画を、YouTube Shorts 用に 1080 幅へアップスケールした。引き伸ばし、拡大+シャープ、GAN 系の 4x-UltraSharp、動画用の拡散モデル SeedVR2 を並べた記録。かかった時間、見た目の差、ハマりどころ。
ハロウィンの朝、Grok で 6 秒の動画を作った。白い髪の 2 人が「トリート!」「トリック!」「ハッピーハロウィン」と言うだけの短いものだ。
これを YouTube Shorts に上げようとして、つまずいた。
小さい動画は、投稿先で潰れる
Grok から書き出した動画は 496×608 だった。Shorts は 1080×1920 の縦長が基本なので、幅は半分以下しかない。
そのまま上げると、投稿先が勝手に引き伸ばす。そもそも小さく上げた動画には、小さい画質しか作られない。そこで、別のツールで「拡大+シャープ処理」をかけて、上下をぼかした 9:16(1080×1920)にした版を用意した。
上げてみると、YouTube の画質メニューには 360p しかなかった。ガビガビだ。
これはアップロード直後だったせいだ。YouTube は先に 360p を作り、720p や 1080p は後から足す。API で状態を聞くと「処理完了」と返ってくるが、それは再生できるという意味で、高画質版ができたという意味ではなかった。しばらく待つと 1080p が選べるようになった。
ただ、1080p で見ても輪郭が少しにじんでいて、文字のまわりにうっすら白いふちが出ていた。引き伸ばしたあとにシャープ処理をかけたときに出る跡だ。
拡大+シャープは、元の情報を増やさない。投稿先で引き伸ばされて潰れるよりはマシ、という処理だ。これからショートドラマを作っていくなら、拡大は毎回必要になる。手元の ComfyUI で、AI での拡大を試すことにした。
比べた 4 つ
| やり方 | 仕組み | 時間 | |
|---|---|---|---|
| ① 引き伸ばしただけ | lanczos で 1080×1324 に拡大 | 画素を補間するだけ | 一瞬 |
| ② 拡大+シャープ | 別のツールで拡大して輪郭を強調 | 補間+輪郭の強調 | — |
| ③ 4x-UltraSharp | GAN 系の拡大モデル | 1 コマずつ、線や模様を推測して描き直す | 約 5 分 |
| ④ SeedVR2(3B・int8) | 動画用の拡散モデル | 前後のコマもまとめて見ながら、細部を描き足す | 約 23 分 |
環境は RTX 3090(24GB)と ComfyUI。元の動画は 24fps・145 コマ・6 秒。どれも絵の部分を 1080×1324 にして、上下のぼかし帯は最後に ffmpeg で付けた。
③④には、② ではなく Grok から書き出したままの元の動画を入れた。 拡大済みの版を AI に入れると、前の拡大で出たにじみや圧縮のノイズまで「細かい模様」として描き直してしまうからだ。9:16 のぼかし帯も同じ理由で、絵だけを拡大してから最後に付け直した。
見た目
顔と文字(左から ①②③④):
① と ② はほぼ同じに見える。② は輪郭が少し強いぶん、文字のまわりに白いふちが出ている。③ と ④ は、髪の線、目、文字の輪郭がはっきりする。この大きさだと ③ と ④ の差は小さい。④ のほうが塗りがなめらかで、ざらつきが少ない。
体と小物:
差が出たのはこちら。ベルトのバックル、ポーチの金具、指の形は ④ がいちばんはっきりしている。ただし ④ は、ポーチにひもの線を 1 本足すなど、元の絵に無いものも少し描いている。描き足すモデルなので、ここは良し悪しだ。
全体:
全体を縮めて並べると、4 つともほとんど同じに見える。スマホの Shorts 画面で見る大きさなら、差はわずかだ。
色は 4 つともほぼ同じだった。④ は SeedVR2 の後処理で、元の色に合わせる処理(lab)を入れている。
ちらつき
1 コマずつ拡大すると、コマごとに結果が少しずつ変わり、ちらつくことがある。そこで、隣り合うコマの差の平均(コマ間の変化量)を測った。どれも同じ大きさ(540×662 のグレー)に縮めてから測っている。
| コマ間の変化量(平均) | |
|---|---|
| 元の動画 | 6.61 |
| ② 拡大+シャープ | 7.50 |
| ③ 4x-UltraSharp | 7.50 |
| ④ SeedVR2 | 7.53 |
③ は 1 コマずつの処理だが、変化量は ② と同じで、ちらつきは増えていなかった。④ も全体では同じだ。ただ、ほとんど動かない場面のいくつかのコマで、元の動画の 2 倍ほど変化していた。動画で見て気になるほどではなかった。
時間とハマりどころ
4x-UltraSharp:約 5 分
流れは、VHS の Load Video(format は None)→ Upscale Image (using Model) → Image Scale(lanczos で 1080×1324 に縮小)→ 連番 PNG。145 コマを 50 コマずつ 3 回に分けて、合計 4 分半ほどだった。
4 倍に拡大してから縮めるので、途中の画像は 1 コマ 1984×2432 になる。145 コマを一度に流すとメモリが厳しそうなので、念のため分けた(一度に流すのは試していない)。
SeedVR2:約 23 分、ほとんどが VAE
ComfyUI 本体に、SeedVR2 用の標準ノードと動画拡大のテンプレートが入っていた。モデルは本体が 3.5GB、VAE が 0.5GB。
時間の内訳がおもしろい。拡散の本体(1 ステップのサンプリング)は、3 つに分けたかたまりがそれぞれ 15 秒前後で終わる。残りの 20 分強は、ほぼ VAE のエンコードとデコードだった。テンプレートどおり 512px のタイルに分けて処理していて、デコードだけで 13 分ほどかかった。メモリは 31GB 中 約 20GB を使った。
ほかに気づいたこと:
- 縦横を 16 の倍数、コマ数を「4 の倍数+1」にそろえる処理がノードに入っている。足りない分は詰め物をして、最後に元の大きさに切り戻してくれる。145 コマはちょうど条件に合っていた
- テンプレートは ComfyUI の画面で使う前提(サブグラフ入り)なので、API から流すには、ノードのつながりを読み解いて組み直す必要があった
YouTube に上げた直後は 360p
冒頭のとおり。上げてすぐ見比べても意味がない。15〜30 分ほど待って、画質メニューで 1080p が選べるようになってから比べる。
どれを採ったか
④ の SeedVR2 版を公開した。
正直に言うと、スマホで 6 秒見るぶんには ③ と ④ の差はわずかだ。時間は ③ が 5 分、④ が 23 分。
- 急ぐなら ③ 4x-UltraSharp。 速くて、元の絵を変えない。1 コマずつの処理でも、ちらつきは増えなかった
- 細部まで詰めたいなら ④ SeedVR2。 小物や指がはっきりする。ただ、元の絵に無いものを描くことがあるので、文字や顔が別物になっていないかは見て確かめる
次は、ショートドラマ用のもっと長い動画で試す。単純計算だと、6 秒で 23 分なら 1 分の動画では 4 時間近くかかる。デコードのタイルを大きくすれば速くなるかもしれないが、まだ試していない。