HuggingFace Diffusers 0.12 : ノートブック : Stable Conceptualizer – 学習済みコンセプトを使用した Stable Diffusion (翻訳/解説)
翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 03/02/2023 (v0.13.1)
* 本ページは、HuggingFace Diffusers の以下のドキュメントを翻訳した上で適宜、補足説明したものです:
- Stable Conceptualizer – Stable Diffusion using learned concepts
Stable Conceptualizer – Stable Diffusion using learned concepts (Colab)
* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。
- 人工知能研究開発支援
- 人工知能研修サービス(経営者層向けオンサイト研修)
- テクニカルコンサルティングサービス
- 実証実験(プロトタイプ構築)
- アプリケーションへの実装
- 人工知能研修サービス
- PoC(概念実証)を失敗させないための支援
- お住まいの地域に関係なく Web ブラウザからご参加頂けます。事前登録 が必要ですのでご注意ください。
◆ お問合せ : 本件に関するお問い合わせ先は下記までお願いいたします。
- 株式会社クラスキャット セールス・マーケティング本部 セールス・インフォメーション
- sales-info@classcat.com ; Web: www.classcat.com ; ClassCatJP
HuggingFace Diffusers 0.12 : ノートブック : Stable Conceptualizer – 学習済みコンセプトを使用した Stable Diffusion
Stable Conceptualizer (概念化器) は、🤗 Hugging Face 🧨 Diffusers library を使用して、textual-inversion による Stable Diffusion の事前学習済みコンセプトを使用することを可能にします。
事前学習済みコンセプトのライブラリ はこちらでナビゲートできます。Textual Inversion を使用してモデルに新しいコンセプトを教えるためには、このノートブック を使用してください。
初期セットアップ
必要なライブラリのインストール
#@title Install the required libs
!pip install -qq diffusers==0.11.1 transformers ftfy accelerate
Hugging Face ハブへのログイン
#@title Login to the Hugging Face Hub
from huggingface_hub import notebook_login
notebook_login()
Login successful Your token has been saved to /root/.huggingface/token
必要なライブラリのインポート
#@title Import required libraries
import os
import torch
import PIL
from PIL import Image
from diffusers import StableDiffusionPipeline
from transformers import CLIPFeatureExtractor, CLIPTextModel, CLIPTokenizer
def image_grid(imgs, rows, cols):
assert len(imgs) == rows*cols
w, h = imgs[0].size
grid = 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
(事前訓練済みの) 学習済みコンセプトを含む Stable Diffusion の実行
pretrained_model_name_or_path は使用したい Stable Diffusion チェックポイントです。これは埋め込みを訓練するために使用されたものと一致している必要があります。
#@markdown `pretrained_model_name_or_path` which Stable Diffusion checkpoint you want to use. This should match the one used for training the embeddings.
pretrained_model_name_or_path = "CompVis/stable-diffusion-v1-4" #@param {type:"string"}
貴方のコンセプトをここでロードする
好きなコンセプトの repo_id を入力します (公開 SD コンセプト・ライブラリ で事前学習済みのコンセプトを見つけられます) :
- repo_id_embeds : “sd-concepts-library/cat-toy”
(オプション) repo_id ではなく learned_embeds.bin ファイルを持つ場合は、embeds_url 変数に learned_embeds.bin へのパスを追加してください。
from IPython.display import Markdown
from huggingface_hub import hf_hub_download
#@title Load your concept here
#@markdown Enter the `repo_id` for a concept you like (you can find pre-learned concepts in the public [SD Concepts Library](https://huggingface.co/sd-concepts-library))
repo_id_embeds = "sd-concepts-library/cat-toy" #@param {type:"string"}
#@markdown (Optional) in case you have a `learned_embeds.bin` file and not a `repo_id`, add the path to `learned_embeds.bin` to the `embeds_url` variable
embeds_url = "" #Add the URL or path to a learned_embeds.bin file in case you have one
placeholder_token_string = "" #Add what is the token string in case you are uploading your own embed
downloaded_embedding_folder = "./downloaded_embedding"
if not os.path.exists(downloaded_embedding_folder):
os.mkdir(downloaded_embedding_folder)
if(not embeds_url):
embeds_path = hf_hub_download(repo_id=repo_id_embeds, filename="learned_embeds.bin")
token_path = hf_hub_download(repo_id=repo_id_embeds, filename="token_identifier.txt")
!cp $embeds_path $downloaded_embedding_folder
!cp $token_path $downloaded_embedding_folder
with open(f'{downloaded_embedding_folder}/token_identifier.txt', 'r') as file:
placeholder_token_string = file.read()
else:
!wget -q -O $downloaded_embedding_folder/learned_embeds.bin $embeds_url
learned_embeds_path = f"{downloaded_embedding_folder}/learned_embeds.bin"
display (Markdown("## The placeholder token for your concept is `%s`"%(placeholder_token_string)))
トークナイザーとテキストエンコーダのセットアップ
#@title Set up the Tokenizer and the Text Encoder
tokenizer = CLIPTokenizer.from_pretrained(
pretrained_model_name_or_path,
subfolder="tokenizer",
)
text_encoder = CLIPTextModel.from_pretrained(
pretrained_model_name_or_path, subfolder="text_encoder", torch_dtype=torch.float16
)
新たに学習された埋め込みを CLIP にロードする
#@title Load the newly learned embeddings into CLIP
def load_learned_embed_in_clip(learned_embeds_path, text_encoder, tokenizer, token=None):
loaded_learned_embeds = torch.load(learned_embeds_path, map_location="cpu")
# separate token and the embeds
trained_token = list(loaded_learned_embeds.keys())[0]
embeds = loaded_learned_embeds[trained_token]
# cast to dtype of text_encoder
dtype = text_encoder.get_input_embeddings().weight.dtype
embeds.to(dtype)
# add the token in tokenizer
token = token if token is not None else trained_token
num_added_tokens = tokenizer.add_tokens(token)
if num_added_tokens == 0:
raise ValueError(f"The tokenizer already contains the token {token}. Please pass a different `token` that is not already in the tokenizer.")
# resize the token embeddings
text_encoder.resize_token_embeddings(len(tokenizer))
# get the id for the token and assign the embeds
token_id = tokenizer.convert_tokens_to_ids(token)
text_encoder.get_input_embeddings().weight.data[token_id] = embeds
load_learned_embed_in_clip(learned_embeds_path, text_encoder, tokenizer)
Stable Diffusion パイプラインのロード
#@title Load the Stable Diffusion pipeline
pipe = StableDiffusionPipeline.from_pretrained(
pretrained_model_name_or_path,
torch_dtype=torch.float16,
text_encoder=text_encoder,
tokenizer=tokenizer,
).to("cuda")
Stable Diffusion パイプラインの実行
貴方のプロンプトでプレースホルダー・トークンを使用することを忘れないでください。
#@title Run the Stable Diffusion pipeline
#@markdown Don't forget to use the placeholder token in your prompt
prompt = "a grafitti in a favela wall with a <cat-toy> on it" #@param {type:"string"}
num_samples = 2 #@param {type:"number"}
num_rows = 2 #@param {type:"number"}
all_images = []
for _ in range(num_rows):
images = pipe(prompt, num_images_per_prompt=num_samples, num_inference_steps=50, guidance_scale=7.5).images
all_images.extend(images)
grid = image_grid(all_images, num_samples, num_rows)
grid
以上