Waifu Diffusionのimg2imgを使って絵を描くテスト
Waifu Diffusion v1.3のimage to image(画像とテキストから画像を出力する機能)を使って絵を描くのを試してみた。結果はこんな感じ(サムネにするためには一番上に結果を貼らないといけないのだ……)
https://scrapbox.io/files/63686936173c14001fa9e49a.png
まずは雑にラフを描いた。Waifu Diffusionで全身を描くのは厳しいので顔だけにした。
https://scrapbox.io/files/63686491c07145001d4ec65f.jpg
strength=0.8でimage to imageを行うと以下のようになる。プロンプトは 1girl, solo, face, purble hair, green eyes, maid, maid headdress, frills, apron, brooch みたいな感じだったと思う。ガチャの試行回数を増やすためにstep数は20程度にした。
https://scrapbox.io/files/6368657676b41c00210b0ef1.pnghttps://scrapbox.io/files/636865979966c0001d13f993.png
元のキャラクターの雰囲気が全然残っていないのでstrength=0.6にした。
https://scrapbox.io/files/6368662a487b63001d2a5eaa.pnghttps://scrapbox.io/files/6368662ea2442d0022d13148.png
何回かガチャを引いた中で良かったものを選び、手動で消えたブローチの追加・黄色いリボンの追加・目の修正などを行った。
https://scrapbox.io/files/6368667e9bdb00001f1929db.pnghttps://scrapbox.io/files/636866a093a3ff001d16fc3f.jpg
これを元に再びimage to imageガチャを引いた(プロンプトは 1girl, solo, face, maid, maid headdress, frills, ahoge, bangs 。目や髪の色を指定すると勝手に色を変えられてしまうため、色情報を含まないようにした)一番良かったものを選び、トレスで線画を書き起こしてベタ塗りした(目はかなり書き直した)(見返してみると前のステップのほうが可愛い気がする……)
https://scrapbox.io/files/636867f59bdb00001f194f57.pnghttps://scrapbox.io/files/6368686dbb961500232f28bb.jpg
これを元にさらにimage to imageガチャを引いた。プロンプトは masterpiece, 1girl, solo, face, maid, maid headdress, frills, apron, brooch である。ブローチが消えるのを防ぐために brooch を追加した。これは仕上げなのでstep数を多めの60にした。strengthは0.55にした。strengthが0.5以下だと入力画像とほぼ同じものが出てきてしまうが、それより大きいと入力画像とかなり違うものが出てくるので調整が難しい。
https://scrapbox.io/files/636868cbc07145001d4f0eed.pnghttps://scrapbox.io/files/636868ed99d3b7001fd06dc3.pnghttps://scrapbox.io/files/63686901665b59001db7abae.png
https://scrapbox.io/files/6368690a9bdb00001f19685b.pnghttps://scrapbox.io/files/6368692651c379001d3add16.pnghttps://scrapbox.io/files/63686936173c14001fa9e49a.png
色指定はそこそこ守ってくれるようだが、同じキャラクターとは思えないほど顔にバラつきがある。現状のWaifu Diffusionを特定のキャラクターを描くための補助として使うのは難しそうだという結論になった。
最後に今回使ったimage to imageのコードを示す。
code:python
import torch
from diffusers import StableDiffusionPipeline, StableDiffusionImg2ImgPipeline
from datetime import datetime
import random
import numpy as np
import json
import os
from PIL import Image, PngImagePlugin
# HuggingFaceのトークン
HF_TOKEN = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
# StableDiffusionパイプライン設定
pipe = StableDiffusionImg2ImgPipeline.from_pretrained("hakurei/waifu-diffusion",
use_auth_token=HF_TOKEN)
# safety checker を無効にする
def null_safety(images, **kwargs):
return images, False
# 再現性のためにシードを固定する
seed = random.randint(0, 10000)
init_img = Image.open("init.jpg")
while True:
# CPUを利用するように設定
generator = torch.Generator("cpu").manual_seed(seed)
pipe.safety_checker = null_safety
# プロンプトの入力
prompt = f"masterpiece, 1girl, solo, face, maid, maid headdress, frills, apron, brooch"
negative = "monochrome, comic, bad anatomy, bad hands, lowres, blurry, cropped, jpeg artifacts, low quality, text, signature, chibi, pablo picaso"
# 画像生成
steps = 60
image = pipe(prompt, init_image=init_img, negative_prompt=negative, generator=generator, num_inference_steps=steps, strength=0.55).images0 # 現在の時刻を文字列として取得
date = datetime.now().strftime("%Y%m%d_%H%M%S")
filename = f"image_{date}_{seed}_step_{steps}.png"
# 画像を保存
image.save(filename)
info = PngImagePlugin.PngInfo()
info.add_text("text", f"prompt: \"{prompt}\", negative: \"{negative}\", seed: {seed}, steps: {steps}")
img = Image.open(filename)
img.save(filename, "PNG", pnginfo=info)
print(filename)
print("seed:", seed, "steps:", steps)
print(prompt)
seed = random.randint(0, 10000)