Detailer(ComfyUI)

Last-modified: 2025-09-20 (土) 00:10:23

Detailer/Inpaintとは

概要

img2imgを画像の一部のみにかけるようなもの。

Detailerは1111のADetailerと用途は同じで、顔や手など破綻しやすかったり特に綺麗に出力したい部分をピンポイントでブラッシュアップするのに使う。
マスクした範囲の近傍のみを見て処理しているようで、比較的高速に処理される。

Inpaintはどちらかというと画像の一部を全く別のものに描き換えるために使われることを意図しているようだ。
元の画像全体を潜在画像として読み込み、対象範囲を中心に描き直してから再度元の画像にマスク合成しているらしく、処理に時間がかかる。

ComfyUIではどちらもワークフローに組み込めるので、Inpaintをtxt2imgの仕上げに使うこともできるし、Detailerを単独で走らせることもできる。

マスクの生成

まず描き換える範囲を指示するマスクを生成する必要がある。
元画像が1枚2枚であれば画像ノードの右クリックメニューにある「Open in MaskEditor」で指示しても良いが、大量生成している画像にADetailer的にかけるときはマスクもAI生成できる。

ADetailer的な使い方をする場合、崩壊しやすい部位については周囲も不自然になっていることも多いし全体を検出しきれていないこともあるので(逆に検出範囲が広すぎる場合もあるが)、「マスクを拡大」ノードを使って多少広めにDetailerをかけたほうが良い。

segment anything

手作業の補助用。Comfy UI ManagerのCustom Nodes Managerで入るが、カスタムノードでなくもっぱら「画像を読み込む」ノードから使う。
segment anythingを導入すると画像ノードの右クリックメニューに「Open in SAM Detecter」が追加される。
SAM Detecter画面では画像上に右クリックで青く「マスクする点」、左クリックで赤く「マスクしない点」を指示し、「Detect」ボタンを押すとマスク範囲が検出され、画像ノードからマスクデータを生やすことができる。
アクセサリーなど他の部位とはっきり色が異なる部分なら良いが、例えば水着姿の男子の腕だけマスクしたいとか他の部位と同じ色でつながっていたりコントラストの低い画像には不向き。

ComfyUI-Impact-Pack

Detailerと一緒にマスク生成に使うDetecterも導入できる。
手軽に使うにはComfyUI-Impact-Subackも導入する必要がある。

まずUltralyticsDetectorProviderノードを作り、マスクしたい範囲に合った検出モデルをロードする。
モデルはComfyUI ManagerのModel Managerにて「Ultralytics」で絞り込めば一覧できるので、そこからインストールすればいい。
bboxモデルは矩形範囲のマスクを、segmモデルは対象の形に沿ったマスクを生成する。故にsegmモデルはbboxモデルの代わりになるが、その逆はできない。

ちなみにUltralytics DetectorのライセンスはAGPL3。Webサービスとして公開するでもない限り問題にならないはず。


Detectorモデルをロードしたら、次のDetectorノードを使ってマスク範囲を検出する。
出力は単純なマスクではなくSEGSという特殊な形式になるが、マスクとSEGSは相互に変換できる。

  • SEGM Detector
    SEGM対応モデルでしか使えない。対象の形に沿ったマスクを検出する。
  • BBOX Detector
    SEGM用のモデルでも使える。対象を包含する矩形範囲をマスクする。
  • SAM Detector
    こいつは他のDetector(主にBBOX Detector)の後続ノードとしてしか使えない。
    Segment Anything Model(SAM)を使ってマスク範囲を精緻化する。
    先にSAMLoaderノードを入れて専用モデルをロードする必要がある。
    SAMにはバージョン1と2があるが、SAMLoaderはバージョン1のモデルを必要とするので注意。
    ちなみにSAMモデルのライセンスはApache2.0なので何に使うのも自由。
  • Simple Detector
    BBOX DetectorとSAM Detectorの組み合わせ。一応SEGM Detectorも重ねられるっぽい。
    BBOX Detector以外はオプションなのでBBOX単独でも機能する。

ComfyUI-Florence2

自然言語で画像上の要素を検出できる、Microsoft製のVision Language Model(視覚情報と言語情報をつなげるモデル)Florence2を使うカスタムノード。
マスクは矩形になる。

NSFWな部位でも(モデルによっては)検出できる。Ultralytics Detectorで検出モデルが提供されていないものを指定したいときはこれを使うしかない。
ただし誤検出や検出漏れもあるので過信は禁物。うっかりモザイク半自動化とかやろうとすると画面のほぼ全部にかかったりするので、処理によっては元の画像も出力したほうが良い。
モデルはMITライセンスなので何に使っても問題ない。

DownloadAndLoadFlorence2Model → Florence2Run とつなげ、Florence2Runのtaskを「caption_to_phrase_grounding」にして検出したい部位を入力するとそれがマスクとして検出される。
出力画像は元の画像に検出された部位の範囲とその名前を重ねたものでおそらくはデバッグ用。

ComfyUI-segment-anything-2

Florence2との連携機能があり、基本的にはそちらからつなぐこととなる。
bbox入力があるが、紛らわしいがImpact PackのBBOX Detectorからは接続できない。
SAM2モデルもライセンスはApache 2.0。

