2024-02-07(更新)

【Impact Pack #3】部分的に修正!Detailer系いろいろ紹介【ComfyUI】

ComfyUIにて特定の部位だけ書き換えるDetailer系(Impact Pack)。種類が色々あるので深掘りする。インペイントとの違いなど。

Article Image

Impact PackのDetailerとは何か

この記事はComfyUIのImpact Packに含まれるノードを紹介していくシリーズ。

前回はFace Detailerに絞って「とりあえず使えれば良い人向け」に書いた。

【Impact Pack #2】顔を再描画!Face Detailerの使い方【ComfyUI】 | 謎の技術研究部

今回はDetailerにどんな種類があるのかを見ていくが、把握しきれていないためメモ書き程度のものも多い

また、相変わらず細かすぎる設定については触れない(そもそも調べても良くわからない)

Detailerとは

マスクで塗った箇所を再描画する機能。顔や手をやり直すことが多いが、それ以外も好きな箇所を指定できる。

Inpaintと何が違うのか

ComfyUIはカスタムノードを使わずともインペイントの機能が備わっている。

Detailerの動作的には同じことをやっているだけなのだが(恐らく)具体的にどうちがうのか。

私も、詳しく調べているわけではないがInpaintは内部的には「全体」をいちど再描画しながら、実際にはマスクが塗ってある部分だけ再描画していく。

どういうことかというと、マスク以外の範囲も1度書き換えが走っていくが、生成が進むたびマスク外は最終的に元の絵に戻る、といった動きをする。

一方でDetailerは画像を一部切り抜いて「そこだけ再描画」する。

Inpaintのメリット

マスク外も1度再描画が走ることがそのままメリットで、AIはマスクの外を見てからマスクの内側を書き込むのでInpaintされた箇所が馴染みやすい感覚がある。

※厳密にアルゴリズムを調査したわけではないので違うかもしれない

Inpaintのデメリット

大きな絵のインペイントをしようと思うと1度全体に書き換えようとする処理が走るためVRAMも生成時とおなじだけ必要で処理も遅い。

Inpaintの動作

Detailerのメリット

一方でDetailerはマスクが塗られた周辺だけを切り取って処理するため、処理が早く軽い。(Inpaintのように全体は見ていない)

Detailerの動作

またDetailerのほうがピンポイントでプロンプトを流し込めたり、オプションも豊富。こちらも強いメリット。

Detailerのデメリット

Detailerは一部しか絵を見ていないので雰囲気に合わない絵がはめ込まれることが多い印象

Detailer (SEGS) - DetailerForEach

ここからは具体的なノードを見ていく。

まずは何もないところダブルクリックで検索 > detailerで調べると...

detailer系が何種類かある検索画面

既にDetailerForEach系で4種類もある。

一番上のDetailerForEachが基本となるのでコレを出す。ノード表記はDetailer (SEGS)に変わる。

DetailerForEach外観

かなり大きいノードで驚くかも知れないが基本はそれほど難しくない。

入力:model ~ negativeまで

まずはmodel~negativeまでのピンは言わなくてもわかると思う。

これは通常画像を生成する上で必要なKSamplerに挿すものと同じだ。

KSamplerと同じピン

厳密にはKSamplerにはVAEclipのピンは無いが、難しく考える必要はなくCheckpointLoaderから出ているものでよい。

入力:imageピン

こちらも当然ながら部分的に書き換えたい画像を入れるだけ。解説必要なし。

imageピン

入力:segsピン

ここが一番重要

まずできればSEGSの理解がほしい。次のページで詳しく書いている。

【Impact Pack #1】SEGSとは何か【ComfyUI】 | 謎の技術研究部

が.... 実は読まなくても全然使える。

まずは手書きマスクをSEGSとして使う

segsは極端なことを言うとマスクの上位互換だと思われる(私の見解)

したがって、マスクを変換すれば使える。

maskをsegsにコンバート

MaskToSegsノードを検索して繋ぐ。デフォルトで良い。

Load Imageノードにマスクはどうやって書くの??

