見出し画像

【ComfyUI】画像拡大AIを自分で作る【ワークフロー自作入門①】

はじめに

この記事は「やりたいことがあるのに適切な記事やワークフローが見つからない」ときに、自作という選択肢を選べるよう、その入り口までのお手伝いをするためのものです。
あるいは古い画像ファイルにありがちな、JPEGの極端なノイズを取ったり、やたらと小さな解像度を何とか実用レベルの解像度に上げたい。生成AIの画像じゃなく、画像ファイルをアップスケールしたいときに、それが実現できるツールが欲しいという方のためのものかもしれません。

「解説はいいからやり方だけ教えろ!」という江戸っ子は、ワークフローの作り方の基本の基礎の入門ミッシングリンク、からお読みください。さらに「やり方すら要らん!アップスケーラーのワークフローだけよこせ!」という宵越しの銭さえ持たない勢はアップスケーラーワークフローを作ってみるに飛びましょう。ちなみに、あえてワークフローの配布はありません。簡単なものだから自作してみましょう!


想定している状況と目的

古い写真が検索で見つかったり、あるいはドライブにあったりするけど、昔の環境のものだから「解像度がVGAサイズ(640x480)」など今となってはあり得ないくらい荒い、なんていうことはよくあります。

でも当時出回っていた、ストレージを節約するためにやたらと圧縮率を上げたJPEGファイルなどは、ブロックノイズなど特有のアーティファクトで満たされていて、拡大に耐える品質とはいえません。

gimpやスーパーズームを含むフォトショなどの高機能な拡大縮小であっても、一発で満足いく拡大はできません。
そんな時、ほとんどの人はアップスケーラーを探す旅に出ると思います。

そしてたくさんのオンライン拡大サービスに行き当たりますが、「家族や恋人や友人…プライベートな写真をネットにアップロードするのはリスクが大きい」と思い、こういうサービス無駄にいっぱいあるなーなどと感想を述べて終わり。

かといってローカルで使えるものを探しても、よくわからない有料ソフトがいっぱい引っかかってきて、結局行き詰って、たどり着くのがローカルAIアップスケーラーによる拡大。

でも日本のウェブサイトはほとんどすべて、「StableDiffusion1.5で生成された低解像度の画像を、同じタスク内で拡大する」みたいなものばかりで、素直に写真を拡大するためのアップスケーラーの情報がほとんど引っかからない。そして心が折れてあきらめる。

この記事はそんな状況を想定しています。そしてそんな人たちに役立てること+自分のニーズを自分で賄える自作の道に案内することを目的としています。

グラフィックツール自作環境としてのComfyUI

ComfyUIは「AIを実行するツール」ではありません。やろうと思えば何でもできる「ノーコード開発ツール」の一種…つまりプログラム開発環境の仲間です。先ほど想定していたような状況は、じつはComfyUIを導入して必要な処理(の流れ)が自作できれば簡単に解決してしまいます。
まずはComfyUIが自分のマシンで動作していることが大前提となりますので、まだの方はこちらの記事を読んで導入しておきましょう。

開発ツールとしての側面ではなく、便利なツールとしての側面だけをみてComfyUIを導入して、ありもののワークフローをゲットして、モデルを落としていろいろ作品を作って…
おそらくほとんどの人はそんな風にComfyUIの世界に入るのではないでしょうか。

そして先に進もうとしても大きな壁がそびえていて行き詰まる。その壁が「ワークフローの自作」です。といっても、ワークフローを作ることそのものは目的ではありません。

やりたいことがあるとき、おそらく皆さん「やりたいことの内容 ComfyUI」などあるいはそれに近いワードで検索し、すでに実現している人の記事からワークフローやモデルなど必要なものをセットアップすると思います。

でも、必ずしも必要なものが見つかるとは限りません。特に「知ってて当たり前」みたいな前提を大半の人たちが共有していて、あらゆることが前触れもなく書かれているけれど、それを自分自身はどうやって導入したらいいかわからないケース。
この記事が題材として取り上げるアップスケーラー+画像のノイズリダクションは典型例と言えるでしょう。

現状

というわけで、専用ツールやWebUIその他を排除してComfyUIだけで探してみたとします。
たとえば「ComfyUI アップスケーラー おすすめ」といった単語で検索してみると、最初に引っかかるのはredditの記事
たくさんのアップスケーラーが挙げられていて、みんなでその良し悪しについて話し合っています。でも初心者にとって、それはワークフローの形をしていないし、配布もされていないから、結局何が話し合われているのか理解できない。
続くGeminiによる「AIによる概要」でも

