2024-01-21(更新)

【ComfyUI】画像を「1枚ずつ」読み込むバッチ処理を回す方法

ComfyUIで連番画像を読み込むと全ファイル一気にメモリに読み込まれてしまうため大量のファイルは危険!1枚ずつ読み込んで処理していく方法を記す。

Article Image

2024-01-21:画像を書き出すときのノードについて追記

連番画像の読み込みに注意!

ComfyUIで連番画像を読み込むときは注意が必要。

どういうことかというと、次のようなノードを組むと...

読み込み例

VideoHelperSuiteLoad Images(Path)で1000枚読み込んだとすると、この1000枚が一気にメモリ上に読み込まれる。

これが危険。

この状態で1000回バッチを回すと...

上のノードのままComfyUIでBach Countを1000にしたらどうなるだろうか?

Bach Countが1000の画面

これは注意だ。1000枚メモリに読み込まれる作業が1000回繰り返される。

強制終了まっしぐらになる。

残念ながらComfyUIは「1枚ずつ読み込み」に対応していない

私の知る限りComfyUIは標準機能で1枚ずつ読み込むタイプのバッチに対応していないと思われる。

つまり0001.pngを読み込んで処理、次のループで0002.pngを読み込んで処理....という繰り返しに非対応

全部一気に読み込むしかない。

自分でノードを組めばできる

長くなったが、これを自分で組んでやればかろうじて対応できるので、これをこの記事で紹介する。

Was Node Suite

ComfyUI ManagerWas Node Suiteをインストールしておこう。必須級カスタムノード。

Was Node Suiteの名前

ComfyUI Managerを知らない場合は次のURLで解説。こちらも必須スクリプト。

【ComfyUI基礎シリーズ#4】ComfyUI Managerの詳しい使い方 | 謎の技術研究部

Load Image Batch

Load Image Batchというノードが今回のキーノード。

  • WAS Suite > IO > Load Image Batch
  • 検索名:Load Image Batch (検索にもスペースが必要なので注意)

Load Image Batch外観

このノードはModeincremental_imageにすることでComfyUI側のバッチカウントが増えるごとに1枚ずつ順番に読み込んでくれるノード

incremental_image外観

一応これで「完成」

極端な話、画像の読み込みをこれにしてノード全体をみ、あとはComfyUIのBatch countファイル数と同じにして実行すれば目的は達成だ。

メモリに全部よみこまれることなく1枚ずつ処理することができる。

ただし、中断した時は注意!

しかし、この処理はComfyUIの標準ではないので、バッチを途中で中断=>再開した場合ファイル番号が途中から読み込まれてしまう

しかもこれComfyUIの再起動でもカウントが保存されたままになることがある...!

つまり、100枚ある画像のうち10枚目で手動停止し、再度Batch Countに100を入れて実行すると...

画像は10枚目から処理がスタートし、更に初回で処理した10枚を重複して処理することになる。

さらに、保存時のネーミングを0000.pngから絶対値処理していると、10枚目の画像なのに保存は0000.pngの名前がつくなど不具合も様々。

少し作り込んだ完成形

恐らく次が現時点での完成形。調べた限りこれ以上良いアイデアはなかった。

完成形

使い方

最初の1回はLogicBooleanに「1」を入れてこのまま1回だけ実行する(バッチカウントを入れない)

2周目以降はLogic Booleanに「0」を入れ、バッチカウントをファイル数-1にして実行すれば完了。

この組み方なら中断した場合もう一度上の手順を踏めば最初のファイルから処理出来る

次はノード解説。Was Node Suiteをインストールすること。

1:Logic Boolean

検索名はノード名と同じ。

1はtrueの意味。1が入っているときは次のノードがリセットされる。

このノードを使ってリセットしないと、再起動やF5更新を押してもカウントが途中から再開されてしまうため。

2:Number Counter

検索名はノード名と同じ。

各パラメタの設定に注意。

start = -1にする(読み込み処理より前に+1されるため)

これはバッチループが回ってくるたびにカウンタに+1されるというもの。

この仕組みを使って次のノードで順番にファイルを読み込む。

3:Load Image Batch

検索名はノード名と同じ。

このノードは上で解説。

ノードを右クリックしてConvert index to inputを押すことで入力ピンに変換できるので、そちらへ繋ぐ。

解説の通り、これがバッチカウント1回ごとに1枚あたらしい画像を読んでくる。

4:Show Text

これはおまけノード。別途ComfyUI-Custom-Scriptsをインストールすること。

単純に現在処理中のファイル名を表示するために繋いでいるノード。なくても良い。

画像の保存どうするの?

画像の保存はWas Node SuiteImage Saveが良いのではないかと思う。

Image Saveノード外観

このノードは書き出しパスを設定し、重複したファイル名があってもfilename_number_paddingに指定した桁数に基づいてカウントアップし保存してくれる(ファイルが上書きされず新規作成される)

ただし、入力ファイル名に付属している番号とは異なる番号になる。

入力ファイルと出力ファイル名を一致させたい

連番動画などを扱う場合、どの入力ファイルに対する出力ファイルなのか、という情報は必須である。

が...現時点で私が知る限りこれは出来ず、似たような仕組みで解決する他無い。

次の例の用にLoad Image Batch > filename_textImage Save > filename_prefixに繋ぐ。

ファイル名を繋いだ例

これだけでファイルの頭に元ファイルのファイル名が入る。

この方法はスマートとは言えないので、もっと良い方法があれば教えてもらえればと思う。

ファイル名の接尾辞に0000.pngのようなカウント名が必ず入るので、例えば9999.pngを入力すると出力は9999.png0000.pngになる。

接頭辞側にファイルの連番が入るので重複がなければファイルリネームソフトで一括書き換えで対応する。

バッチカウントを間違えて多く設定した場合(重複の元ファイルを処理した場合)は9999.png0001.pngといった形で別ファイルができているので、接尾辞が0000.pngより大きいファイルは削除する

以上

正直なところこの手法は冗長すぎる。

恐らく代替のフローがこの先出てくるとは思うが、現時点ではこの方法しか無いと思われるため掲載した。



この記事のタグ

この記事をシェア


謎の技術研究部 (謎技研)