Load Imageを右クリック > Open In MaskEdoitorを使うとマスクを塗る画面を出せる。

右クリックメニュー

あとは実行するだけ。

例えばおでこのマークを星マークに変えたい。

ノード例

Use Everywhereノードを使用して自明なピンは省略している

Before After
元絵 修正後

確かに星になったが、こんな感じで確実ではないのも事実。

より詰める場合は再描画したり設定を変更していく。

主要な設定

基本的にFaceDetailerの記事で書いているものと同じなのでこちらはざっくり

【Impact Pack #2】顔を再描画!Face Detailerの使い方【ComfyUI】 | 謎の技術研究部

設定項目外観

KSamplerをいじるときと同じようにSampler, cfg, steps, denoiseの調整は基本

cycleを増やすと書き換え処理を複数回重ねがけする。1~3ぐらいまでは良くなること多し。

size系は基本操作しないほうが良いかも。調整が難しく上級者向け。別途調査出来たらと思う。

プロンプトを入れる欄があるので、ここでピンポイントでマスクにだけ入れたいプロンプトを入れる。

自動検出してSEGSを作る

次のノード解説に行く前に、segsは自動検出で生成できるので紹介する。

重複になるがこちらも次を先に読んでいただけると理解が深まると思う。

【Impact Pack #1】SEGSとは何か【ComfyUI】 | 謎の技術研究部

例えば洋服を検出して再描画するノードの組み方が次。

洋服を検出

  1. UltralyticsDetectorProviderノードに洋服検出モデルのdeepfashion2_yolov8s-seg.ptを入れる
  2. SEGM Detector (SEGS)ノードがこのモデルを利用し実際にsegを生成する

これで実際にDetailerを通すとと次のようになる。

元絵 洋服変更後
元絵 洋服変更後

更にFaceDetailerを通して完成

FaceDetailer後

自動検出用モデルの調べ方

ComfyUI Managerを利用してInstall Models

ComfyUI manager

あとはここでUltralyticsで検索するとずらっと一覧が出てくる

Ultralytics

ここでは詳しく解説しないが、命名がそのまま検出対象になっているのでわかりやすい。

今後増えれば更に便利になるだろう。

DetailerDebug (SEGS)

検索名:DetailerForEachDebugノードを出すとこのノードが出る。

基本的にはDetailerForEachと変わらないが、次のアウトプットだけ違う。

違うアウトプットピン

要するにこれは内部処理で使用したマスクでどこが検出されているのかなどを目視で確認するためのピン。

動作自体は同じなので気になったら使う程度で良いのではないだろうか。

サンプル

念のためサンプルを添付したが、正直わからないアウトプットもあるので要検証。

Detailer (SEGS/pipe)

検索名:DetailerForEachPipeがこのノードになる。

こちらも機能自体は同じだが入出力のピンが異なる。

異なるピン

pipeとは???

このWEBサイトではまだ記事を作っていないのだがImpactPackにはPipeという概念がある。

何をやっているかというと、非常にシンプルで複数のピンを1度ひとまとめにして線のごちゃごちゃをスッキリさせるためのもの。

pipeの例

こちらはImpact Pack基本でもあるのでまた別途記事が作れたらと思う。

出力側にもpipeやsegがある

このノードは出力側にもpipesegがある。

恐らく入力したものと同じものがスルーされてでてくるのだと思うが未検証。これはいつ使うと便利なのだろうか?

その他調べていないもの

detailer_hook, refiner_basic_pipe_optなどのインプットは未調査。

FaceDetailer

顔に特化したDetailer

FaceDetailer系は次で解説したのでスキップする。

【Impact Pack #2】顔を再描画!Face Detailerの使い方【ComfyUI】 | 謎の技術研究部

しかし、上でも設定を詳しく見ていないためわからないことも多い。

設定項目が通常のDetailerと比べてかなり違っているためここがFace専用のメリットなのではないだろうか。

コレ以外のDetailerでも顔は直せるが、これがいちばん美しく治る印象。

