![見出し画像](https://assets.st-note.com/production/uploads/images/145266322/rectangle_large_type_2_162530ab5fd9f697b09a34f6e1e4c979.png?width=800)
【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の全体像になります。
![](https://assets.st-note.com/img/1719391971845-Dhz1E3NtJP.png?width=1200)
まず、使用したい人物の写真を読み込み、そこから人物を抽出します。Load Imageで画像を読み込んだ後、LayerMask: SegmentAnythingUltra V2で人物を抽出します。今回使用した画像には、人物が一人のため、promptにはsubjectを入力しました。
![](https://assets.st-note.com/img/1719392052060-CYWa5L4Wfr.png?width=1200)
次に、この後の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から背景が白くなった画像を取得できます。
![](https://assets.st-note.com/img/1719405175759-4Gm6SEwhHX.png?width=1200)
次に、背景の生成部です。今回は、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に合わせて変えてください。
![](https://assets.st-note.com/img/1719392524806-FbSR1ZODxH.png?width=1200)
マスクを使った背景の生成では、人物が背景に馴染んでいないため、生成された画像に対してHires.fixを行います。Hires.fixには、再度AnyTest V4を適用します。この時、ControlNetの適用を行う画像は、背景生成後の画像になります。そのため、ここで再度Apply ControlNet (Advanced)を呼び出します。ここでのControlNetのstrengthと、KSamplerのdenoiseは、弱めに設定します。
![](https://assets.st-note.com/img/1719392695631-WyGEOhtaQd.png?width=1200)
3. 生成結果の確認
まず、生成に利用した元画像を以下に示します。ここから人物を切り抜き、背景のみを変更させます。
![](https://assets.st-note.com/img/1719391560822-0kWZkvZZzl.png?width=1200)
次に、Hires.fixの前の状態の画像を確認したいと思います。以下の画像を確認すると、人物に影が差しており、しっかり人物に合わせて背景が生成されていることが分かります。しかし、人物はマスクで変更がされないようになっているため、人物の縁がジャギーになっていたり、若干色合いが合わないです。これをHires.fixで調整します。
![](https://assets.st-note.com/img/1719391147908-Pmk2CJqnuH.png?width=1200)
最後にHires.fixで調整した画像です。背景と上手く溶け込んでいることが分かります。
課題としては、Hires.fixで細部が若干変更されてしまうことです。どうしても元絵と完全に同じとはいかず、細かいパラメータの調整や、ControlNetの組み合わせを検討する必要がありそうです。
![](https://assets.st-note.com/img/1719391830429-7PrAxL869b.png?width=1200)
![](https://assets.st-note.com/img/1719382337915-NIOHG3kazS.png?width=1200)
この記事でご紹介したAI技術の応用方法について、もっと詳しく知りたい方や、実際に自社のビジネスにAIを導入したいとお考えの方、私たちは、企業のAI導入をサポートするAIコンサルティングサービスを提供しています。以下のようなニーズにお応えします。
AIを使った業務効率化の実現
データ分析に基づくビジネス戦略の立案
AI技術の導入から運用までの全面サポート
専門家によるカスタマイズされたAIソリューションの提案
初回相談無料ですので、お気軽にご相談ください。以下のリンクからお問い合わせください。
この記事が気に入ったらサポートをしてみませんか?