ComfyUIのアップスケールには、高品質で高速なUltimate SD Upscaleノードと、描写力が高い4x-Ultrasharpモデルの組み合わせが最適です。高解像度化の際は、denoise値を0.3〜0.5程度に設定し、元画像のディテールを保ちつつ描画を追加するのがおすすめ。

ComfyUI おすすめアップスケール手法最強の組み合わせ: Ultimate SD Upscale + 4x-Ultrasharp
特徴: タイル分割処理により、VRAM消費を抑えながら、高精細かつ自然な仕上がりになる。特に人物の瞳など、細かい描写に強い。
高速・シンプル: Upscale Image (using Model)
特徴: Upscale Image (using Model)ノードに4x-UltrasharpやESRGAN系のモデルを読み込ませる方法。数秒で2倍〜4倍の拡大が可能。
高精細・Detailer利用: Impact Pack
特徴: Impact Packに含まれるDetailerを使用し、画像をタイル分割して再描画する。細かい質感や、髪の毛などの描写が大幅に向上する。


アップスケール時のポイントモデルの選択: アニメ系ならR-ESRGAN 4x+ Anime6B、リアル系なら4x-UltrasharpまたはESRGAN系がおすすめ。
Denoise値: 0.3〜0.4程度が自然。低すぎるとぼやけ、高すぎると元画像から乖離する。
GPU高速化: TensorRTを使用すると、さらに爆速で処理が可能。


まずは、Ultimate SD Upscaleノードに4x-Ultrasharpを適用する基本構成から始めるのが最もおすすめです。

Google検索より

などと書かれているけれど、これも訳が分からない。さらに検索結果をいろいろ見てみても、StableDiffusionなどを組み合わせるだとかQwen Image EditやらFlux.1 KontextやFlux.2を使うやらいろいろ出てきて、合間に「そんなめんどいことしないでうちの有料ソフト買ってよ」みたいな、記事を装ったステマ広告がヒットしたり…探すだけで時間が溶けて、結局またまた心が折れてしまう。

ほんの1年前の記事が「昔の」で語られてしまう新しいジャンルだけに、逆に情報が全然整理されていないからです。

アップスケーラー

先ほどのRedditのフォーラムで語られていた記事には、OpenModelDBというサイトに行けと書かれていました。

これは様々なAIのオープンモデルを探してダウンロードするためのサイトです。紹介されていた様々なアップスケーラーは、それぞれ独立したオープンモデルとして作られたものです。

超基本的かつ雑な基礎知識

さて、そもそも私たちが今普通にローカルAIを使うとき、音楽生成から静止画生成、音声付き動画から3Dメッシュ生成まで、じつにさまざまなものがあります。しかし、これらはほとんどすべてPyTorchというpythonモジュールの上で動作しているんです。
PyTorchはニューラルネットワークを構築するための仕組みで、
・Tensorはニューロンや重みなどを数値として表すための枠組み。
・学習したモデルはpth形式のファイルとして保存される。
・safetensor形式のファイルは.pthの安全版。
という感じ。
そして、これらのモデルにデータをロードしてpytorchで処理させ、得られた結果をさらに処理し…という処理の流れ(パイプライン)を作り、最終的に結果を出力あるいはファイルに保存するという流れですべてのAIが出来上がっています。
つまり、Redditで語られていたのはStableDiffusionやFlux.1やLTX-2のような、個別のモデルの話だったんです。

こうした個別のモデルでパイプラインを作るための方法が複数あり、ある人はGradioインターフェースで、別の人はコマンドラインで、また別の人はComfyUI上のワークフローで、処理の流れを構築して必要な処理を行わせています。
まずはここを理解しておくといいでしょう。つまりComfyUIを
「画像や動画を生成するためのAIそのもの」
としてとらえる人がたくさん見受けられますけれど、実際には
「ComfyUIとは、いろいろなAIモデルやローダーなどのユーティリティーを並べて配線して自分の好きな道具をノーコードで作れる作業台
なんです。

そう。最初期から触れている人と普及してから始めた人の間には、埋めがたい「とてつもない谷」が広がっているのです。

で、どうしろと…?

「アップスケーラーモデル」が「画像生成AIのモデル」と同じものだとイメージできれば、やるべきことも画像生成AIのモデルなどと同じような感じになることが分かりやすくなると思います。
つまり「モデルをインストールして、ComfyUIに読んで、適切に接続する」が正解。
というわけで、次節からは実際にワークフローを作りながら、「モデルをインストールして、ComfyUIに読んで、適切に接続する」流れを追ってみましょう。

ワークフローの作り方の基本の基礎の入門

新規作成

新規のワークフロー作成は、Cメニューの上あたりに並ぶワークフロータブの一番右にある+ボタンを押して開始します。

