0
3

More than 1 year has passed since last update.

diffusersを使った画像生成備忘録(自分用)12/16

Last updated at Posted at 2022-12-16

注意
この記事の元になったスクリプトはローカル環境で動かすことを前提に書かれているためHuggingFaceを使用する場合のスクリプトはTokenが必要になる場合があります。
pythonをembeddable packageで使用しています。使用法については記事内で明記していませんのでご自身で調べてください。

実装環境

OS:windows 11
CPU:i7 9世代
RAM:32GB
GPU:RTX 2070 sp(VRAM:8GB)

Pyhton:3.10.x embeddable package 64bit
pipで導入されているもの

  • Diffusers
  • PyTorch
  • Transformers
  • OmegaConf

diffusionモデルの読み込み

Load.py
from diffusers import DiffusionPipeline

# ローカルでdiffusersモデルを使用する場合:フォルダまでのパス
# Hugging Face公開モデルを使用する場合:Hugging Faceのパス
model_id


#モデルロード:通常精度
ldm = DiffusionPipeline.from_pretrained(model_id)

#モデルロード:精度半分(細部の表現には向かない:例)人の顔とか)
#float32 -> float16
ldm = DiffusionPipeline.from_pretrained(
                                    model_id,
                                    revision="fp16",
                                    torch_dtype=torch.float16)

画像生成時にGPUを使用

GPUを使用するためpythorchをGPUに対応させなければならない

導入方法

GPU使用を使用するように設定する

OnGpu.py
import torch
ldm # モデルを読み込んだ変数
ldm = ldm.to("cuda")

画像生成(保存まで)

必須の引数のみにすればデフォルトの設定で画像が設定される

FormImg.py
ldm # モデルを読み込んだ変数
images = ldm(
            [str], # 生成したい画像のテキスト(プロンプト):必須
            negative_prompt = [str], # 生成したい画像から除外したいテキスト(ネガティブプロンプト)
            num_inference_steps = int, #ノイズ除去のステップ数デフォルトだと50  
            eta = float, #サンプリング? (0.0 は決定論的サンプリング)
            guidance_scale = float,#呪文に従う度合い (7〜11程度)
            height = img_h, # 生成画像の高さ
            width = img_w, # 生成画像の幅
            )["images"]

# 画像を複数枚生成することができるのでforで回す
for image in enumerate(images):
    filePath # 保存箇所へのパスとファイル名(デフォルト:png)
    image.save(filePath)

引数で画像の生成枚数を増やすことができるがVRAMを多く使用するため
おすすめしない

multiple.py
count # 一つのプロンプトから生成する画像の枚数
ldm([str] * count)["images"]

NSFW制限突破

基本的にNSFW(エッッやグロなど)な画像が生成されないように規制が入っている。
NSFWな画像を見たい場合は下のスクリプトを組み込む

UnSafety.py
# すべての画像をNSFWではないと返す関数
def null_safety(images, **kwargs):
    return images, False

ldm # モデルを読み込んだ変数
ldm.safety_checker = null_safety # NSFWチェックする関数を何もしない自作関数に変更

プロンプトをモデルのCLIPを使用してトークンに切り分ける

参考サイト

PromptToTokens.py
from transformers import CLIPTokenizer

# ローカルモデルを使用する場合
modelid # 画像生成用ローカルモデルのパス
tokenizer = CLIPTokenizer.from_pretrained(model_id + "/tokenizer") 

# Hugging Face公開モデルを使用する場合
modelid # Hugging Faceに公開されているCLIPのモデルパス
tokenizer = CLIPTokenizer.from_pretrained(model_id) 

prompt # トークンに分けたい呪文
tokens = tokenizer.tokenize(prompt) # 一文の呪文をトークンに切り分ける

tokenizer.model_max_length # モデルで定義されている読み込まれるトークンの最大数
#^^最大数を超えたトークンは除外される^^#

トークンの最後にがついている場合単語として認識されている。
なにも付いていない場合そのあとのトークンと組み合わされて単語と認識される可能性がある。

Ckpt To DiffusersModel

ネットで公開されているStable Diffusion系のモデルはckptというファイルにまとめられている。しかしダウンロードしただけではDiffusersで使うことはできないのでこの章で展開する方法を記入します。
ここでは変換方法だけを書くのでckptファイルは自身で探してください。
注意
 NovelAIモデルを探す際はウィルスの混入に注意してください
 AnythingV3モデルがありますがものによってはウィルスを検出するようです。

ローカルPCでローカル向けに展開する方法

参考サイト

0
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
3