メインコンテンツへスキップ
見出し画像

Stability AI「SDXL 1.0」をGoogle Colabで試す

    SDXL 1.0は従来のStable Diffusionモデルを遥かに超える、高性能なモデルになっています。

    Google Colabで試す

    base

    • 「ランタイム」から「すべてのセルの実行」で実行

    • ランタイムはGPUに設定されています。

    baseコード

    ライブラリのインストール▼

    !pip install diffusers --upgrade
    !pip install invisible_watermark transformers accelerate safetensors

    パイプラインでSDXL1.0baseモデルを準備▼

    from diffusers import DiffusionPipeline
    import torch
    
    pipe = DiffusionPipeline.from_pretrained(
        "stabilityai/stable-diffusion-xl-base-1.0",
        torch_dtype=torch.float16,
        use_safetensors=True,
        variant="fp16"
        )
    pipe.to("cuda")

    画像生成▼

    prompt = "penguin flying in the sky"
    n_steps = 30 # デフォルト50
    
    image = pipe(
        prompt=prompt,
        num_inference_steps=n_steps
        ).images[0]
    
    image.save('output.png')
    image

    base + refiner

    • 「ランタイム」から「すべてのセルの実行」で実行

    • ランタイムはGPUに設定されています。

    denoising_endとdenoising_startを同じ値に設定し、num_inference_steps を一定に保つようします。

    base + refinerコード

    ライブラリのインストール▼

    !pip install diffusers --upgrade
    !pip install invisible_watermark transformers accelerate safetensors

    パイプラインでSDXL1.0baseモデルとrefinerモデルを準備▼

    from diffusers import DiffusionPipeline
    import torch
    
    # base
    base = DiffusionPipeline.from_pretrained(
        "stabilityai/stable-diffusion-xl-base-1.0",
        torch_dtype=torch.float16, 
        variant="fp16", 
        use_safetensors=True
    )
    base.to("cuda")
    
    # refiner
    refiner = DiffusionPipeline.from_pretrained(
        "stabilityai/stable-diffusion-xl-refiner-1.0",
        text_encoder_2=base.text_encoder_2,
        vae=base.vae,
        torch_dtype=torch.float16,
        use_safetensors=True,
        variant="fp16",
    )
    
    # cudaにすると画像生成時にGPU VRAMがオーバーします
    # refiner.to("cuda")
    refiner.enable_model_cpu_offload()

    画像生成▼

    prompt = "penguin flying in the sky"
    
    n_steps = 50 # デフォルト50
    high_noise_frac = 0.8
    
    image = base(
        prompt=prompt,
        num_inference_steps=n_steps,
        denoising_end=high_noise_frac,
        output_type="latent",
    ).images
    
    image = refiner(
        prompt=prompt,
        num_inference_steps=n_steps,
        denoising_start=high_noise_frac,
        image=image,
    ).images[0]
    
    image.save('output_refiner.png')
    image

    比較用の画像生成▼

    from PIL import Image, PngImagePlugin
    import io
    import base64
    
    prompt = "penguin flying in the sky"
    
    # Define how many steps and what % of steps to be run on each experts (80/20) here
    n_steps = 50 # デフォルト50
    high_noise_frac = 0.8
    
    base_image = base(
        prompt=prompt,
        num_inference_steps=n_steps,
    ).images[0]
    
    base_image.save('output_base.png')
    
    refiner_image = refiner(
        prompt=prompt,
        num_inference_steps=n_steps,
        # denoising_start=high_noise_frac,
        image=base_image,
    ).images[0]
    
    refiner_image.save('output_refiner.png')

    画像を並べるて表示▼

    import matplotlib.pyplot as plt
    import matplotlib.image as mpimg
    
    def combine_images_horizontally(image1, image2):
    
        fig, axes = plt.subplots(1, 2, figsize=(10, 5))
    
        plt.subplots_adjust(wspace=0)
    
        # 1つ目の画像を表示
        axes[0].imshow(image1)
        axes[0].axis('off')
        axes[0].set_title("base", fontsize=12, y=-0.1)
    
        # 2つ目の画像を表示
        axes[1].imshow(image2)
        axes[1].axis('off')
        axes[1].set_title("refiner", fontsize=12, y=-0.1)
    
        plt.show()
    
    image1 = base_image
    image2 = refiner_image
    combine_images_horizontally(image1, image2)

    参照

    あなたへのおすすめ