クリックすると「Unsaved Workflow*」(場合によってカッコ数字が入る)というからのワークフローが生成されます。
Linuxなどでunixシステムのツールキット思想(Unix哲学)に触れている人は理解が早いと思うんですが、ワークフローはほぼコマンドラインパイプラインと同じようなもので、処理と処理を経路でつなぎ、一つの大きな仕事をさせるためのものです。言い換えれば、ワークフローには起点と終点が必要です。これらと、間をつなぐ点でワークフローが構成されます。この点のことを「ノード」といいます。
起点はAIに読ませるデータを用意して流し始めるノード。終点は表示したりファイルに保存したりするノードです。流れるデータについては明確に種類が存在し、同種のデータが流れるポイント同士だけ接続できます。

目的に応じた「起点と終点」

まずはどのような作業を目的にするかによって、どのような起点が必要なのかが分かれます。
具体的には、プロンプトを入力するとAIが画像を…みたいなタイプの場合、起点は「プロンプト文字列を入力して流すノード」つまり「文字列」となり、入力画像をもとにAIが何かする(たとえばI2Vのような)…といったタイプなら、起点は「画像を用意して流すノード」つまり「画像を読み込む」となります。
もちろん文字列と画像は種類の違うデータなので、お互いは直接接続できません。

Cメニューの下にある「ノード」を開いて、検索から探せれば一番ですが、実際にはテキスト入力の機能が欲しいときに対応するノード名を一発で探り当てるのはかなり難しいでしょう。文字列ノードあたりなら思いつくかもしれませんが、「アウトペイント用に画像をパッド」みたいな名前になってくるとかなり難しいと思います。
そんな時にはGoogleなどで「ComfyUI 探したい機能の名前 []」などと検索すれば、ノードの名前が載ったページが見つかることでしょう。

ともあれ、今回は「画像のアップスケーラーあるいはノイズリダクション」がテーマなので、起点は画像読み込みです。
終点はアップスケールもしくはノイズ取りされた画像をファイルとして保存することなので「画像を保存」ノードあたりを選んでおけばいいでしょう。このシリーズが続けば、そのうち高機能な画像保存ノードもご紹介します。

最初のワークフロー

それでは最初のワークフローを作ってみましょう。とても簡単です。
単に起点と終点を結んでしまうだけ。

実行するとoutputディレクトリにpngファイルが保存されます。

読まれた画像と同じ大きさのpng画像を書き出しただけ。
まったく無意味な気がしますか? じつはそうでもないんです。
こうして出力された画像をComfyUIにドラッグアンドドロップすると、この画像を作るのにつかわれたワークフローが読まれます。つまり、一見何も起こっていなかったようでいて、ワークフローを画像に埋め込むという仕事はちゃんとこなしていたわけです。
起点があって、終点がある。そしてデータが流れる。確かにワークフローです。
ここまで出来たらワークフロータブの上で右クリックしてメニューを出し、「名前を付けて保存」を選択します。

ダイアログが出るので「Image Upscale」など適当な名前を付けて「確認」を押しましょう。

次回以降はCメニュー下の「ワークフロー」を開くと、今回保存したワークフローが呼び出せます。

Redditなどで話し合われていたこと

先ほどご紹介したフォーラムで、OpenModelDBというサイトに飛べなどと言われていましたが、実際に飛んでみてもいまひとつわからない方が多かったと思います。
それは「ここでアップされているモデルをどう使うかという知識は、常識として共有されていて、初心者にそれが伝わる経路がなく、伝える必要性が認識されていないから」です。たとえばフォーラム「最高のアップスケールモデルって何?」でも、フォーラム主のお気に入りは4x_NMKD_Siax_200kだけど、ほかにも…みたいな書かれ方をしています。だからといって、とりあえず4x_NMKD_Siax_200kでググってみても、ワークフローはおろか、ComfyUIとかかわりそうな記事も先ほどのフォーラムしか引っかかってきません。
どうしたらいいんでしょう…?

ミッシングリンク

というわけで、知識のミッシングリンクを埋めてしまいましょう。じつはOpenModelDBはhuggingfaceやcivitaiなどと同じく、AIモデルなどの配布サイトです。そして、このサイトはStableDiffusion以前から存在しているため、safetensorではなくpthで配布されていることが多いので、昨今この世界に入った人は「pthなんて拡張子知らない。どうやって使ったらいいんだ!」なんてことになってしまいます。周囲に話しても「ねーわ」と言われますが「生成AIに触っていながらpthを知らない民」は実在しています。それほどの断絶が存在するんです。

結局よく目にするsafetensorと同じようなものなので、ここまでわかれば、あとは「どこに配置するか」というだけです。結論から言えば、
models\upscale_models\
以下です。ここに配置されたモデルファイルは、ComfyUI上で「モデル」メニューの「upscale_models」カテゴリとして表示されます。

