【SDXL 1.0】 OpenPose ControlNet が公開されたのでさっそく使ってみました

huggingface.co

はじめに

「Canny」「Depth」に続いて「OpenPose」の ControlNet が公開されました。

「Canny」に関してはこちらを見て下さい。
touch-sp.hatenablog.com
「Depth」に関してはこちらを見て下さい。
touch-sp.hatenablog.com

元画像

ぱくたその画像を使わせて頂きました。

こちらの画像です。

OpenPose画像の作成

「controlnet_aux」を使えば簡単です。

「controlnet_aux」についてはこちらの記事を見て下さい。

from controlnet_aux.processor import Processor
from diffusers.utils import load_image

image = load_image("girl.jpg")

processor = Processor("openpose")
openpose_image = processor(image, to_pil=True).resize((1024, 1024))

実行

from diffusers import DiffusionPipeline, StableDiffusionXLControlNetPipeline, ControlNetModel
import torch
from controlnet_aux.processor import Processor
from diffusers.utils import load_image

image = load_image("girl.jpg")

processor = Processor("openpose")
openpose_image = processor(image, to_pil=True).resize((1024, 1024))

controlnet = ControlNetModel.from_pretrained(
    "thibaud/controlnet-openpose-sdxl-1.0", 
    torch_dtype=torch.float16).to("cuda")

pipe = StableDiffusionXLControlNetPipeline.from_pretrained(
    "stabilityai/stable-diffusion-xl-base-1.0",
    controlnet=controlnet,
    torch_dtype=torch.float16).to("cuda")

refiner = DiffusionPipeline.from_pretrained(
    "stabilityai/stable-diffusion-xl-refiner-1.0",
    text_encoder_2=pipe.text_encoder_2,
    vae=pipe.vae,
    torch_dtype=torch.float16).to("cuda")

class NoWatermark:
    def apply_watermark(self, img):
        return img
    
pipe.watermark = NoWatermark()
refiner.watermark = NoWatermark()

prompt = "pretty girl standing on the beach, high quality, 8k"
negative_prompt = "low quality, bad quality"

seed = 30000
generator = torch.manual_seed(seed)

image = pipe(
    prompt=prompt, 
    negative_prompt=negative_prompt,
    image=openpose_image,
    num_inference_steps=30,
    generator=generator,
    output_type="latent").images[0]

del pipe

image = refiner(
    prompt=prompt,
    negative_prompt=negative_prompt,
    image=image[None, :]).images[0]

image.save("openpose_result.png")

結果


補足

class NoWatermark:
    def apply_watermark(self, img):
        return img
    
pipe.watermark = NoWatermark()
refiner.watermark = NoWatermark()

こちらに関しては以下のGitHub Issueを見て下さい。
github.com
これがないと多数のドットが現れます。

以下の方法でもドットを消すことは可能です。

pipe = StableDiffusionXLControlNetPipeline.from_pretrained(
    "model/stable-diffusion-xl-base-1.0",
    controlnet=controlnet,
    torch_dtype=torch.float16,
    add_watermarker=False).to("cuda")

refiner = DiffusionPipeline.from_pretrained(
    "model/stable-diffusion-xl-refiner-1.0",
    text_encoder_2=pipe.text_encoder_2,
    vae=pipe.vae,
    torch_dtype=torch.float16,
    add_watermarker=False).to("cuda")




このエントリーをはてなブックマークに追加