AI絵師に自分の似顔絵を描いてもらう
こんにちはみなさん
ツイッターとかで自分の画像を貼るときに、大体の写真の移りが悪くて上げにくいなと思ったことがあるんじゃないかと、というか自分で思いました。
これが似顔絵とかだったらまだいいのですが、絵をかいてもらう人もいないし、自分の絵心のなさでは似顔絵がとんでもないことになってしまう可能性がありますというかなります。
しかし、以前に上げた記事においてローカルに降臨したAI絵師君は、画像から新しい画像を作るという技も持っているとのこと。
これなら、自分の写真からイイ感じに崩した似顔絵を作ってくれるんじゃないかなって思ったわけです。
まあ、やりやすい人とそうではない人もいそう。
img2img
前回の記事で、ローカルに突っ込んだdiffuserですが、じつはテキストから絵を作る機能だけでなく、絵から新しい絵を作る機能も持っています。
どちらかというと、初期画像をこちらが指定することができるって感じで、promptに呪文を入れることには変わらんみたいです。
なので、環境構築は前回の記事に回し、今回は似顔絵つくりに専念します。
パイプの作成
前回はStableDiffusionPipeline
を使いましたが、今回はStableDiffusionImg2ImgPipeline
を使います。
import torch
import os
import subprocess
from torch import autocast
from diffusers import StableDiffusionImg2ImgPipeline
from PIL import Image
import numpy as np
# Original
model_id = "CompVis/stable-diffusion-v1-4"
branch_name= "fp16"
device = "cuda"
pipe = StableDiffusionImg2ImgPipeline.from_pretrained(model_id, revision=branch_name, torch_dtype=torch.float16)
pipe = pipe.to(device)
次に、写真を用意しましょう。
写真を用意する
私は適当にスマホで撮りました。
写真ですが、顔面を入れて (32n X 32m)のサイズにしましょう。n, mは整数で、要は縦横が32の倍数のピクセル数じゃないとだめらしいです。
こうしてできたファイルを取り込みましょう。
prompt = "style of baki, mascule, winner"
init_img = Image.open("./inputs/face_samples/watashi.JPG")
init_img = init_img.convert('RGB')
私は写真を用意する時点で加工しちゃったのですが、init_imgを取り込んでからリサイズすることもあり見たいです。ありですが、比率がどうなるかわからないので、やめました。
画像をRGBにコンバートしていますが、特にPNGのような透過設定みたいのがあると次元が増えちゃってダメみたいです。
promptには画像を改変する方向性を与えるためのパラメータを渡します。
promptに願望が含まれている?まあ、いいんですよ。
似顔絵を作ってもらう
最後にAIに写真を渡して似顔絵を描いてもらいましょう。
with autocast(device):
image = pipe([prompt]*1, image=init_img, guidance_scale=7.5, strength=0.75).images[0]
outpath = './outputs/fromface/'
i = len(os.listdir(outpath)) + 1
image.save(f'{outpath}{i:04}.png')
一点を除いて前回と大体同じです。
違うのはstrength
というパラメータの有無です。
このパラメータは超重要で、この値がでかいほど原形をとどめない改変が行われがちです。私の場合は0.75で問題なかったのですが、他の人でやると0.65でも原型がわからなくなります。
うまくいかない場合はこのパラメータをちょっとずつ動かしてみましょう。
何はともあれ似顔絵を作ってもらいましょう。
上はあまり原型に近いとは思えないのですが、下側はなんとなく自分の今の顔面に近いかなって思います。
まとめ
というわけで、AI絵師を使って自分の似顔絵を作ってみました。
AI絵師については界隈が騒いでいるようですが、私からして見りゃいい感じに自分で絵を用意できるので、便利でいいんじゃない?っていう認識ですね。
今回はこんなところです。
Discussion