Stable Diffusion メモ(3): 絵の描けない人が顔ガチャを敢行する

 

やりたいこと

この前の記事で、

jtnoske.hateblo.jp

元絵そのままimg2imgにかけると

しかし背景含めて全体が変わってしまうのは不都合が出できそう、画像の指定箇所のみ再度描き直すなんてことができるとたいへん便利になりますなぁ… Photoshopとかで切り抜いてやればうまくいったりするんだろうか?

というアイデアが浮かんだので実際にやってみることにした。

元の絵の一部、今回は顔の部分だけを抜き出して、そこだけimg2imgにかけたらどういう結果が得られるか。

 

やったこと(1)

この絵の顔を

GIMPで顔だけ抜き出しまして(投げ縄ツールとかウン年ぶりに使った というかGIMP自体ウン年ぶりに使った…)

透過PNGで保存、prompt は前回、前々回とまったく同じでimg2imgをかけます、と次のようなエラーが…

RuntimeError: Sizes of tensors must match except in dimension 1. Expected size 6 but got size 5 for tensor number 1 in the list.

 

うーんようわからんな、いや確か前にStable Diffusionが扱える画像のサイズはどっちかの辺が512pxでないとなんかうまくいかないとか聞いたことがあるな… ではPillowのImage.resizeを使って…

init_image = Image.open(FILE_NAME)
if '.png' in FILE_NAME:
  init_image = init_image.convert('RGB')

width,height = init_image.size
resize_image = init_image.resize((512, int(height/width*512)))

こんな感じにして幅を512にして食わせると… オー実行できた

 

いやーこの生首の並び、禍々しいですな…

うーん、元の顔とタッチが変わってるものが目立ちますなぁ、strength=0.5だとこんなもんなんだろうか… ていうか透過PNGを食わしてるのになんで背景黒なの? あ、さっきのコードでBMPに変換してるからか! PNGのままだとダメなんだっけかな…

まぁいいや、ためしになにか貼り付けてみましょう

うーん、浮くなぁ… やっぱstrength=0.5はかけすぎなんかな、0.3くらいでやってみましょう

 

オッさっきよりはタッチが元絵と合ってきたんじゃないすか、では何か選んで…

アレなんか浮いてる? なにかしらなじませる方法はあるんだろうけど自分のGIMPスキルは雑コラできる程度のレベルなのでここから先は勉強しないとですかな…

 

やったこと(2)

オウ次行くぞ次

この顔がちょっと残念な出力結果を…

こうして… 

strength=0.3くらいで…

いやこれ結構ええやん…

やっぱ入力を幅512pxまで拡大すると出力もええ感じ

 これが… 

オーよくなったぞ! 相変わらず雑コラ感が漂う画像だけども今はこれでも十分満足ですわ

 

やったこと(3)

さらに顔が小さい画像にいきましょう。

自分は最初はファンタジー調の画像をよく出してたんだけど、ちょっと引きの画像になるとどうしても人物の顔がつぶれまくって、せっかくのいい構図が台無しという悲しい思いをよくしてました… ついにリベンジのときが来たかもしれんぞこれは

 

これを…

こうして… strengthは元画像が荒すぎるから0.5くらいか…

いやーちょっと異形の生物が誕生しまくってますなぁ… 元画像はさすがにそのまま使えないか。では秘技・素人レタッチを繰り出して…

いや、ここから画伯が我が意を汲んでいい感じで顔を出してくださいますので…

同じくstrength=0.5で…

相変わらず異形の生物は誕生しまくるけど、顔として成立している絵もそれなりに増えてきた! さすが画伯!!!

 

いや結構よくなってないすか、こりゃあいい!

いやー、いい… 過去の資産(9000枚近い出力結果)が息を吹き返すんじゃないかこれは
ただ…

 

めんどくさい

 

自分がGIMPスキルレベル2か3くらいだからなんでしょうが、顔を切り抜いて別画像で保存して出力結果からまた切り抜いて元画像にはめてうんぬんかんぬんが面倒で仕方がない。しかも選んだものが当てはめてみるとしっくり来なくて再度選んでとかちょくちょく発生するので面倒で面倒でしかたがない。なんかGIMPで適当に選択してそこからStable Diffusionにかけて出力結果からパラパラ選んではめてみる、みたいなプラグイン、誰か作っていただけませんでしょうか……!!!!!

 

Redditとかで絵を作ってる人の例を見ると、txt2imgとtxt2imgの間に適当に色を塗ってimg2imgで補完させながら絵を描く例があったけど、www.reddit.com

このimg2imgやってる箇所みたいな感じで、顔の部分だけ選択範囲にしてimg2imgかけたいなぁ。

参考情報

1枚当たりの出力速度

strengthの値(大きければ遅くなる)とおそらく元画像の荒さによるんだと思いますが、自分のマシン(Ryzen 7 5800x, メモリ64GB, RTX 3080 GAMING Z TRIO 12G)で1枚1秒~4秒くらい。200連ガチャかけて出力結果待ちするのは、なんかビルド待ちでコーヒー汲みに行くプログラマーみたいな感覚になりますね。

切り抜き後の画像サイズ

半端なサイズにすると、リサイズかけて512pxにしても

RuntimeError: Sizes of tensors must match except in dimension 1. Expected size 12 but got size 11 for tensor number 1 in the list.

とか出ることがあったので、10の倍数にしといた方が無難かと。 はてなブックマークでコメントいただきましたが、64の倍数がよいですね。id:onigiri-chan さん、ありがとうございます!

 

続き

Krita Plugin で顔ガチャがはかどりそうなので導入記事を書きました

 

jtnoske.hateblo.jp