今回は ControlNet の Instruct pix2pix を使ってみます!
Instruct pix2pix
Image-to-Image みたいな感じでしょうか?
投入画像の準備
from diffusers.utils import load_image # 投入画像の準備 init_image_url = "https://huggingface.co/lllyasviel/control_v11e_sd15_ip2p/resolve/main/images/input.png" init_image = load_image(init_image_url
今回は、変換等はいらず、インプット画像だけあれば良いみたいです。
ControlNetModel, Pipeline の準備
# ControlNet の準備 controlnet = ControlNetModel.from_pretrained( "lllyasviel/control_v11e_sd15_ip2p", torch_dtype=torch.float16 ) # パイプラインの準備 pipe = StableDiffusionControlNetPipeline.from_pretrained( "runwayml/stable-diffusion-v1-5", controlnet=controlnet, torch_dtype=torch.float16 ).to("cuda") pipe.enable_model_cpu_offload() # スケジューラの設定 pipe.scheduler = UniPCMultistepScheduler.from_config(pipe.scheduler.config)
パイプライン実行
prompt = "make it on fire" image = pipe( prompt, num_inference_steps=30, generator=torch.Generator(device="cuda").manual_seed(0), image=init_image ).images[0] image
make it on fire
のプロンプトだけで、インプット画像の家が燃えました!
普通の Image-to-Image でやったらどうなる?
コード全文 (折りたたみ)
import torch from diffusers import AutoPipelineForImage2Image, UniPCMultistepScheduler from diffusers.utils import load_image # 投入画像の準備 init_image_url = "https://huggingface.co/lllyasviel/control_v11e_sd15_ip2p/resolve/main/images/input.png" init_image = load_image(init_image_url) # パイプラインの準備 pipe = AutoPipelineForImage2Image.from_pretrained( "runwayml/stable-diffusion-v1-5", torch_dtype=torch.float16 ).to("cuda") pipe.enable_model_cpu_offload() # スケジューラの設定 pipe.scheduler = UniPCMultistepScheduler.from_config(pipe.scheduler.config) # パイプライン実行 prompt = "make it on fire" image = pipe( prompt, num_inference_steps=30, generator=torch.Generator(device="cuda").manual_seed(0), image=init_image ).images[0] image
まとめ
上記の記事で Image-to-Image をしたときは、Prompt がしっかりしていたので Text-to-Image でもそれっぽい猫様が生まれてしまいましたが、こちらの make it on fire
に関しては、Image-to-Image の強さがわかる気がしました!