ジャコ Lab

プログラミング関連のメモ帳的ブログです

ControlNet の SoftEdge を使ってみる

huggingface.co

diffsers の ControlNet は、残すところあと3つ!

今回は SoftEdge を使ってみます

SoftEdge

SoftEdge もエッジ検出系です。

Canny や LineArt, Scribble に似た感じでしょうか?

zako-lab929.hatenablog.com

zako-lab929.hatenablog.com

投入画像の準備

controlnet_aux の PidiNetDetector を使うので!pip install -U controlnet_auxを忘れずに!
from diffusers.utils import load_image
from controlnet_aux import PidiNetDetector

init_image_url = "https://huggingface.co/lllyasviel/control_v11p_sd15_softedge/resolve/main/images/input.png"
init_image = load_image(init_image_url)

processor = PidiNetDetector.from_pretrained('lllyasviel/Annotators')
control_image = processor(init_image, safe=True)
Model Card のページでは以下のようになっていましたがHEDdetectorは Scribble の方で使ったものなので今回は不要だと思います!
processor = HEDdetector.from_pretrained('lllyasviel/Annotators')
processor = PidiNetDetector.from_pretrained('lllyasviel/Annotators')

(左) 投入画像 | (中) safe=True | (右) safe=False

Detector には例によってオプションがありました
control_image はsafe=Falseのパターンも確認しました

ControlNet, Pipeline の準備

import torch
from diffusers import ControlNetModel, StableDiffusionControlNetPipeline, UniPCMultistepScheduler

# ControlNet の準備
controlnet = ControlNetModel.from_pretrained(
    "lllyasviel/control_v11p_sd15_softedge",
    torch_dtype=torch.float16
)

# Pipeline の準備
pipe = StableDiffusionControlNetPipeline.from_pretrained(
    "runwayml/stable-diffusion-v1-5",
    torch_dtype=torch.float16,
    controlnet=controlnet
)
pipe.enable_model_cpu_offload()

# スケジューラーの設定
pipe.scheduler = UniPCMultistepScheduler.from_config(pipe.scheduler.config)
いつもの~

パイプライン実行

prompt = "royal chamber with fancy bed"
image = pipe(
    prompt,
    num_inference_steps=30,
    generator=torch.manual_seed(0),
    image=control_image
).images[0]
image

(左) safe=True の control_image を使って ControlNet の SoftEdge で生成した画像 | (右) safe=False の control_image を使って ControlNet の SoftEdge で生成した画像

まとめ

Scribble とあまり違いがないように見えますが、検出アルゴリズムの違い。といった具合でしょうか。