【InstantStyle③】スタイル画像とプロンプトを使って画像のスタイルを変更する

はじめに

InstantStyleというモデルを使っています。
github.com
できることが色々あるようですが今回はスタイル画像1枚とプロンプトから画像のスタイル変換をしてみます。

スタイル画像

こちらのGitHubページからスタイル画像を使わせて頂きました。
github.com
21種類あります(正方形に変形しています)。

用意した画像

こちらの画像を用意しました。

目的

画像のスタイルを変換します。

使用したプロンプトは以下の通りです。
prompt

a woman, masterpiece, best quality, high quality

negative prompt

text, watermark, lowres, low quality, worst quality, deformed, glitch, low contrast, noisy, saturation, blurry

結果


Pythonスクリプト

import torch
from diffusers import ControlNetModel, StableDiffusionXLControlNetPipeline

import cv2
from PIL import Image
from pathlib import Path

from ip_adapter import IPAdapterXL

base_model_path = "sdxl_pipeline/stable-diffusion-xl-base-1.0"
image_encoder_path = "sdxl_models/image_encoder"
ip_ckpt = "sdxl_models/ip-adapter_sdxl.bin"
device = "cuda"

controlnet_path = "controlnet/controlnet-canny-sdxl-1.0"
controlnet = ControlNetModel.from_pretrained(
    controlnet_path,
    torch_dtype=torch.float16
).to(device)

# load SDXL pipeline
pipe = StableDiffusionXLControlNetPipeline.from_pretrained(
    base_model_path,
    controlnet=controlnet,
    torch_dtype=torch.float16,
    variant="fp16"
)
pipe.enable_vae_tiling()

ip_model = IPAdapterXL(
    pipe,
    image_encoder_path,
    ip_ckpt,
    device,
    target_blocks=["up_blocks.0.attentions.1"]
)

# control image
input_image = cv2.imread("./assets/face.jpg")
detected_map = cv2.Canny(input_image, 50, 100)
canny_map = Image.fromarray(cv2.cvtColor(detected_map, cv2.COLOR_BGR2RGB))

Path("results").mkdir(exist_ok=False)

image_list = Path("assets/styles").glob("*.jpg")

for image_path in image_list:
    image = Image.open(image_path.as_posix()).resize((512, 512))

    # generate image
    images = ip_model.generate(
        pil_image=image,
        prompt="a woman, masterpiece, best quality, high quality",
        negative_prompt= "text, watermark, lowres, low quality, worst quality, deformed, glitch, low contrast, noisy, saturation, blurry",
        scale=0.6,
        guidance_scale=5,
        num_samples=1,
        num_inference_steps=30, 
        seed=42,
        image=canny_map,
        controlnet_conditioning_scale=1.0,
    )

    images[0].resize((512, 512)).save(Path("results", f"{image_path.stem}.jpg").as_posix())

PC環境

Windows 11
CUDA 11.8
Python 3.11

Python環境構築

pip install torch==2.2.2+cu118 --index-url https://download.pytorch.org/whl/cu118
pip install diffusers[torch]
pip install transformers einops opencv-python
pip install git+https://github.com/tencent-ailab/IP-Adapter.git





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