チラシ裏日記上等!!新館

Webアプリケーションエンジニアの雑記帳。映画とかアニメとかの記事も書きます。

Google ColaboratoryでStable Defussionを試す

ブログのアイキャッチ画像用にStable Diffusionを動かしたことを以前の記事で書いた。

www.chirashiura.com

Google Colaboratoryで動かしたコードは以下。Google Colaboratoryは課金してProにしている。ひょっとしたら無料枠だと動かないかも?

ライブラリのインストール。

pip install diffusers==0.15.0 transformers==4.28.1 ftfy accelerate

画像出力のコード。

import datetime
import torch
from diffusers import StableDiffusionPipeline

# model id
# https://huggingface.co/andite/anything-v4.0
model_id = "andite/anything-v4.0"
device = "cuda"

# prompt
prompt = "cute, cat ear, maid, write diary, in the room, sitting chair, masterpiece, best quality, white hair, 1girl"
n_prompt = "bad anatomy, long_neck, long_body, longbody, deformed mutated disfigured, missing arms, extra_arms, mutated hands, extra_legs, bad hands, poorly_drawn_hands, malformed_hands, missing_limb, floating_limbs, disconnected_limbs, extra_fingers, bad fingers, liquid fingers, poorly drawn fingers, missing fingers, extra digit, fewer digits, ugly face, deformed eyes, partial face, partial head, bad face, inaccurate limb, cropped"
# create pipeline
pipe = StableDiffusionPipeline.from_pretrained(model_id)

# ignore safety_checker
def null_safety(images, **kwargs):
    return images, False
pipe.safety_checker = null_safety

pipe = pipe.to(device)

# execute pipeline
images = pipe(prompt, negative_prompt=n_prompt, height=720, width=1280, num_images_per_prompt=2).images

# save images
for index, image in enumerate(images):
  dt_now = datetime.datetime.now()
  image.save('image_{index}_{date}.png'.format(index=index, date=dt_now.strftime('%Y%m%d_%H%M%S')))

notebook上で画像を表示するコード。

参考にした記事。

gammasoft.jp

特に問題のなさそうなプロンプトを指定してもNSFWな画像を表示させないためのsafety_checkerが動いてしまうので関数を上書きしている。

def null_safety(images, **kwargs):
    return images, False
pipe.safety_checker = null_safety

self-development.info

ちなみにこの画像生成のスクリプトは出力時間はだいたい5分程度。それなりに強いGPUを使っていると思うけどそれなりにかかる。それでも自分で書くよりは圧倒的に早いわけだけど。

from torchvision.transforms import functional, ToPILImage
from torchvision.utils import make_grid

ncols = 3

grid = make_grid([functional.pil_to_tensor(img) for img in images], 
                 padding=0, 
                 nrow=ncols, 
                 pad_value=254
                 )

ToPILImage()(grid)

使っているモデルはanything-v4.0。

huggingface.co

改めてAI作画の凄さを実感している。NovelAIで出力するのも興味深かったが、実際にモデルを選んでコードを書いて出力すると、より描いている感がでる(個人的には)。自分で工夫してコードを書いてその結果出力されるものなら創作性が有るんじゃないかろうか。これもまぁちょっと詭弁めいているけども。究極的にはモデルも自分で用意できるとなお良いが、流石にColaboratoryだと難しいかもしれない。

次はLoRAあたりを試してみたい。