そして、このモデルはモデルノードとしてComfyUI上に配置できます。

アップスケーラーワークフローを作ってみる

では先ほどの超簡単ワークフローを発展させて、アップスケーラーを構築してみましょう。

モデルのダウンロード(Manager経由)

まずはアップスケーラーのモデルが必要です。OpenModelDBからもダウンロードできますが、一番簡単なのはおそらくManagerから導入する方法です。まずはManagerを開き、Model Managerを選択します。

Model Managerが開いたら、検索に4x_NMKD-Siax_200kと入力します。先ほどのフォーラムでも出てきたものですね。

Installを押せばダウンロードされます。InstallステータスがReflesh Requiredになったら、下のほうにある青いRefleshボタンを押します。リフレッシュされるだけで再起動はかかりません。

Restartじゃないから早い

終了したらManagerは閉じて、モデルメニュー内のupscale_modelsをクリックし、中に今ダウンロードしたモデルが表示されているのを確認します。

アップスケーラーワークフローの完成…完成…?

いきなりですが、ここまで来たら、このモデルノードをクリックしてComfyUI上に配置し、さらに「ノード」メニューの「画像」内の「アップスケーリング」カテゴリにある「モデルを使用して画像を拡大」ノードをクリックして配置します。

そうしたら、これらを繋ぎ変えて、拡大したい画像を「画像を読み込む」ノードに読んでおきます。

ちなみに読んだ画像は以前の記事で生成した猫の画像を1/4にリサイズし、gimpで「品質10.0」でエクスポートしたものです。自分でアップスケールしたい画像がないときにはこちらをご利用ください。

元の画像とは比べるべくもない低品質さ加減です。

準備ができたら「実行する」をクリックしてみましょう。

出力された画像はこんな感じ

確かにgimpなどのグラフィックツールで補完アルゴリズムを使ってx4した画像に比べれば、AI拡大なのでディテールは保たれていると思います。以下gimpで4倍にした画像です。

とりあえず、確かに拡大はできたけど、JPEG圧縮によるブロックノイズなどのアーティファクトがすごく目立っていて、わざわざAIアップスケーラーを使うメリットが感じられなかったのではと思います。

デノイズ…ノイズリダクション

めげずに次に進みます。アップスケーラーは本来、拡大が仕事。だからノイズを何とかするのはこのモデルの仕事ではないんです。
ではどうするか。
フォーラムで話し合われていたおすすめアップスケールモデルにはデノイズも一つでこなしちゃうものもありますが、まずは将来の応用範囲を広げるために、専用のJPEG用デノイズモデルを使います。これも様々なものがあるんですが、探し方も様々。最近は検索エンジンよりもフォーラムを追いかけたりChatGPTなどのAIに聞くほうがいろいろ見つかったりします。
今回使うのはFBCNNという、JPEGの圧縮ノイズなどを掃除してくれるモデルです。オフィシャルはこちら

でも、ComfyUIにはすでにカスタムノードとして用意されているので、ManagerからCustom Node Managerを選んで、fbcnnで検索してみてください。

Installを押し、しばらくしたらRestartを押します。これでインストールされるので、「ノード」メニューの「アップスケーリング」項目にJPEG Compression Removal - FBCNNがあるのを確認し、クリックして配置します。

そうしたら、アップスケーラーに通す前にFBCNNを通すようにつなぎなおします。さらに、FBCNNのCompression levelを、そのJPEGの圧縮度に応じて変更します。これはピクセル数とファイルサイズから求められますが、今回は長くなるのでご自身で調べてみてください。今回のサンプル画像は10.0、つまり90%圧縮なので、90に設定します。

デノイズが足りないと思ったら、前段だけでなく後段にもかけてしまう。こういうアレンジが自在にできるのも自作の強みです。


再度実行して、得られた画像はこんな感じです。

元画像がかなり極端な圧縮をしているので、デノイズしたところでひどい画質なのは変わらないですが、それでもかなりましな画像が得られました。
とはいえ、これで終わりではありません。もっといい結果を得るために拡張していきましょう。

次回は

この記事の続きとして、次回はいよいよフォーラムで語られていたOpenModelDBの使い方を解説します。
でも、今回のやり方だけでも、わざわざESRGANなどを苦労して導入するよりもデノイズが効いている分「ましな結果」だったので、古い写真を何とかしたい方にお役立ていただけるといいなと思っています。
ちなみにRealESRGANで2倍に拡大した例はこちらです

RealESRGAN

缶のあたりのブロックノイズなどを見るに、今回自作したワークフローのほうがほんの少しまし。
次回はこちらの記事になります。

引き続きステップバイステップで参りましょう。

いいなと思ったら応援しよう!