Stablediffusionで、表情差分のイラストを作成する。

# 概要

Stable diffusionを活用する方法を考えていたのだが、RPGゲームなどのキャラクタ画像のようなものを作成するのによいのではないかとかんがえた。
Ex：クロックタワーのようなイメージ。
![スクリーンショット 2023-04-22 17.09.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1288524/a99a3b9f-f2b9-453f-272f-e221ffa07099.png)

![スクリーンショット 2023-04-22 17.08.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1288524/7c9c4e46-6fdd-937a-bba9-0dc950ffc0c1.png)

参考元はこちら。

https://www.nintendo.co.jp/wii/vc/vc_ct/vc_ct_04.html

https://www.youtube.com/watch?v=lwOdgEVzTwU


しかし、普通にプロンプトをうっていくと、微妙に顔や服装が変わってしまう。なんとなく似ているけど、違う人？って思ってしまうような感じ。
以下の2枚の写真は、全く同じプロンプトで生成したものなのだが、微妙に異なるのがお分かりいただけると思う。
![00013-3359907649.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1288524/e9340ea7-8e56-bf8c-5dfe-37e2d8af5c5c.png)
![00014-3359907650.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1288524/284e0c84-e40e-fa0d-5a1e-1510f0a911b9.png)

そこで今回は、全く同じキャラで表情を変えさせるように画像を追求していく。

# その1：Seed値の固定
まず、一度生成した画像と全く同じ画像を生成するためには、プロンプトの他に、Seed値を固定させる必要がある。

WebUIから直接DLしたのであれば、pinginfoから情報を得ることが可能。ここで得た情報を、`Send to txt2img`などに送って、再度generateしてみよう。
![スクリーンショット 2023-04-22 17.28.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1288524/eb41dd31-4523-0a81-3ea1-552adbcb29b2.png)

![スクリーンショット 2023-04-22 17.31.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1288524/3dbd8d72-d233-4ece-1354-a545e9017005.png)
![スクリーンショット 2023-04-22 17.31.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1288524/02d434b4-9341-1634-4325-393403e44de9.png)

すると、全く同じ画像が生成される。

ここで出たプロンプトの中に、表情を追加する単語を追加する。追加するプロンプトの参考サイトは以下。

https://koneko3.com/stable-diffusion-emotional-expression-prompt/

ここから、単語を追加した形の各画像を見ていく。

`light smile`
![00011-2684463263.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1288524/5e3ea51a-f0ee-b988-a3b6-6305dcf7efef.png)

`smile`(上とほとんど変わらない。)
![00014-2684463263.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1288524/229473ae-1084-064e-4cdb-e071c8b2f699.png)


`laugh`(全然笑ってないし、構図が変わっている。失敗？)
![00013-2684463263.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1288524/5fd2064d-d898-dd4e-f3d1-499d64fff3b2.png)

`angry`
![00015-2684463263.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1288524/92a87076-dcf1-bf4a-b08d-935125872dac.png)

`grin`(歯を見せて笑う。構図変わってるけど、表情としては成功)
![00016-2684463263.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1288524/a38f00e3-603b-cfe8-a3fb-1ab6a562ae73.png)

`scared`(全然変わっていない)
![00017-2684463263.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1288524/7d2a0f47-7d60-d99c-1062-ccdbe654cf51.png)

`sad`も試したのだが、上記の画像とほとんど一緒で変わっていない。

`unhappy`ちょっと困った感じ。
![00018-2684463263.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1288524/60c5038c-958a-c011-621c-a474389c5221.png)

`cry`これは悲しそうな感じはだしているが、泣いてないように見える。絵が悪かったか。
![00019-2684463263.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1288524/6ad133db-2c20-35cd-6ad2-82150137b657.png)

`surprised`このプロンプトだと、驚くというより困ったor呆れた感じに見える。本来はもっと驚いてくれるはず
![00020-2684463263.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1288524/d954f291-8fcd-cd51-3889-d76a0214f94d.png)

# その2 in painting機能を使う。

ここまでの画像を見ていただいてお分かりかとおもいますが、イヤリングとか帽子とか、Seed値を変えても微妙に、もしくは大きくずれたりするのです。これをなんとか解消するために、WebUIの`in painting機能`を使用します。
この機能は,img to imgで、画像の選択箇所のみを再生成する機能。

## in painting機能の使用方法
`img to img`の画像を開き、下の方の`inpaint`を開く。そして、今回変更したい画像をアップロードする。
すると、黒い丸がカーソルで現れる。
![スクリーンショット 2023-04-22 18.29.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1288524/8e065e6d-3ee3-5cd1-a4ee-4c2a32cfc279.png)

その後、顔の部分だけを黒丸で隠す。

![スクリーンショット 2023-04-22 18.33.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1288524/e1c32868-70bd-ba7e-f403-6ffc103700e6.png)

また、txt_to_imgで使用していたプロンプト、ネガティブプロンプトとシード値を入れ込んで画像を生成する。
すると、服装とかをそのままで表情を変えられる。この時、`seed値が-1だったり、プロンプトを指定していない場合、画像がおかしな表示になるので忘れずに指定すること。`

今回、　grinで生成してみたが、　smileとあまり大差ないかも。
![スクリーンショット 2023-04-22 18.38.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1288524/70cd3f5f-8cfe-ae25-c82b-443b8d639849.png)
![スクリーンショット 2023-04-22 18.38.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1288524/a38d4e4a-652c-9559-6f1d-ba07f9d8c3b0.png)

amazed
![スクリーンショット 2023-04-22 18.45.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1288524/43e0a3e3-b53d-db17-6ee0-5780ef5483e7.png)

cryingこれが一番わかりやすい。同じキャラだが、表情が明らかに違う。
![00022-2684463263.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1288524/a1fb7771-d7b6-4aae-fc41-eb0e25d25f00.png)

laugh,open mouth いい感じに笑顔
![00023-2684463263.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1288524/8a364073-e341-1371-867a-309dbe936409.png)

sweat, surprised, open mouth いい感じに驚いてくれている

![00024-2684463263.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1288524/b91d0cc7-204c-fdb8-f213-cbae9cd73cf3.png)


# 結論
画像の表情のみ変える場合は、以下のように作ればOK

- プロンプト、ネガティブプロンプト、Seed値などの情報を同じにする
- inpaint機能を使い、変更したい部分のみ変える。

これだけで、かなり素材として使いやすいものが出来上がる。


# 参考サイト

https://koneko3.com/stable-diffusion-emotional-expression-prompt/

http://tanoshare.com/hobby/6337