ControlNetを使って構図(背景と人物ポーズ)を与えてAIに絵を描かせる

# はじめに

ControlNetを使って構図(背景と人物ポーズ)を与えてAIに絵を描かせた時に自分がはまったポイントを誰かの役に立つかもと書き記しておくメモ

# 対象読者

- ControlNetを使って構図(背景と人物ポーズ)を与えてAIに絵を描かせるやりかたの事例や、はまりポイントが知りたい
- stable diffusionのwebuiを使ったことがある
- stable diffusionのwebuiのextentionsから[sd-webui-controlnet](https://github.com/Mikubill/sd-webui-controlnet)を導入して必要なファイルのsetupを自力で行うことができる

# ControlNetとは

ControlNetは、輪郭線、深度、セグメンテーションなどの条件を追加することにより、拡散モデルを制御できる技術。
（ControlNetの詳しい説明やインストール方法の記事は検索するといっぱい出てくるので他の記事参照）

# 今までの課題

- 4コマ漫画やパラパラアニメなどを書こうとする場合、構図は指定したい
- txt2imgでpromptで構図を与えても思ったような構図の絵を出すのが難しい
- img2imgでラフスケッチを与え場合、strengthを高く指示すると元の構図と大きく変わってしまう。逆にstrengthが低いと元のラフスケッチから変化が少なくAIが絵を描いてくれない

# やりたいこと

- 構図は指定しつつ、AIが持つ絵描き能力を存分に発揮させてAIに絵を描かせたい

# 今回やったこと

背景をdepthmap、人物ポーズをopenposeとして指定してAIに絵を描かせる。
今回は誰でも簡単にこの技術が使えることを説明したいため、背景、人物ポーズとも一枚の写真から抽出する。

![overview.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116075/5aa0220f-6fc7-d894-7c20-ee7aa6474082.png)

## 手順
webuiのSettingsタブ > ControlNet で Multi ControlNet: Max models amountを`2`にする
![11_2023-02-27_021210.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116075/f2cff802-c8b2-9638-bef8-62548b4b53c9.png)

txt2imgタブに戻り、ControlNet-0に写真をドラッグアンドドロップしdepthmapのweightsは1に設定する
![12_2023-02-27_021709.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116075/0e201c54-5aff-b303-7cf3-f83d7eb9a247.png)

ControlNet-1に同じ写真をドラッグアンドドロップしopenposeのweightsは1.5に設定する (1.5にする理由ははまりポイントで説明)
![13_2023-02-27_021852.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116075/0a5c4a7b-26b0-5491-420d-8f78be377d76.png)

あとは好きなモデルとprompt設定で`Generate`するだけ。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">過積載のバイクで生活感あふれるミクさんもAI使うと簡単に作れちゃいますね。すべてのありふれた日常の素材が、クリエイターさんの新たな創作の刺激になる新しい世界 <a href="https://twitter.com/hashtag/AIart?src=hash&amp;ref_src=twsrc%5Etfw">#AIart</a> <a href="https://twitter.com/hashtag/%E5%88%9D%E9%9F%B3%E3%83%9F%E3%82%AF?src=hash&amp;ref_src=twsrc%5Etfw">#初音ミク</a> <a href="https://t.co/5QFzfqDGuX">pic.twitter.com/5QFzfqDGuX</a></p>&mdash; inada (@dev_inada) <a href="https://twitter.com/dev_inada/status/1629494503890620416?ref_src=twsrc%5Etfw">February 25, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# はまりポイント

簡単に出来るかと思ったが、やるといろいろはまった。以下、自分がはまったポイント。誰かのお役に立てば。

### openposeの構図指定が効かない
![21_FpkWnQgaMAUKWe_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116075/7d554f7a-55eb-d303-9cc9-774dafa312f6.jpeg)

全くポーズ指定が効いてない。線が太いと効かない。ポーズの絵を拡大したりして使うと効かないかもなので注意。

### 椅子に座らない
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">MultiControlNetある意味強すぎて、ちょっとパラメータいじるぐらいじゃ構図はどうにもならずこれしか出力されない。おーいみんな元気だせよぉー・・・ごめんよぉーそういうつもりはこれっぽっちもなくて、手前に座らせたかったんだよぅ・・・ (机椅子depth画像は<a href="https://twitter.com/toyxyz3?ref_src=twsrc%5Etfw">@toyxyz3</a> さんから拝借) <a href="https://twitter.com/hashtag/AIart?src=hash&amp;ref_src=twsrc%5Etfw">#AIart</a> <a href="https://t.co/UhdperDWqY">pic.twitter.com/UhdperDWqY</a></p>&mdash; inada (@dev_inada) <a href="https://twitter.com/dev_inada/status/1628401764478365698?ref_src=twsrc%5Etfw">February 22, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

ポーズは雰囲気で適当に配置しただけじゃだめ。生成時パラメータではどうにも出来ないので、狙ってポーズを作成して配置する。

### ポーズと背景が同化する / ポーズが無視される
![22_00795-1949653219-.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116075/4bcf6eb5-50a1-4ba1-8887-9a3847c16f82.png)

openposeのweightはdepthより強めに設定する(例えばdepthが1ならopenposeは1.5)。
これでも駄目な場合はt2i-adapterのdepthとkeyposeを使うとposeが効いてくれる場合がある。

# 終わりに
ControlNetですが、一枚絵を出すには良いのですが、深度情報(depthmap)や、ポーズ(openpose)にはコマの絵の一貫性を制御する情報がないので、４コマで使ったり、パラパラアニメで使うには工夫が必要です。
特に複数キャラの時は、キャラ毎に分割して生成するなど更なる工夫が必要です。このあたりは背景分離や、LoRA、Latent coupleをうまく使っていく必要があります。