【Stable Diffusion】DiffusersでLoRAを使ってAIイラストを生成するやり方を紹介!【Colab無料枠】

こんにちは!悠です!

 

今回は下の記事の続きで、「Diffusers」でLoRAを使ってAIイラストを生成する方法に関してまとめていきます。

【Stable Diffusion】Diffusersを使ってColab無料枠でAIイラストを生成する方法【2023年】
無料版のGoogle Colaboratoryでも、規約違反することなく「Stable Diffusion」でAIイラストを生成できる「Diffusers」の使い方についてまとめた記事です。

 

まだご覧になっていない方は、必ず先にこちらを読んでいただいた後に、この記事の内容を試してみてください。

それでは早速いってみましょう!今回もコピペだけで簡単にできます!

 

アイキャッチ画像はモデルに「AbyssOrangeMix3」、LoRAに「flat2」を使用しています。
スポンサーリンク
スポンサーリンク

「Diffusers」でLoRAを使う方法

この方法は、下記の記事を参考にさせていただきました。

diffusers で Lora (safetensors) を読み込んで生成する方法 - Qiita
はじめにこれはhuggingface/diffusersモジュールを利用して画像生成する際に、safetensors の lora を読み込む方法です。Civitai 等で公開されている Lora は safetensors フ...

 

まず1つ目のセルには今まで通り下記のコードを入力します。

#stable diffusionのインストール
!pip install --upgrade diffusers[torch] transformers

 

2つ目のセルでGoogle Driveのマウントを行います。Google Drive内に保存したLoRAを読み込んでDiffusersで使えるようにするんですね。

from google.colab import drive
drive.mount('/content/drive')

 

3つ目のセルでLoRAを読み込む際に使用する「load_safetensors_lora」という関数を定義します。

この部分は参考文献として紹介した記事の内容を、100%そのまま使わせていただきました。リンク先の「モジュール」という部分です。

これを私のブログに載せるわけにはいかないので、実際にリンク先に飛んでコピペしてください。

 

ただ、一番最初に!pip install safetensorsを付ける必要があるので、ここだけ注意してください。

!pip install safetensors

import torch
from safetensors.torch import load_file

def load_safetensors_lora(pipeline, checkpoint_path, LORA_PREFIX_UNET="lora_unet", LORA_PREFIX_TEXT_ENCODER="lora_te", alpha=0.75):

#########################################################
この先は参考文献のモジュールの欄をそのままコピペしてください。
#########################################################

 

4つ目のセルで使用するモデルやVAE、LoRAを定義します。

from diffusers import StableDiffusionPipeline, EulerDiscreteScheduler
from diffusers.models import AutoencoderKL
import torch

#画像生成に使うモデルデータ
model_id = "AIARTCHAN/MIX-Pro-V4"
#画像生成に使うVAE
vae = AutoencoderKL.from_pretrained("stabilityai/sd-vae-ft-ema")
#画像生成に使うスケジューラー
scheduler = EulerDiscreteScheduler.from_pretrained(model_id, subfolder="scheduler")

pipe = StableDiffusionPipeline.from_pretrained(model_id, scheduler=scheduler, vae=vae, custom_pipeline="lpw_stable_diffusion")

#LoRAを読み込む
pipe = load_safetensors_lora(pipe, '/content/drive/MyDrive/StableDiffusion/Lora/flat2.safetensors',alpha=1.0) 

pipe = pipe.to("cuda")

#NSFW規制を無効化する
if pipe.safety_checker is not None:
  pipe.safety_checker = lambda images, **kwargs: (images, False)

 

今回は適用するだけで、手軽にディティールを向上させることができる最強のLoRA「flat2」を使います。

pipe = load_safetensors_lora(pipe, '/content/drive/MyDrive/StableDiffusion/Lora/flat2.safetensors',alpha=1.0)

 

上記の関数内に、Drive内に保存してあるLoRAファイルのパスを入力してください。

またalphaの部分はLoRAの比重です。お好みで設定してください。

 

なお試していませんが、LyCORIS(LoConやLoHa)は使えないと思います。あれは専用の拡張機能がないとWebUIでも使用不可ですしね。

【Stable Diffusion】LyCORIS(LoHa・LoCon)をWebUIで使用する方法を紹介!【LoRA亜種】
「Stable Diffusion」で使用できるLoRAの亜種、「LyCORIS(LoHa・LoCon)」をWebUIで使う方法についてまとめた記事です。

 

5番目(最後)のセルは以前の記事と全く同じです。

import datetime
import os

#txt2img出力画像の保存先
!mkdir -p /content/txt2img_output

# ファイル名に使う日付と時刻のフォーマットを定義する
file_format = "%Y%m%d_%H%M%S"
i=0

#ポジティブプロンプト
prompt = "masterpiece,1girl,school uniform, miniskirt, yellow hair" 
#ネガティブプロンプト
n_prompt = "(worst quality,low quality:1.4),(monochrome,greyscale:1.4),nude,nsfw" 
#生成枚数
num_images = 3
#出力画像を保存するフォルダ
save_path = "/content/txt2img_output"
#seed値
seed=1234

