Stablediffusionで、【Depth map library and poser】を用いて手を修正しよう。

# 概要
StableDiffusionなどのAI絵を使用していると、どうしても手がうまく描けないので困ってしまう。
そういった時に手をうまく修正する、`Depth map library and poser`を用いて手を修正しよう。


# controllnetのダウンロード
`Depth map library and poser`を使うためには、`controllnet`が必要なので、以下手順でダウンロードする。

拡張機能から、sd-webui-controlnetを探して、インストールを押す。
![スクリーンショット 2023-05-07 16.25.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1288524/f61b59b5-0926-d0b0-2ab1-fdc4ad68e646.png)

インストール中だと、画面が薄くなり、`proccesing`が進む。
![スクリーンショット 2023-05-07 16.27.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1288524/ab7bfc1d-0b70-7b4a-5eaa-cf421709fe84.png)

その後、Installedに、`sd-webui-controlnet`が出てくるのを確認する。
![スクリーンショット 2023-05-07 16.29.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1288524/7f3bedd5-0199-75e2-607d-052e0e262ec7.png)

その後、stablediffusionを再起動すると、Controllnetがimgtotxt,imgtoimgで選択できるようになる。
![スクリーンショット 2023-05-07 16.44.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1288524/f04a8ff8-76fa-88c9-47f0-eb2d2514da5a.png)

## モデルのダウンロード
ControlNetは専用のモデルが必要なので、以下リンクからダウンロードする。

https://huggingface.co/lllyasviel/ControlNet-v1-1/tree/main

しかい、ここを見るとたくさんモデルがありすぎる。。
![スクリーンショット 2023-05-07 16.33.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1288524/b0d50063-77d0-9be9-473b-3dacefe4fbc6.png)

以下リンク先より、モデルの説明を抜粋。
```
ip2p：プロンプトで画像を修正する「Instruct Pix2Pix」を使うモデル。
shuffle：画像をシャッフルし、再構成することで画像を生成するモデル。
depth：深度情報を元に画像を生成するモデル。
canny：画像の輪郭を抽出してそれを元に画像を生成するモデル。シンプルで分かりやすいのが特徴。
inpaint：画像の一部を修正する「Inpainting」を使うモデル。
lineart：線画を作成し、それを元に画像を生成するモデル。
lineart_anime：上記のlineartモデルのイラスト向け版。
mlsd：直線的な線を抽出して画像を生成するモデル。建物や部屋など構造物の画像を生成するときに便利。
normalbae：法線マップ（ノーマルマップ）を使って画像を生成するモデル。
openpose：人物のポーズを検出し、それをもとに棒人間を生成してポーズを制御するモデル。
scribble：落書きからリアルな画像を生成できるモデル。
seg：「セマンティックセグメンテーション」という手法を使うモデル。
softedge：ソフトな輪郭を使って画像を生成するモデル。ディテールを維持するのが得意で、色変更等に活用するとよい。
tile：高解像度の画像を生成するためのモデル
```

https://kurokumasoft.com/2023/02/16/stable-diffusion-controlnet/

今回は、参考元の記事から、おすすめと書いてある
```
・　cannyモデル
・　openposeモデル
```
と、以後の手の修正で使用する
```
・　ontrol_v11f1p_sd15_depth.pth
```

をダウンロードする。
ダウンロードしたモデルを、`stable-diffusion-webui\models\ControlNet`の中に移動させる。

Controllnetの細かい使い方はもっと他にもあるのだろうが、ここでは割愛する。

# Depth map library and poserのダウンロード

今回使う拡張機能の公式ページは以下。

https://github.com/jexom/sd-webui-depth-lib

これを使うことで、手や指などを綺麗にすることができるらしい。

拡張機能のインストールは、`拡張機能/Install from URL / URL for extension's git repository`に以下のurlを入力し、インストールする。
```
https://github.com/jexom/sd-webui-depth-lib.git
```

以下のようにinstalledときたら、stablediffusion,を再起動する。
![スクリーンショット 2023-05-07 17.05.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1288524/d3f0bc10-9dab-3fa8-de0c-734d95164757.png)

すると、`DepthLibraly`という新しいタブが表示されるようになる。
![スクリーンショット 2023-05-07 17.09.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1288524/c7056e89-0ccf-60b9-aaab-08c2b49c9ec1.png)

ちなみに、`Hands`をみると、さまざまな形の手の絵が記載されている。
![スクリーンショット 2023-05-07 17.11.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1288524/325be523-5b53-389a-4a24-65e4e2396d25.png)

# 実際に修正する。

`Add backgrounds`から、修正したい内容の絵を選択する。
![スクリーンショット 2023-05-07 17.14.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1288524/18087f0a-c4b6-05e2-721e-a24970508776.png)

![00005-204196767.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1288524/dc4bfff1-c590-d977-403d-1365c2c862b1.png)
そして、画像のサイズと、Depthlibraryでのサイズを合わせる。ここでは1024x640だった。わからなかったらpinginfoとかで確認すること。

そして、`Hands`の中から、指定したい指を選択し、`Add`を押すと、右側で手が出てくる。
![スクリーンショット 2023-05-07 17.20.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1288524/b9fbaa64-4171-edc4-a817-315ca5b2277b.png)

この手をうまいこと元の絵と合わせて、それっぽい形にする。なお、修正用の手は左しかないので、右手の場合は必ず反転させること。（拡大縮小、反転、角度変更ができる。）
![スクリーンショット 2023-05-07 17.23.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1288524/d4b254b7-8839-ae07-b512-bd189168dabc.png)

その後、save pingを押すと、手の部分だけの画像が出てくる。
![スクリーンショット 2023-05-07 17.27.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1288524/60425146-a1c4-b905-9af6-c21ac80f3cf6.png)

その後、元の修正する画像をping info から、`txt to txt`に送る。
![スクリーンショット 2023-05-07 17.30.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1288524/11dfe7cd-f046-89ae-f0f8-c3a0cbb32835.png)

そして、同じプロンプトやサンプラー、Seedなどを設定する。
![スクリーンショット 2023-05-07 17.41.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1288524/5e89fc78-8420-2a64-cdb0-3fd4e4004b6e.png)

- txt2imgタブにあるControlNetの項目を開きEnableにチェックを入れる
- Imageのタブに上の項で生成した手のPNG画像をドラッグアンドドロップする。
- PreprocessorをNone、Modelをcontrol_depthに設定する。
- Control WeightとStarting Control Stepを変更する。
    - Starting Control Stepの値を0から上げることで、AIイラストの生成にControlNetが作用するタイミングを遅らせることができる。（参考記事：https://github.com/Mikubill/sd-webui-controlnet/pull/393）
    - `Control Weight`は`0.9～1.2付近`
    - `Starting Control Step`は、`サンプリングステップの数が20なら0.19、30なら0.3`あたりがいいらしい。

だが、これで出力すると、手を写すというか、そもそも手を映さない構図に変更された。
何が悪いのかはよくわからないですが、とりあえず手の部分が変なふうに見えることを回避させるらしい。


![00026-204196767.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1288524/6736d57b-705e-9217-13a7-97e57a52ceb8.png)



# 参考サイト

https://kurokumasoft.com/2023/02/16/stable-diffusion-controlnet/

https://kurokumasoft.com/2023/03/04/sd-webui-depth-lib/

https://yuuyuublog.org/depthlibrary/

https://murasan-net.com/index.php/2023/03/18/stable-diffusion-depth-controlnet-handfix/