興味を持ってググっていると新しいキーワードが次々と出てきますね。
今回は Easy Negative とやらを調べてみます。
どうやら、ネガティブプロンプトをいい感じに簡略化してくれるらしいです。
この情報も Web UI ばかりでてきます。
果たして diffusers ではどうやって使うのでしょうか?
Easy Negative とは?
ネガティブプロンプトをいい感じに簡略化してくれるものらしいです。
EasyNegative
とネガティブプロンプトに入れるだけで効果があるらしいです。
diffusers でどうやって使うんだろう?
pipe.load_textual_inversion()
ググっているとこの辺を使いそうではあります。
しかし、色々な使い方が引っかかりますね...
pipe.load_textual_inversion( "sayakpaul/EasyNegative-test", weight_name="EasyNegative.safetensors", token="EasyNegative" )
!wget https://huggingface.co/datasets/gsdf/EasyNegative/resolve/main/EasyNegative.safetensors pipe.load_textual_inversion( ".", weight_name="EasyNegative.safetensors", token="EasyNegative" )
pipe.load_textual_inversion( "embed/negative", weight_name="EasyNegativeV2.safetensors", token="EasyNegative" )
なんとなく、 インスタンス上にダウンロードするパターン と
Hugging Face 上のモデル名を利用するパターン がありそうです。
このリファレンス を見ると、
第一引数は pretrained_model_name_or_path
になっているので、
やはり「インスタンス上のパス」or「Hugging Face 上のモデル名」なのかな?と思います。
weight_name
はファイル名かファイルパスでしょうか?
token
はネガティブプロンプトに使う名前っぽいですね。
その他 Hugging Face 上には以下にもあるみたいです。
(むしろこちらが公式でしょうか?)
sayakpaul/EasyNegative-test
に関しては無くなっていそうです。
とりあえず使ってみよう
まずは Easy Negative 無し
とりあえず上記の記事のプロンプトを使って、
ネガティブプロンプトは無しの画像を1個出力してみましょう。
シードは適当に固定してみます。
import os from datetime import datetime from zoneinfo import ZoneInfo # ディレクトリを作成する (存在していてもエラーにはしない) os.makedirs('outputs', exist_ok=True) # Asia/Tokyo タイムゾーンの現在時刻 now = datetime.now(tz=ZoneInfo("Asia/Tokyo")); formattedNow = now.strftime("%Y%m%d%H%M%S") # プロンプト prompt = "1girl, school uniform, ponytail, silver hair, wallpaper, landscape, depth of field, night, light particles, light rays, sidelighting, ****, open jacket, skirt" negative_prompt = "" # 画像を生成 generator = torch.Generator().manual_seed(123456789) print(f"Seed: {generator.initial_seed()}") image = pipe( prompt, negative_prompt=negative_prompt, generator=generator, width=768, height=512, ).images[0] image
Easy Negative を使ってみる
from diffusers import StableDiffusionPipeline import torch pipe = StableDiffusionPipeline.from_pretrained( "Meina/MeinaMix_V11", torch_dtype=torch.float16, ).to("cuda") + pipe.load_textual_inversion( + "embed/negative", + weight_name="EasyNegativeV2.safetensors", + token="EasyNegative" + )
import os from datetime import datetime from zoneinfo import ZoneInfo # ディレクトリを作成する (存在していてもエラーにはしない) os.makedirs('outputs', exist_ok=True) # Asia/Tokyo タイムゾーンの現在時刻 now = datetime.now(tz=ZoneInfo("Asia/Tokyo")); formattedNow = now.strftime("%Y%m%d%H%M%S") # プロンプト prompt = "1girl, school uniform, ponytail, silver hair, wallpaper, landscape, depth of field, night, light particles, light rays, sidelighting, ****, open jacket, skirt" - negative_prompt = "" + negative_prompt = "EasyNegative" # 画像を生成 generator = torch.Generator().manual_seed(123456789) print(f"Seed: {generator.initial_seed()}") image = pipe( prompt, negative_prompt=negative_prompt, generator=generator, width=768, height=512, ).images[0] image
元々高品質な画像が生成されるモデルということでしょうか?
構図が変わってしまったのでよくわからないですね!
でも、動きましたね!
パイプラインの準備が上手くできたということでしょうか!?
色々試してみる
gsdf/EasyNegative の EasyNegative.safetensors
pipe.load_textual_inversion( "gsdf/EasyNegative", weight_name="EasyNegative.safetensors", token="EasyNegative" ) => HTTPError: 401 Client Error: Unauthorized for url: https://huggingface.co/gsdf/EasyNegative/resolve/main/EasyNegative.safetensors
HF_TOKEN が必要なやつってことでしょうか?
gsdf/Counterfeit-V3.0 の EasyNegativeV2.safetensors
pipe.load_textual_inversion( "gsdf/Counterfeit-V3.0", weight_name="embedding/EasyNegativeV2.safetensors", token="EasyNegative" )
こちらは上手くいきましたね。
というか SHA256 が embed/negative
と一緒なので、全く一緒の物なのでしょうね。
stabilityai/stable-diffusion-2-1
ではエラー
モデルを Meina/MeinaMix_V11
ではなく stabilityai/stable-diffusion-2-1
にしたら以下のエラーとなりました。
runwayml/stable-diffusion-v1-5
では OK
runwayml/stable-diffusion-v1-5
では EasyNegative を用いたパイプラインの準備が出来たところを見ると
EasyNegativeV2 は Stable Diffusion 1.5 系統でしか使えない感じでしょうかね?
一番差がわかりやすいかも?
まとめ
diffusers で EasyNegative を使うときは load_textual_inversion()
を使うみたいです!