while i < int(num_images):
  #画像を生成

  #seed固定 
  #generator = torch.Generator(device='cuda').manual_seed(seed)
  #image = pipe(prompt, negative_prompt=n_prompt, width=768, height=512, generator=generator, guidance_scale=7, num_inference_steps=20).images[0]

  #seed=-1(ランダム)の場合
  image = pipe(prompt, negative_prompt=n_prompt, width=768, height=512, guidance_scale=7, num_inference_steps=20).images[0]

  #出力する画像の名前を生成する
  image_name = datetime.datetime.now().strftime(file_format) + f".png"

  #画像を保存する
  save_location = os.path.join(save_path, image_name)
  image.save(save_location)
  i = i + 1

 

これで準備は完了なので、上から順番にセルを実行していってください。

 

参考までにLoRA「flat2」を適用して生成した画像を貼っておきます。

モデルには「MIX-Pro-V4」を使用しており、プロンプトは次の通りです。

【Positive】
masterpiece,1girl,school uniform, miniskirt, yellow hair
【Negative】
(worst quality,low quality:1.4),(monochrome,greyscale:1.4),nude,nsfw

 



複数のLoRAを使う方法

コメント欄で、複数のLoRAを「Diffusers」で使用する方法に関して教えていただきました。

下記の記事にコードを反映しております!

 

【Stable Diffusion】Diffusersを使ってColab無料枠でAIイラストを生成する方法【2023年】
無料版のGoogle Colaboratoryでも、規約違反することなく「Stable Diffusion」でAIイラストを生成できる「Diffusers」の使い方についてまとめた記事です。

 

まとめ

以上が「Diffusers」で、LoRAを使ってAIイラストを生成する方法についての紹介でした。

WebUIに比べて制限があったりや何かと不自由な部分も多いですが、Colabで使っても規制やBANリスクはないので気軽に試してみることができますよ!

 

では、ここまで読んでいただきありがとうございました。

コメント

  1. 名無し より:

    > Hugging Faceからダウンロードできるものしか使うことができません。Civitaiのモデルデータは使用不可だと思います

    変換スクリプトがdiffusersに用意されているので、safetensors形式とかのモデルも簡単に使えますよ!

    • 悠 より:

      コメントありがとうございます!

      本当ですか!!Civitaiのモデルを使えたらかなり初心者の方におすすめできるようになりますね!
      変換スクリプトを探して、なるべく早く記事にしてまとめていきます!!

      【追記】やり方がわかりましたので、さっそく明日記事化いたします!

  2. 名無し より:

    自分で作ったLoraを読み込ませると
    RuntimeError: mat2 must be a matrix
    というエラーが出るのですがなぜでしょうか
    解決策はありますか?

    • 悠 より:

      コメントありがとうございます!

      LoraではなくLycoris(locon、loha)だったりはしませんでしょうか?

      • 名無し より:

        Kohya LoRA Dreamboothで作ったLoraです
        色んな動画で作り方があるのでそれを見て作ったのですがもしかしてLoraではないんですか?

        • 悠 より:

          花札マークからLoRAを選択する画面に行って、各LoRAの右上に表示されるiマークを押すと詳細が見れます。

          その中に「ss_network_module」という部分があると思うんですが、そこにnetworks.loraと表示されていればloraです。lycoris.kohyaならlycorisです。

          ただnetwork loraであったとしても、ss_network_argsに “conv_dim”: “1”,”conv_alpha”: “1”みたいな設定があったらそれはLoConらしいです。

          どうなっていますでしょうか?

          • 名無し より:

            lycoris.kohyaと表示されていました
            networks.loraじゃないと読み込まれないんですね
            ありがとうございました

  3. 匿名 より:

    Diffusersでは、複数のLoRAを併用することはできるのでしょうか。

    • 悠 より:

      コメントありがとうございます!

      できるかできないかで言えば、断言はできませんがおそらくできると思います。
      ただ「どうやればできるのか」に関しては現在も試行錯誤中です。申し訳ございません…

      • 匿名 より:

        なるほど…併用は少し難しそうですね…丁寧にありがとうございます。

        • 匿名 より:

          こちらを参考に環境を構築させて頂きました。
          >#LoRAを読み込む
          >pipe = load_safetensors_lora(pipe, ‘/content/drive/MyDrive/StableDiffusion/Lora/flat2.safetensors’,alpha=1.0)

          再度load_safetensors_lora()をコールし、同様にpipeと使用したいLoRAのパス、alphaを指定したら適用されたようです。
          良い感じにlayerに追加してくれてるのかもしれません。

          UIに関しては、
          #LoRA_2を読み込む
          LoRA_USE_2= True #@param {type:”boolean”}
          if LoRA_USE_2== True:
          LoRA_2=””#@param {type:”string”}
          LoRA_alpha_2 = -1#@param {type:”number”}
          pipe = load_safetensors_lora(pipe, LoRA_2, alpha=LoRA_alpha_2)
          等で単純に読み込みの数の追加はしてはいけるかと思います。
          これだと数が多くなると煩雑になりますが…

          3個以上は試せていません。
          物によっては掛け合わせるとalpha値を調節しないと推奨値でも崩れるかもしれません。

          • 悠 より:

            コメントありがとうございます!複数のLoraを適用出来るとは!!

            非常に有益すぎる情報です!!明日早速試して、記事内に反映させていただきます!!

          • 匿名 より:

            追記です。
            崩れる物は、EulerDiscreteScheduler以外も試してください。