「t-shirt」と入力すれば、Tシャツのマスクが得られます。「face」「bookshelf」「wall」と入力すれば、それらが得られます。Florence 2は、テキストの説明から物体を見つけられるMicrosoftのビジョンモデルで、ComfyUIではそれをインペイントできるマスクに変えます。できることは信じられないほどですが、注意点もあり、それも説明します。
Florence 2は、論文Florence-2: Advancing a Unified Representation for a Variety of Vision Tasks(Xiao et al., 2023)で説明されています。多くのタスク(キャプション、物体検出、セグメンテーションなど)向けの研究モデルで、ここではマスクにだけ使います。
ポイント
- ノード: ComfyUI-Florence2(Kijai製)、ComfyUI Essentials、テキスト出力用のUniversal Styler、比較用のrgthree。
- モデル: 最良のマスクにはFlorence-2-large。予備にbase。
- タスク:
referring_expression_segmentationにして、マスクしたいものを入力します。 - インペイント: 元の画像とマスクを使ったInpaintModelConditioning。denoiseは0.5〜0.62あたり。
- マスクの組み合わせ: Mask Composite(add)で2つのマスクを結合。Grow Maskとmultiplyで縁取りを作ります。
ComfyUIが初めてなら、ComfyUIのノードの基本とテキストから画像へとComfyUI Managerのインストールから始めてください。完成したワークフローは私のPatreonで無料です。JSONをドラッグして入れ、足りないノードをManagerからインストールします。
ノードをインストールする
Manager → Custom Nodes Managerで、次をインストールします。
- ComfyUI Essentials:本当に必要な基本的なノード集(Mask Preview、Image Resizeなど)。
- ComfyUI Universal Styler:テキストを取り出すのに役立ちます(そのGet TextノードがFlorenceのキャプションを表示します)。
- Florence 2。 Kijaiとspacepxlの2つのパッケージがあります。Kijaiのほうがスターが多く、より最近更新されています。2つはとても似ていますが、spacepxlのものは最新のComfyUIで動かすためにコードの一部を書き直す必要がありました。Kijaiのものを使ってください。
インストール後にComfyUIを再起動します。
Florence 2の部分を構築する
- DownloadAndLoadFlorence2Modelを追加します。初回実行時にモデルを自動でダウンロードするので、git cloneもモデルフォルダを探す必要もありません。
- Florence2Runを追加して、モデルを接続します。
- 画像を入れたLoad Imageを、Florence2Runの画像入力に接続します。
- すべての出力を接続します。画像用のPreview Image、マスク用の(Essentialsの)Mask Preview、キャプション用のGet Textノード。出力が接続されていないと、ネットワークが動かず、モデルもダウンロードされません。
Queueをクリックします。初回の実行でモデルがダウンロードされ、回線によって数分以上かかることがあります。コマンドウィンドウで確認できます。デフォルトのタスクは、画像内の物体を見つけて、それぞれの周りにバウンディングボックスを描きます(ここでは王冠と頭蓋骨)。バウンディングボックスはここではあまり役に立たず、必要なのは本物のマスクです。
モデルを選ぶ
- Florence-2-base: デフォルト。
- Florence-2-base-ft / large-ft:「ft」は特定の目的向けにファインチューンされたという意味です。おすすめしません。baseより悪い結果でした。
- Florence-2-large: 強くおすすめです。1枚あたりの時間はかなり長くなりますが、はるかに良いマスクを作ります。
タスクを選ぶ
taskのリストが最も重要な設定です。captionにすると画像を記述します。このマシンではGet Textノードにテキストが表示されませんでしたが、コマンドウィンドウには表示され、別のマシンでは機能しました。そもそもキャプションはここでの目的ではありません。
ほぼいつも使うタスクは**referring_expression_segmentation**です。テキスト欄に欲しいものを入力して実行すると、マスクが得られます。
「Skull」は、すぐにきれいなマスクになりました。「Crown」は、最初はうまくいきませんでした。AIモデルは完璧ではなく、ときどきこうなります。largeからbaseに戻して同じプロンプトで実行すると、良い王冠のマスクが得られました。ときどきモデルを入れ替えるのは、作業の一部です。
マスクした領域をインペイントする
- InpaintModelConditioningを追加します。Florence2Runのmaskと、Florence2Runではなく元のLoad Imageの画像を接続します。Florenceの画像出力には、色付きのマスクが描き込まれているからです。
- 標準のテキストから画像へのチェーンを構築します:Load Checkpoint(epiCPhotoGasmを使用)、ポジティブとネガティブのCLIP Text Encode(緑と赤に色分け)、KSampler、VAE Decode、Save Image。
- プロンプトを先にInpaintModelConditioningに通してから、KSamplerに入れます。VAEをInpaintModelConditioningに接続し、そのlatent出力をKSamplerのlatent入力に接続します。
- 望む変更(王冠なら「silver」)を入力し、denoiseを約0.62に設定します。denoiseはプロンプトと元の画像の混ざり具合を制御し、ここで最も重要な値です。
VAEの接続が足りないと文句を言われたら、1本つないでください。結果はこちらです。
比較するには、rgthreeのImage Comparerを追加し、新しい画像をA、元の画像をBにします。有効化するにはもう一度実行する必要があり、結果は別のものになります。
2つのマスクを組み合わせる:虎全体
Fotoref(私が共同創業者を務めるフォトストック)の虎の写真で、「tiger」は体の前半分をマスクしましたが、後ろ脚を見逃しました。マスクをテストする間は、インペイントのノードをバイパス(選択してCtrl+B)しておきます。
- Ctrl+C、Ctrl+Shift+VでFlorenceの枝をコピーします。接続が保たれます。同じ出力ノード(プレビュー、マスクプレビュー、Get Text)を付けてください。なくても、使わなくても、動きません。
- 足りない部分のプロンプトを試します。「Tiger back leg」はうまくいきませんでした。largeモデルと、もっと創造的なプロンプト「tiger black stripes front and back」で、後ろ脚が得られました。そこにたどり着くまで、約10個のプロンプトを試しました。
- Mask Compositeを追加します。一方のマスクをdestination、もう一方をsourceに入れ(本当はAとBと呼ぶべきでしょう)、operationはaddにします。白に白を足すからです。Multiplyでは、すべてが消えてしまいます。
- 結合したマスクをプレビューします:虎全体。
インペイントのノードのバイパスを解除して、合成したマスクをInpaintModelConditioningに接続します。プロンプトを変えるのを忘れて、銀色の虎ができました。「cat」では猫になり、うまく溶け込みました。体の下部を近くの植物で置き換え、片方の足の下に岩を置きました。素晴らしい生成まであと少しで、もう少し実行が必要です。
顔
私の3Dスカルプトの1つで、「face」は顔のマスクになりました。プロンプト「male」では、別の人物の顔をインペイントしました。denoise 0.25では、結果は元に近い見た目になりましたが、スカルプトした奇妙な解剖学(角、下のピアス)には苦労し、それをひげで置き換えました。これは予想どおりです。
コツ: Florence2Runにはseedがあります。control_after_generateをrandomizeからfixedに変えると、新しいプロンプトを試すたびにマスクが再生成されなくなります。
マスクを縁取りに変える
自撮り写真で、「glasses」はかなり良いマスクになりました。しかし、変えたいのはフレームだけで、細すぎてFlorenceがプロンプトからマスクできません。代わりに、従来のマスクノードで実現できます。
- 眼鏡のマスクに(コアノードの)Invert Mask。
- Grow Maskで10ピクセル。反転したマスクでは、白が広がり、黒が縮みます。
- Mask Compositeで、拡大したマスクをdestination、元のマスクをsourceにして、operationをmultiplyにします。一方から他方を引き、フレームの縁取りが残ります。
- 各段階を見るために、途中にMask Previewノードを加えます。
その縁取りを、プロンプト「silver」、denoise 0.5でInpaintModelConditioningに接続しました。正直、異なるdenoiseの値やプロンプトを試しても、ここでは本当に良い結果は得られませんでした。大事なのはテクニックです。プロンプトからマスクを得て、VFXやコンポジットアプリで使うのと同じ、拡大して引き算するコツを適用することです。
次のステップ
より強力なモデルでのより本格的なインペイントは、Fluxによるインペイントをご覧ください。マスクを描かずに顔と手を直すには、AIの顔と手の自動修正をご覧ください。マスクは、IPAdapterのスタイル転送を1つの被写体に集中させるのにも役立ちます。
動画版を見る (15:54)
上の内容はすべて動画でも説明しています。画面を見ながら進めたい方はこちらをどうぞ。 動画は英語です。
よくある質問
マスクには、どのFlorence 2モデルを使うべきですか?
Florence-2-largeはbaseよりずっと良いマスクになりますが、時間がかかります。fine-tuned(ft)バージョンは、私のテストではbaseより悪い結果でした。largeが何かを見逃したときは、同じプロンプトでbaseを試してください。見つかることもあります。
テキストプロンプトからマスクを作るFlorence 2のタスクはどれですか?
referring_expression_segmentationです。Florence2Runノードのテキスト欄に、マスクしたいものを入力します。
Florence 2がオブジェクトの一部しかマスクしませんでした。どうすればよいですか?
足りない部分を2つ目のプロンプト(または別のモデル)でマスクし、addに設定したMask Compositeノードで2つのマスクを結合します。
実行のたびにマスクが変わるのはなぜですか?
Florence2Runには独自のseedがあります。control_after_generateをrandomizeからfixedに変えると、別のインペイントプロンプトを試す間、マスクが変わらなくなります。
