ジャコ Lab

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

ControlNet の MLSD を使ってみる

huggingface.co

今回は ControlNet の MLSD を使ってみます!
雰囲気的には Canny に似てます!

MLSD

MLSDは、線分検出アルゴリズムの一つで、画像中の線分を効果的に検出するために使用されます。

インプット画像から直線を検出したものを使う ControlNet のようです

controlnet_aux モジュールをインストール

ここでは controlnet_aux から MLSDdetector というものを使用しますので、pip module をインストールしておきます

!pip install -U controlnet_aux

投入画像の準備

from controlnet_aux import MLSDdetector
from diffusers.utils import load_image

# 投入画像の準備
init_image_url = "https://huggingface.co/lllyasviel/control_v11p_sd15_mlsd/resolve/main/images/input.png"
init_image = load_image(init_image_url)

processor = MLSDdetector.from_pretrained('lllyasviel/ControlNet')
control_image = processor(init_image)

(左) 投入画像 | (右) MLSDDetector で検出した画像

ControlNet, Pipeline の準備

# ControlNet, Pipeline の準備
controlnet = ControlNetModel.from_pretrained(
    "lllyasviel/control_v11p_sd15_mlsd",
    torch_dtype=torch.float16
)
pipe = StableDiffusionControlNetPipeline.from_pretrained(
    "runwayml/stable-diffusion-v1-5",
    controlnet=controlnet,
    torch_dtype=torch.float16
)
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.Generator(device="cuda").manual_seed(0),
    image=control_image
).images[0]
image

ControlNet の MLSD で生成した画像

おお。。。ロイヤル。。。

まとめ

Canny に続き、MLSD という検出アルゴリズムを使用した ControlNet でした