Stable Diffusion Web UI でマネキンの画像から雑誌モデル風の画像を生成してみる(ControlNet 利用)
はじめに
EC2 上に立てた Stable Diffusion WebUI Forge(以下、SD WebUI)を使って、服を着せたマネキンの画像から、雑誌モデル風の人物画像生成を試してみました。
自分がアパレル系 EC サイトの担当者になった想定で、便利なツールを作れないかな?と試行錯誤してみた結果をまとめています。
服を着たマネキンの画像さえあれば、Inpaint で服自体は元画像のまま変えずに、いい感じの着用画像を生成できる!というところを目指しています。
成果物はこんな感じです。
元画像 | 生成された画像 |
---|---|
やってみたこと
以下は工夫した点と、利用した技術についてです。
元の衣服はそのまま出力する
元画像を参考に画像を生成する、といえば img2img ですが、何も考えずに Inpaint すると画像全体が変わってしまいます。マネキンに着せた衣服は商品なので、細部が勝手に変わってしまうとマズいです。手作業で衣服の部分のマスク画像を生成しても良いのですが、なかなか手間です。
そこで、Meta社が開発した Segment Anything Model を利用し、衣服のみマスク画像を生成します。
元画像 | マスク画像 |
---|---|
生成したマスク画像の範囲外を Stable Diffusion による Inpaint 範囲とすることで元画像の衣服はそのまま出力し、マスク範囲外全体をプロンプトの内容で生成することが可能です。
ControlNet で構図を維持する
衣服をマスキングして、Inpaint で全体を生成し直すだけでは、元の構図を維持することができません。
試しにマスキングのみで生成した画像は以下のとおりです。
なんとなく人物と衣服の間に関係性は感じますが、全体としては破綻しています。
実務においては、「マネキンにポーズをとらせて、そのポーズどおり生成する」といったケースも考えられるため、元画像の構図を残しつつ生成をする必要があります。
そこで ControlNet を利用し、入力画像の構図を画像生成時に参照させるようにします。
今回は ControlNet の Scribble モデルを利用し、元画像からエッジ検出を行い、生成時に利用していきます。
元画像 | ControlNet |
---|---|
すごくざっくり言うと、右側の落書きのような線を参考にして画像生成をしてくれる、という感じです。
事前準備をする
以下は画像生成にあたっての事前準備です。
SD WebUI は AWS の EC2 上に立ち上げている想定での手順になります。
※ EC2 上に SD WebUI を起動する手順についてはこちらの記事に書きました
拡張機能をインストールする
SD WebUI をより便利に使うために拡張機能をインストールしていきます。
拡張機能は Extensions タブの Install from URL から導入できます。
URL for extension's git repository 欄に拡張機能の git リポジトリの URL を貼り付け、Install ボタンを押せば OK です。
今回は以下の拡張機能を入れていきます。
https://github.com/Mikubill/sd-webui-controlnet
https://github.com/AUTOMATIC1111/stable-diffusion-webui-rembg
https://github.com/continue-revolution/sd-webui-segment-anything
https://github.com/butaixianran/Stable-Diffusion-Webui-Civitai-Helper
インストールが完了したら、Installed タブの Apply and restart UI を押して再起動しましょう。数秒から数十秒待つと再度 UI にアクセス可能になります。
ControlNet 用のモデルをダウンロードする
ControlNet を利用するため、Huggingface からモデルをダウンロードします。
OpenPose など多数のモデルがありますが、今回は Scribble を利用します。
ダウンロードは SD WebUI の画面からではなく、EC2 に入って行います。
SD WebUI を起動している EC2 インスタンスに EC2 Instance Connect等で接続して以下のコマンドを実行します。
# モデルを配置するディレクトリに移動
cd /home/ubuntu/stable-diffusion-webui-forge/stable-diffusion-webui/extensions/sd-webui-controlnet/models/
# wget で scribble モデルを取得
wget -O control_v11p_sd15_scribble_fp16.safetensors "https://huggingface.co/comfyanonymous/ControlNet-v1-1_fp16_safetensors/resolve/main/control_v11p_sd15_scribble_fp16.safetensors?download=true"
Segment Anything を利用する準備をする
次に、衣服のマスク画像作成に使う Segment Anything の準備をします。
Segment Anything も別途、モデルのダウンロードが必要です。
以下のコマンドを実行して、Segment Anything のモデルをダウンロードします。
# SAMモデルを配置するディレクトリに移動
cd /home/ubuntu/stable-diffusion-webui-forge/stable-diffusion-webui/extensions/sd-webui-segment-anything/models/sam
# wget で SAM モデルを取得
wget https://dl.fbaipublicfiles.com/segment_anything/sam_vit_h_4b8939.pth
ダウンロードができたら、SD WebUI を再起動しましょう。
sudo systemctl restart sd-webui
モデルをダウンロードする
初期状態ではデフォルトの Stable Diffusion 1.5 のモデルしか利用できないため、利用用途に合わせたモデルを取得していきます。
ここからは SD WebUI の画面に戻って、先ほどインストールした拡張機能「Stable-Diffusion-Webui-Civitai-Helper」を使っていきましょう。
Civitai Helper タブに遷移します。
この拡張機能を使うと、Stable Diffusion のモデル共有サイト Civitai で配布されているモデルを簡単にダウンロードすることができます。
今回はアジア系の女性の写実的な画像生成に特化したモデルである BRAV7 を利用してみましょう。
Download Model 欄の Civitai URL に BRAV7 の URL を入力し、Get Model Info~ ボタンを押します。
すると、モデルの情報が取得されるので、ダウンロード先のサブフォルダを選びます。
今回は /
を選択します。
次に、Model Version 欄で最新のモデルを選びます。
今回は v7_177164
を選択しました。
そして Download Model ボタンを押すと、モデルがダウンロードされ、SD WebUI 上で利用できるようになります。
では、ダウンロードしたモデルを使っていきましょう。
txt2img タブに移動し、左上の Stable Diffusion checkpoint 欄の横にある更新ボタンを押します。
これで、最新のモデルフォルダの状態を読み込むことができました。
セレクトボックスを開くと、BRAV7 が利用できるようになっているので、選択します。
以下のプロンプトをそれぞれ入力し、Height の設定だけ 768 に変更し、Generate ボタンを押せば BRAV7 を利用した画像生成ができます。
(masterpiece:1.3), (8k, photorealistic, RAW photo, best quality: 1.4), japanese, white coat, in the street
(worst_quality:2.0), cgi, render, illustration, painting, drawing
マネキン画像を修正してみる
ではここからが本題です。
服を着せたマネキンの画像から、ファッションモデルっぽい画像を生成してみましょう。
画像の背景を削除する
まずは、被写体であるマネキンの背景を削除します。
背景の削除には rembg を利用します。
Extras タブに移動し、修正したい画像をアップロードします。
画面下にスクロールし、Remove background にチェックを入れます。
モデルは u2net
を選択しましょう。
選択できたら Generate ボタンを押すと、背景が削除された画像が生成されます。
画像をダウンロードしておきましょう。
また、出力された画像の下にいくつかのボタンがありますが、絵の具のパレットのボタンを押すことで、img2img 側にこの画像を送ることもできます。
衣服部分のマスク画像を生成する
img2img タブに移動し、画面をスクロールします。
Segment Anything を開き、SAM Model 欄に先ほどダウンロードしたモデル名が表示されていることを確認します。
マスク画像を作成するために、背景削除を行った画像をアップロードしましょう。
次に、Enable GroundingDINO にチェックを入れて、GroundingDINO Detection Prompt 欄に cloth と入力します。
Preview Segmentation を押すと、マスク画像の生成が行われます。
以下が生成されたマスク画像です、一番右の画像が綺麗に衣服のマスクができていそうですね。
利用したいマスク画像をダウンロードしておきましょう。
インペイントを行う
img2img タブの Inpaint upload 画面で作業を行います。
背景削除をしたマネキンの画像を上に、マスク画像を下にアップロードします。
Mask mode で Inpaint not masked を選択します。
Masked content は fill を選択します。
Resize to 欄の定規アイコンをクリックし、生成する画像のサイズを元画像のサイズに合わせます。
Denoising strength の値は 0.75 にします。
画面を下にスクロールして、ControlNet を有効化します。
Enable 欄にチェックを入れ、Control Type で Scribble/Sketch を選択します。
最後に、生成したい画像のプロンプトを入力し、Generate ボタンを押します。
(masterpiece:1.3), (8k, photorealistic, RAW photo, best quality: 1.4), japanese, in the street
(worst_quality:2.0), cgi, render, illustration, painting, drawing
すると、ControlNet で生成した線画を参考に、 マスキングした衣服以外の領域のみ画像生成が行われます。衣服のディテールは失われないまま、モデル画像の生成ができました!
元画像 | ControlNet | 生成された画像 |
---|---|---|
おわりに
手順としては多く見えますが、慣れると数分で1枚の画像の生成ができるかと思います。Stable Diffusion Web UI は API モードで起動することもできるため、パラメータを固定化して「マネキン画像をアップロードしたらモデル画像を生成してくれるアプリ」のようなものも作れるかもしれませんね。
Discussion