(Down)Load SAM2Model → Sam2Segmentationとつなぐ。
Florence2Runのdata出力をFlorence2 Coordinatesノードでbboxに変換し、それをSam2Segmentationに入力すると各々の形に沿ったマスクに精緻化してくれる。
Sam2SegmentationにはKサンプラーのようなcoordinates_positive, coordinates_negativeなる入力もあるが、何に使うのか不詳。何もつながなくて良い。

Inpaint

画像全体を入力してマスク範囲を中心に再生成したあと、マスク部分のみを差し替える処理(らしい)。
全体を見て描き直すので、プロンプトは(描き換える場所だけでなく)画像全体を表すように書く必要がある。
マスク内外の境界については馴染みやすいよう処理前後の画像でのグラデーションになる。

ComfyUIのコア機能だけで最初から利用可能で、テンプレートも上のほうにある。
テンプレートを読み込んでみれば分かるが、txt2imgとの違いは空の潜在画像の代わりに元の画像をVAEエンコードしたものとマスクをサンプラーに入力すること。

ブラッシュアップに使う場合の注意点はimg2imgと同じで、ノイズ除去の値が大きいほど元の画像からかけ離れたものが生成される。
軽くレタッチする程度の効果に抑えたい場合は初期値の1.0だと強すぎるので、0.5ぐらいから様子を見て調整すること。
ただし、ノイズ除去値1.0未満にするときはテンプレートの「VAEエンコード(インペイント用)」ノードを置き換えないとうまくいかない
「VAEエンコード(インペイント用)」は単にサンプラーの処理範囲にマスクをかけるだけでなく、潜在画像からマスク先を削除するという処理を行うため、ガイドとすべき下絵が消えてしまう。
なので、元画像をベースにレタッチさせるときは「VAEエンコード」(無印)と「潜在ノイズマスクを設定」に置換する必要がある。


Inpaint処理にはInpaint用に学習されたモデルを使った方が良い、と言われている。しかし実際には特にSDXL以降の二次絵用Inpaint用モデルはほとんど存在しない。
確かにノイズ除去値1.0であればInpaintモデルのほうが馴染みが良いが、そんなに強くかけると二次絵はInpaintモデルでもコラージュ感が強く出てしまう。
そしてInpaint用モデルには処理範囲内であっても潜在画像に描き込みがあるとあまり弄らない、という特徴がどうやらあり、先にInpaint先を消去する必要があるので「ラフな絵をベースに薄くかける」ということがやりにくいのだ。

Detailer

ComfyUI-Impact-Pack。
マスク近傍のみを入力して高速に描き換えることができる。
こちらもマスク内外の境界については馴染みやすいよう処理前後の画像でのグラデーションになる。

ノードの種類は多いが、基本的には「Detailer(SEGS)」か「Detailer(SEGS/pipe)」を使う。
Detailer(SEGS)の入力は多いが、image/segsはそれぞれ元画像/マスクだし、下5つは通常の画像生成と同じなので難しくはないはず。
ただしDetailerはマスク近傍しか見ていない(はず)なので、ADetailer的な仕上げ処理に使う場合プロンプトが本体と同じで良いかは悩みどころ。

パイプを使う場合はToBasicPipeノードを使ってbasic_pipeを作り入力する。
その名前に反しdetailer_pipeは「Detailer(SEGS/pipe)」には入力できない。detailer_pipeはFaceDetailer専用。
パイプを使うとDetailerノードの出力からもbasic_pipeを生やせるのでワークフローが少しすっきりする。
basic_pipeにはプロンプトも含まれるが、複数回Detailerをかけたい場合はFromBasicPipeノードを挟めばプロンプトを変えられる。


FaceDetailerはSimpleDetectorノードとDetailerノードを一体化したもの。
どこを処理するかは入力したUltralytics Detectorモデルによるので、その名前に反し顔以外の部分も処理対象になる。
一体化されているせいで処理が終わるまでマスク範囲を確認できないため、調整に余計な時間がかかりがち。

TIPS

基本画像1枚ごとにDetailerを何パスか走らせて出力し、一番良いものを選びたい

結論から言うと、Detailer(SEGS/pipe)を出したいパターン数並べて繋ぎ、それぞれのシード値をバラバラにするしかない。

バッチ実行に対応しているノードであれば「画像バッチを繰り返す」ノードでパターン数を増やせるが、2025年9月現在のところDetailerノードはバッチに対応していない。

試して失敗したやり方

ImageAddNoiseはバッチに対応しているため、Detailerに入力する前にこれを適用してからマスク合成しリスト化して入力する方法。試してみたが悲惨な結果だった。

まずノイズ量が少ない場合、Detailer側の乱数系列が変わらないため多少ノイズが乗っていたところでわざわざ生成時間を延ばすほどのバリエーションにはならない。
問題はノイズを乗せすぎた場合で、Detailerはマスク近傍しか見てない関係でなのかノイズに引っ張られて画像が崩壊する。
そもそも顔などは目立つから入念に仕上げ処理を入れるわけで、そこが崩壊したグロ画像を見ることになるのは精神的に負担が大きいので再現はお勧めしない。