Stable Diffusion web UIにControlNetを導入してOpenPoseを使ってみる(Google Colaboratory)

2023年2月25日土曜日

stable-diffusion

t f B! P L

Stable Diffusion web UIをColaboratoryで動かす方法自体はStable DiffusionをGoogle Colaboratoryで動かしてAI画像生成を試すが元になっている。

目的

  • OpenPoseを使って人物のポーズを指定してAI画像生成してみたい

OpenPoseは姿勢を棒人間で表したもの。AI画像生成では姿勢を画像から抽出したり、棒人間の画像で姿勢を指定するのに使う。

環境構築の流れ

モデルデータなど大きいデータはGoogleドライブに入れて、webuiやControlNetはgithubからcloneするという方法を取る。

Googleドライブのディレクトリ構成の例。どのディレクトリにあるかを把握してさえいればどこに保存しても良い。

  • MyDrive/SD/にモデルデータ(AbyssOrangeMixなど)
  • MyDrive/SDextra/controlnet/にcontrol_openpose-fp16.safetensors(後で説明)

webuiのcloneとGoogleドライブのマウント

!git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui
from google.colab import drive
drive.mount('/content/drive')

ここからControlNetとOpenPoseをwebuiで使えるようにする準備に入る。

ControlNetとポーズの編集に便利なOpenpose Editorを入れる。

webui上で拡張機能をインストールする場合、webuiの起動時に--enable-insecure-extension-accesのオプションを入れないと失敗する。さらにwebuiの再起動が必要になり数分取られる。

なのでextensionsに直接gitで入れる。

%cd /content/stable-diffusion-webui/extensions
!git clone https://github.com/Mikubill/sd-webui-controlnet
!git clone https://github.com/fkunn1326/openpose-editor

OpenPoseに必要なモデルを用意する

control_openpose-fp16.safetensorsをダウンロードしてColaboratoryの/content/stable-diffusion-webui/extensions/sd-webui-controlnet/models/に入れる。

https://huggingface.co/webui/ControlNet-modules-safetensors/tree/mainからControlNetで使うモデルをダウンロードする。openposeに使うのはcontrol_openpose-fp16.safetensors。ダウンロードしたらGoogleドライブにアップロードする。

GoogleドライブのMyDrive/SDextra/controlnetに必要なファイルを保存してあり、そこからコピーする例。

!cp /content/drive/MyDrive/SDextra/controlnet/control_openpose-fp16.safetensors /content/stable-diffusion-webui/extensions/sd-webui-controlnet/models/control_openpose-fp16.safetensors

直接ダウンロードする例。

!wget https://huggingface.co/webui/ControlNet-modules-safetensors/resolve/main/control_openpose-fp16.safetensors -O  /content/stable-diffusion-webui/extensions/sd-webui-controlnet/models/control_openpose-fp16.safetensors

起動

%cd /content/stable-diffusion-webui
!python launch.py --share --xformers --ckpt-dir /content/drive/MyDrive/SD

ControlNetが下の方に追加されている。ということで早速使ってみる。

OpenPoseを試す:画像からポーズを抽出

ControlNetを開くとDrop Image Here or Click to Uploadとあるので画像をドラッグアンドドロップする。

Enableにチェックを入れ、Preprocessorにopenpose、Modelにcontrol_openpose-fp16を指定。適当にプロンプトを入れてGenerate。

うまくいけば入力した画像と同じ姿勢で画像が生成される。

メモ

  • Preprocessor: 入力した画像の前処理。openposeは人間を棒人間にする。
  • Model: どう動かすか。control_openposeは棒人間の画像を姿勢のヒントに使う。

OpenPoseを試す:直接棒人間を入力

Openpose Editorを導入するとOpenpose Editorというタブが出てくる。関節をつまんで適当に動かして右下のSend to ControlNetを押す。すると棒人間の画像がControlNetに入る。

棒人間が入ったことを確認できたらPreprocessorにNone、Modelにcontrol_openpose-fp16を指定してGenerate。

プロンプトで細かく指定しなくてもそれっぽいポーズで画像が生成された。

便利な予感がする。

ControlNetにアップロードした画像が真っ白か真っ黒でうまく動いてないとき

ブラウザやブラウザの拡張機能によっては画像のアップロードに失敗することがある。ブラウザを変えたり拡張機能のないプライベートウィンドウを使うなど試してみるといい。

参考 * ControlNet masks are always blank and have no effect on the final image #95

試した感想

遊び方がわかったのでもう少し試す。以下蛇足。

プロンプトを指定しなくても確実なポーズ指定ができるようになるわけではない

例えばヨシッさせようとしてみる。棒人間をそれっぽくして設定。

適当にpromptの設定をしてみる。金髪ドリルを生成。

prompt         :1girl, blonde drill hair, business_suit, pointing
negative prompt:(worst quality, low quality:1.4), (realistic, lip, nose, tooth, rouge, lipstick, eyeshadow:1.0), (dusty sunbeams:1.0),, (abs, muscular, rib:1.0), (depth of field, bokeh, blurry:1.4),(motion lines, motion blur:1.4), (greyscale, monochrome:1.0), text, title, logo, signature

生成。顔の向きが気になるが概ね指定通りのこともあれば、

棒人間の姿勢と違って足を上げてなく、変なところから足生えてるやんけってなることもある。

promptにleg upを追加すると片足を大体上げてくれるようになる。ただのleg upで指定通り右足を上げてくれることが多い。openposeの恩恵を感じる。

惜しい。どうしてそうなったとなることもある。

まだまだ制御が難しい部分もある

ポーズ以外は当然ガチャ。プロンプトで頑張るしかない。

座るな。余計な気を利かせてくることがある。

途中でhelmetとか入れてしまったので変なもの被っている。いろいろと不自然だけどとりあえずヨシッ。

おわり

一撃で理想の画像ができるわけではないが、ほしいポーズの人物が生成される可能性は格段に上がった。

蛇足

img2imgのinpaintingを使って手を少し変える。

ヨシッ。

QooQ