HuggingFace Diffusers 0.4 : ノートブック : Stable Diffusion のインペインティング・パイプライン

HuggingFace Diffusers 0.4 : ノートブック : Stable Diffusion のインペインティング・パイプライン (翻訳/解説)

翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 10/12/2022 (v0.4.1)

* 本ページは、HuggingFace Diffusers の以下のドキュメントを翻訳した上で適宜、補足説明したものです:

* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。

 

クラスキャット 人工知能 研究開発支援サービス

クラスキャット は人工知能・テレワークに関する各種サービスを提供しています。お気軽にご相談ください :

◆ 人工知能とビジネスをテーマに WEB セミナーを定期的に開催しています。スケジュール
  • お住まいの地域に関係なく Web ブラウザからご参加頂けます。事前登録 が必要ですのでご注意ください。

お問合せ : 本件に関するお問い合わせ先は下記までお願いいたします。

  • 株式会社クラスキャット セールス・マーケティング本部 セールス・インフォメーション
  • sales-info@classcat.com  ;  Web: www.classcat.com  ;   ClassCatJP

 

 

HuggingFace Diffusers 0.4 : ノートブック : Stable Diffusion のインペインティング・パイプライン

このノートブックは、🤗 Hugging Face 🧨 Diffusers ライブラリ を使用して Stable Diffusion モデルによるテキスト-guided インペインティングに対するカスタム diffusers パイプラインを作成する方法を示します。

Stable Diffusion モデルへの一般的なイントロダクションについては こちら を参照してください。

This example is contributed by nagolinc!

!pip install -qq -U diffusers==0.3.0 transformers ftfy
!pip install -qq "ipywidgets>=7,<8"

重みをダウンロードまたは使用する前に、モデルライセンスを承認する必要もあります。この記事ではモデルのバージョン v1-4 を使用しますので、そのカード にアクセスし、ライセンスを読んで、同意するならばチェックボックスをチェックする必要があります。

貴方は 🤗 Hugging Face ハブで登録ユーザである必要があり、コードを動作させるにはアクセストークンを使用する必要もあります。アクセストークンの詳細は、ドキュメントのこのセクション を参照してください。

from huggingface_hub import notebook_login

notebook_login()
import inspect
from typing import List, Optional, Union

import numpy as np
import torch

import PIL
from diffusers import StableDiffusionInpaintPipeline
device = "cuda"
model_path = "CompVis/stable-diffusion-v1-4"

pipe = StableDiffusionInpaintPipeline.from_pretrained(
    model_path,
    revision="fp16", 
    torch_dtype=torch.float16,
    use_auth_token=True
).to(device)
import requests
from io import BytesIO

def image_grid(imgs, rows, cols):
    assert len(imgs) == rows*cols

    w, h = imgs[0].size
    grid = PIL.Image.new('RGB', size=(cols*w, rows*h))
    grid_w, grid_h = grid.size
    
    for i, img in enumerate(imgs):
        grid.paste(img, box=(i%cols*w, i//cols*h))
    return grid


def download_image(url):
    response = requests.get(url)
    return PIL.Image.open(BytesIO(response.content)).convert("RGB")

img_url = "https://raw.githubusercontent.com/CompVis/latent-diffusion/main/data/inpainting_examples/overture-creations-5sI6fQgYIuo.png"
mask_url = "https://raw.githubusercontent.com/CompVis/latent-diffusion/main/data/inpainting_examples/overture-creations-5sI6fQgYIuo_mask.png"
init_image = download_image(img_url).resize((512, 512))
init_image

mask_image = download_image(mask_url).resize((512, 512))
mask_image

from torch import autocast
def inpaint(p, init_image, mask_image=None, strength=0.75, guidance_scale=7.5, generator=None, num_samples=1, n_iter=1):
    all_images = []
    for _ in range(n_iter):
        with autocast("cuda"):
            images = pipe(
                prompt=[p] * num_samples,
                init_image=init_image,
                mask_image=mask_image,
                strength=strength,
                guidance_scale=guidance_scale,
                generator=generator,
            ).images
        all_images.extend(images)
    return all_images
p = "a cat sitting on a bench"
strength=.75
guidance_scale=7.5
num_samples = 3
n_iter = 1

generator = torch.Generator(device="cuda").manual_seed(0) # change the seed to get different results
all_images = inpaint(p, init_image, mask_image, strength=strength, guidance_scale=guidance_scale, generator=generator, num_samples=num_samples, n_iter=n_iter)
# insert initial image in the list so we can compare side by side
all_images.insert(0, init_image)
image_grid(all_images, n_iter, num_samples + 1)

 

以上