以前のエントリーControlNet を使ってざっくり手描きした絵から期待する画像をつくる を書いたのですが、Diffusers ライブラリを使えば、Web UIではなく、コマンドラインから python コードを実行する形で、 画像を作り出すことができることがわかりました。
詳細は、以下のページをご覧ください。
この機能を使えば、このような変換が可能です。
元にした画像:
この画像にプラスして「photogenic, a cup of coffee」というプロンプトを与えた結果できた画像:
Linux(Ubuntu) + GPU です。詳細は以下の通り。
$ nvidia-smi
Thu Jun 28 06:22:25 2023
+---------------------------------------------------------------------------------------+
| NVIDIA-SMI 530.30.02 Driver Version: 530.30.02 CUDA Version: 12.1 |
|-----------------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|=========================================+======================+======================|
| 0 NVIDIA GeForce RTX 3060 On | 00000000:01:00.0 Off | N/A |
| 36% 28C P8 13W / 170W| 1MiB / 12288MiB | 0% Default |
| | | N/A |
+-----------------------------------------+----------------------+----------------------+
$ nvcc --version
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2023 NVIDIA Corporation
Built on Mon_Apr__3_17:16:06_PDT_2023
Cuda compilation tools, release 12.1, V12.1.105
Build cuda_12.1.r12.1/compiler.32688072_0
$ python3 -m venv diffusers
$ source diffusers/bin/activate
(diffusers) $ pip install diffusers transformers ftfy accelerate
どのバージョンが入ったか確認します。
(diffusers) $ pip list
Package Version
------------------------ ----------
accelerate 0.20.3
certifi 2023.5.7
charset-normalizer 3.1.0
cmake 3.26.4
diffusers 0.17.1
filelock 3.12.2
fsspec 2023.6.0
ftfy 6.1.1
huggingface-hub 0.15.1
idna 3.4
importlib-metadata 6.7.0
Jinja2 3.1.2
lit 16.0.6
MarkupSafe 2.1.3
mpmath 1.3.0
networkx 3.1
numpy 1.25.0
nvidia-cublas-cu11 11.10.3.66
nvidia-cuda-cupti-cu11 11.7.101
nvidia-cuda-nvrtc-cu11 11.7.99
nvidia-cuda-runtime-cu11 11.7.99
nvidia-cudnn-cu11 8.5.0.96
nvidia-cufft-cu11 10.9.0.58
nvidia-curand-cu11 10.2.10.91
nvidia-cusolver-cu11 11.4.0.1
nvidia-cusparse-cu11 11.7.4.91
nvidia-nccl-cu11 2.14.3
nvidia-nvtx-cu11 11.7.91
packaging 23.1
Pillow 10.0.0
pip 22.0.2
psutil 5.9.5
PyYAML 6.0
regex 2023.6.3
requests 2.31.0
safetensors 0.3.1
setuptools 59.6.0
sympy 1.12
tokenizers 0.13.3
torch 2.0.1
tqdm 4.65.0
transformers 4.30.2
triton 2.0.0
typing_extensions 4.7.0
urllib3 2.0.3
wcwidth 0.2.6
wheel 0.40.0
zipp 3.15.0
main.py
import torch
import requests
from PIL import Image
from io import BytesIO
from diffusers import StableDiffusionControlNetPipeline, ControlNetModel
def load_image(image_file_path):
with open(image_file_path, "rb") as f:
image = Image.open(f).convert("RGB")
return image
device = "cuda"
model_id = "runwayml/stable-diffusion-v1-5"
seed = 42
input_image = "a-coffee-cup.png"
prompt = "photogenic, a cup of coffee"
output_image = "a-photogenic-coffee-cup.png"
controlnet = ControlNetModel.from_pretrained(
"lllyasviel/sd-controlnet-scribble",
torch_dtype=torch.float16)
pipe = StableDiffusionControlNetPipeline.from_pretrained(
model_id,
controlnet=controlnet,
torch_dtype=torch.float16).to(device)
init_image = load_image(input_image)
#init_image.thumbnail((768, 768))
generator = torch.Generator(device).manual_seed(seed)
image = pipe(
prompt=prompt,
image=init_image,
guidance_scale=7.5,
generator=generator).images[0]
image.save(output_image)
今回使用した元画像は 768x768 ちょうどのサイズにリサイズ済みだったため init_image.thumbnail((768, 768)) 部分はコメントアウトしています。
実際に使用した元画像はこちら: a-coffee-cup_768x768.png
結果の画像:
実際は 768x768 のサイズですが、ここでは 320x320 に縮小しています。
その他いくつかのプロンプトで試してみます。
プロンプト: plain background, a hand drawing coffee cup art.
手描き感のある絵になりました。
プロンプト: a hand drawing white coffee cup on the woody grain table.
あまり手描き感がなくなってしまった。 ただし背景の机がプロンプト通りに木目調になりました。
プロンプト: an orange coffee cup on the beach.
確かに浜辺っぽい砂の背景になりました。
手描きでざっくり描いたものからテキスト(プロンプト)で仕上げていく。 PowerPoint 的なアプリとの相性が良さそう。 マイクロソフト製品でいえば Surface Pro / Go などは元々ペン対応しているので、 その上で、手描きしたイラストをそれなりの見た目に即座に仕上げていく・・・という未来が来そう。