見出し画像

【ComfyUI】 人物に合わせて背景を入れ替える

写真の人物は気に入ったのだけれど、背景が冴えない時がありますよね。画像編集ソフトで人物だけ切り出して、気に入った背景と合わせても、人物だけ浮いてしまう…なんてこともあると思います。この問題、Stable Diffusionを使うと、上手く解決することができます。
今回は、ComfyUIで人物に合わせて背景を生成する方法を解説します。参照元の写真から人物を切り出し、その人物に対して新たな背景を生成します。


1. 準備

カスタムノード

以下のカスタムノードをComfyUI Managerからインストールしてください。

  • WAS Node Suite

    • Image Generate Gradientで真白な背景を生成するために使用します

  • ComfyUI Essentials

    • Get Image Sizeで画像サイズを取得するために使用します

  • ComfyUI Layer Style

    • 写真から人物を抽出するために使用します。

    • 必要なファイルなどのインストール方法は、以下の記事の「1.準備」をご確認ください

  • ComfyUI WD 1.4 Tagger

    • 初回の生成画像からタグを生成するために使用します

モデル

以下のファイルをダウンロードし、ComfyUI/models/controlnetフォルダに格納してください。

  • CN-anytest_v4-marged.safetensors

2. workflowのノード構成

以下が今回のworkflowの全体像になります。

workflowの全体像

まず、使用したい人物の写真を読み込み、そこから人物を抽出します。Load Imageで画像を読み込んだ後、LayerMask: SegmentAnythingUltra V2で人物を抽出します。今回使用した画像には、人物が一人のため、promptにはsubjectを入力しました。

人物抽出部

次に、この後のControlNetで使用するために、切り抜いた人物画像の背景を白にします。KSamplerによる画像生成部では、では、RGBの3チャネルの参照元画像を使うため、ControlNetで4チャネルの画像を使うと、不整合を起こすためです。
まず、Get Image Sizeで元画像の画像サイズを取得し、そのサイズの真白な画像をImage Generate Gradientで作成します。Gradientしないので、設定値は"0:255,255,255"のみになります。
そして、ImageCompositeMaskedのsourceに作成した白の画像、destinationに元画像、maskにLayerMask: SegmentAnythingUltra V2で生成したマスクをInvertMaskで反転させたマスクを入力します。マスクは、黒が編集しない箇所、白が編集箇所になり、LayerMask: SegmentAnythingUltra V2で生成されたマスクは、人物の箇所が白(編集箇所)となり、このままだと人物の箇所が編集対象になってしまうため、InvertMaskで反転が必要になります。
最終的にImageCompositeMaskedから背景が白くなった画像を取得できます。

背景を白にした画像を生成

次に、背景の生成部です。今回は、checkpointにLEOSAM's HelloWorld XLを使用しました。positiveプロンプトには、品質や背景に関するプロンプトを入力します。negativeプロンプトには、品質劣化系や、peopleやpersonなどの人物描写を記載し、無駄な人物の描写を防ぎます。
これらにControlNetを適用します。Apply ControlNet (Advanced)を呼び出し、positive/negativeには先ほどのプロンプトを、control_netにはLoad ControlNet Modelで読み込んだAnytest V4を、imageには背景が白の人物画像を入力します。
ControlNetを適用したConditionoingは、InpaintModelConditioningに入力します。InpaintModelConditioningには、vaeにLoad Checkpointのvaeを、pixelsに参照元画像を、maskにLayerMask: SegmentAnythingUltra V2で生成したマスクをInvertMaskで反転させたマスクを入力します。
最後にKSamplerにInpaintModelConditioningの出力を入力します。KSamplerの設定は、checkpointに合わせて変えてください。

背景生成部

マスクを使った背景の生成では、人物が背景に馴染んでいないため、生成された画像に対してHires.fixを行います。Hires.fixには、再度AnyTest V4を適用します。この時、ControlNetの適用を行う画像は、背景生成後の画像になります。そのため、ここで再度Apply ControlNet (Advanced)を呼び出します。ここでのControlNetのstrengthと、KSamplerのdenoiseは、弱めに設定します。

Hires.fix

3. 生成結果の確認

まず、生成に利用した元画像を以下に示します。ここから人物を切り抜き、背景のみを変更させます。

参照元画像

次に、Hires.fixの前の状態の画像を確認したいと思います。以下の画像を確認すると、人物に影が差しており、しっかり人物に合わせて背景が生成されていることが分かります。しかし、人物はマスクで変更がされないようになっているため、人物の縁がジャギーになっていたり、若干色合いが合わないです。これをHires.fixで調整します。

Hires.fix前の生成画像

最後にHires.fixで調整した画像です。背景と上手く溶け込んでいることが分かります。
課題としては、Hires.fixで細部が若干変更されてしまうことです。どうしても元絵と完全に同じとはいかず、細かいパラメータの調整や、ControlNetの組み合わせを検討する必要がありそうです。

Hires.fix後の生成画像

この記事でご紹介したAI技術の応用方法について、もっと詳しく知りたい方や、実際に自社のビジネスにAIを導入したいとお考えの方、私たちは、企業のAI導入をサポートするAIコンサルティングサービスを提供しています。以下のようなニーズにお応えします。

  • AIを使った業務効率化の実現

  • データ分析に基づくビジネス戦略の立案

  • AI技術の導入から運用までの全面サポート

  • 専門家によるカスタマイズされたAIソリューションの提案

初回相談無料ですので、お気軽にご相談ください。以下のリンクからお問い合わせください。


この記事が気に入ったらサポートをしてみませんか?