またFaceDetailerの他にFaceDetailerPipeというノードがあり、こちらは上で紹介したものと同じでBasicPipeを受け取って動作するもの。

SEGSDetailer

このノードは私が調査した範囲では明確な利用方やメリットがわかっておらずスキップでも良い。

おそらく最上級者向けノード。

また、この項は調査が難航しておりメモ書き程度になっている。

検索名もSEGSDetailer

SEGSDetailer外観

このノードの最大の特徴は出力がsegsであるという点。

何度も書いているが、こればかりは次の記事の理解がないと利用不可だと思われる。

【Impact Pack #1】SEGSとは何か【ComfyUI】 | 謎の技術研究部

force_inpaintオプションのチェックが必須??

2024/02/07更新:

次のようにSimple Detector (SEGS)を使用し、BBOXベースのsegを取る。

ノード例

次にforce_inpaintをenabledにしないとDetailerの処理が走らずスルーされてしまうことが分かっている(デフォルトでオフ)

force_inpaint

これがどうしてこういうデフォルトになっているのか不明。

メリットはバッチ処理ができること

このノードはアップデートが入っており、1回の処理でバッチ処理が可能で1度に複数のパターンが書き出せる。

バッチ処理

outputがsegsで何のメリットがある?

outputsegsになることで、このままのデータを別のノードに渡せる。

が、これの実用例が私にはわからない。

この後さらに顔だけのsegデータを加工する場合にのみ使用か?

顔を書き換えた例では効果が微妙

私が試した範囲だと、これで顔を修正してもキレイにならない。

素直にFaceDetailerを使ったほうが良さそう

元絵に戻す場合はSEGSPasteを使う

例えばこれで全身の絵から顔のsegを対象に処理をするとsegsアウトプットには補正後の顔だけ切り抜かれた状態で保存されている。

したがってこのまま画像を保存しても顔だけのアップが出てきてしまう。

この場合はSEGSPaseteノードを使って元絵と合成してやる。

segspaste外観

逆に顔だけ切り抜いて画像を保存したい場合は、このノードの出番かもしれない。

バッチから特定の番号を取り出す場合はPicker (SEGS)

検索名はImpactSEGSPicker

2番めを抽出

pickボタンを押すと画像を表示して選択できる(複数可)

上では2番目のバッチ結果を取り出す方法。

ただ、1回実行しないとバッチ後の結果が分からず、そのあとPickするためにもまた実行しないとだめなので直接指定する使い方がよくわかっていない。

SEGSDetailer For AnimateDiff(SEGS/pipe)

検索名:SEGSDetailerForAnimateDiff

なんとAnimateDiff専用のDetailer

恐らく連番動画の一貫性を保つ機能へ調整されたものだと思われる。

基本的なノードの繋ぎ方は上のSEGSDetailerと同じなのでかなり簡略化して画像にしておく。

animateDiffに繋げた例

この例では顔を自動判別し、全てのフレームで顔のディティールアップを行っている

ここでもpipeの説明は省略するがKSamplerに繋がっているものをここに繋げれば良い。

segsデータの目視はSEGSPreview

SEGSDetailerForAnimateDiffにはsegsを目視するピンがないので、ここで初めてSEGSPreviewというノードを付けている。

これは差しているだけでsegの中身を見ることが出来るので覚えておきたい。

SEGSPreviewノード

MaskToSegsForAnimateDiff

上では使っていないが、このノードを使えば手書きのマスクをAnimateDiff用のsegへ変換できるので、動きが少ないものならこれは有用かもしれない。

MaskToSegsForAnimateDiffノード

サンプル

実際のサンプルが次。僅かな違いではあるが、顔が良くなっておりチラツキも少ない。

未加工のAnimateDiff Detailer後

さいごに

Detailerについてはまだ分かっていないことも多く、メモ書き程度になってしまった。

が、おおよそこれだけあれば結構使えると思う。

segの自動判定のみならずMaskToSegsノードで手書きでsegを作るなどもやってみるのも有用。

いろいろ試してほしい。



この記事をシェア


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