はじめに
「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")