【Stable Diffusion】人物の姿勢を決めるのに呪文をあれこれ考えるのもいいけど元画像を用意した方が簡単です

公開日:2022年12月31日
最終更新日:2023年3月7日

はじめに

「Stable Diffusion」などの画像生成AIはきれいな画像を作成してくれますが必ずしも希望の画像を作成してくれません。

たとえば人物の姿勢などを指定することは難しい時があります。

そういう時は文章(呪文)をあれこれいじるより元画像を用意して「img2img」を使った方が楽です。

元画像

ぱくたそから使わせて頂きました。
こちらの画像です。
上半身だけになるように切り取らせて頂きました。

結果

首を左に少し傾けた姿勢が保たれているのがわかります。

プリンセス風

prompt = "beautiful princess, beautiful face, beautiful hair beautiful clothes, artstation, octane render"
n_propmt = "bad, deformed, ugly, bad anatomy, duplicate"

呪文はこちらを参考にさせて頂きました。

金髪美女

prompt = "portrait of a blonde woman in a white sweater, handsome girl, diffused natural skin glow"
n_propmt = "bad, deformed, ugly, bad anatomy, duplicate"

呪文はこちらを参考にさせて頂きました。

使用したスクリプト

import torch
from PIL import Image
from diffusers import StableDiffusionDepth2ImgPipeline
from argparse import ArgumentParser
parser = ArgumentParser()
parser.add_argument('--image', type=str, help='original image' )
args = parser.parse_args()

original_image = args.image

pipe = StableDiffusionDepth2ImgPipeline.from_pretrained(
   "./stable-diffusion-2-depth",
   torch_dtype=torch.float16,
)
pipe = pipe.to("cuda")
pipe.enable_attention_slicing()

init_image = Image.open(original_image).convert('RGB').resize((512, 512))

prompt = "portrait of a blonde woman in a white sweater, handsome girl, diffused natural skin glow"
n_propmt = "bad, deformed, ugly, bad anotomy, duplicate"

for s in range(1, 10):
    strength = s / 10
    image = init_image
    image = pipe(
        prompt=prompt, 
        image=image, 
        negative_prompt=n_propmt, 
        strength=strength).images[0]
    image.save(f'result_strength{strength}.png')

おまけ(trinart_stable_diffusion_v2)

結果

呪文はこちらのものを使用させて頂きました。

diffusers-60k
diffusers-95k
diffusers-115k

Pythonスクリプト

from diffusers import StableDiffusionImg2ImgPipeline
from PIL import Image

from argparse import ArgumentParser
parser = ArgumentParser()
parser.add_argument('--image', type=str, help='original image' )
args = parser.parse_args()

original_image = args.image

init_image = Image.open(original_image).convert("RGB").resize((512, 512))

revision_list = ['60k', '95k', '115k']

for revision in revision_list:
    pipe = StableDiffusionImg2ImgPipeline.from_pretrained(
        "./trinart_stable_diffusion_v2", 
        revision= f'diffusers-{revision}')
    pipe.to("cuda")
    pipe.enable_attention_slicing()

    image = pipe(
        prompt = 'cute cat ear maid',
        image = init_image,
        strength = 0.75,
        guidance_scale = 7.5).images[0]
    image.save(f'result_{revision}.png')

おまけ(waifu-diffusion-v1-3-5)

新しい記事を書きました。
touch-sp.hatenablog.com

おまけ②(ControlNet)

ControlNetを使った記事を書きました。
touch-sp.hatenablog.com