2024-01-21:画像を書き出すときのノードについて追記
ComfyUIで連番画像を読み込むときは注意が必要。
どういうことかというと、次のようなノードを組むと...
VideoHelperSuite
のLoad Images(Path)
で1000枚読み込んだとすると、この1000枚が一気にメモリ上に読み込まれる。
これが危険。
上のノードのままComfyUIでBach Count
を1000にしたらどうなるだろうか?
これは注意だ。1000枚メモリに読み込まれる作業が1000回繰り返される。
強制終了まっしぐらになる。
私の知る限りComfyUIは標準機能で1枚ずつ読み込むタイプのバッチに対応していないと思われる。
つまり0001.pngを読み込んで処理、次のループで0002.pngを読み込んで処理....という繰り返しに非対応
全部一気に読み込むしかない。
長くなったが、これを自分で組んでやればかろうじて対応できるので、これをこの記事で紹介する。
ComfyUI Manager
でWas Node Suite
をインストールしておこう。必須級カスタムノード。
ComfyUI Manager
を知らない場合は次のURLで解説。こちらも必須スクリプト。
Load Image Batch
というノードが今回のキーノード。
Load Image Batch
(検索にもスペースが必要なので注意)このノードはMode
をincremental_image
にすることでComfyUI側のバッチカウントが増えるごとに1枚ずつ順番に読み込んでくれるノード
極端な話、画像の読み込みをこれにしてノード全体をみ、あとは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はtrueの意味。1が入っているときは次のノードがリセットされる。
このノードを使ってリセットしないと、再起動やF5更新を押してもカウントが途中から再開されてしまうため。
検索名はノード名と同じ。
各パラメタの設定に注意。
start = -1
にする(読み込み処理より前に+1されるため)
これはバッチループが回ってくるたびにカウンタに+1されるというもの。
この仕組みを使って次のノードで順番にファイルを読み込む。
検索名はノード名と同じ。
このノードは上で解説。
ノードを右クリックしてConvert index to input
を押すことで入力ピンに変換できるので、そちらへ繋ぐ。
解説の通り、これがバッチカウント1回ごとに1枚あたらしい画像を読んでくる。
これはおまけノード。別途ComfyUI-Custom-Scripts
をインストールすること。
単純に現在処理中のファイル名を表示するために繋いでいるノード。なくても良い。
画像の保存はWas Node Suite
のImage Save
が良いのではないかと思う。
このノードは書き出しパスを設定し、重複したファイル名があってもfilename_number_padding
に指定した桁数に基づいてカウントアップし保存してくれる(ファイルが上書きされず新規作成される)
ただし、入力ファイル名に付属している番号とは異なる番号になる。
連番動画などを扱う場合、どの入力ファイルに対する出力ファイルなのか、という情報は必須である。
が...現時点で私が知る限りこれは出来ず、似たような仕組みで解決する他無い。
次の例の用にLoad Image Batch > filename_text
をImage Save > filename_prefix
に繋ぐ。
これだけでファイルの頭に元ファイルのファイル名が入る。
この方法はスマートとは言えないので、もっと良い方法があれば教えてもらえればと思う。
ファイル名の接尾辞に0000.png
のようなカウント名が必ず入るので、例えば9999.png
を入力すると出力は9999.png0000.png
になる。
接頭辞側にファイルの連番が入るので重複がなければファイルリネームソフトで一括書き換えで対応する。
バッチカウントを間違えて多く設定した場合(重複の元ファイルを処理した場合)は9999.png0001.png
といった形で別ファイルができているので、接尾辞が0000.png
より大きいファイルは削除する
正直なところこの手法は冗長すぎる。
恐らく代替のフローがこの先出てくるとは思うが、現時点ではこの方法しか無いと思われるため掲載した。