Home About
Stable Diffusion , AI Image Generation

StableDiffusion + ControlNet その2 手描きの線画から画像を生成する

以前のエントリーControlNet を使ってざっくり手描きした絵から期待する画像をつくる を書いたのですが、Diffusers ライブラリを使えば、Web UIではなく、コマンドラインから python コードを実行する形で、 画像を作り出すことができることがわかりました。 その結果を備忘録として書き残します。

a coffee cup

詳細は、以下のページをご覧ください。

具体例

この機能を使えば、このような変換が可能です。

元にした画像:

a coffee cup

この画像にプラスして「photogenic, a cup of coffee」というプロンプトを与えた結果できた画像:

a photogenic coffee cup

実行環境

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

venv 環境を用意して必要なモジュールをインストール

$ 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

結果の画像:

a photogenic coffee cup

実際は 768x768 のサイズですが、ここでは 320x320 に縮小しています。

その他いくつかのプロンプトで試してみます。

プロンプト: plain background, a hand drawing coffee cup art.

a coffee cup

手描き感のある絵になりました。

プロンプト: a hand drawing white coffee cup on the woody grain table.

a coffee cup on the woody grain table

あまり手描き感がなくなってしまった。 ただし背景の机がプロンプト通りに木目調になりました。

プロンプト: an orange coffee cup on the beach.

a coffee cup on the beach

確かに浜辺っぽい砂の背景になりました。

まとめ

手描きでざっくり描いたものからテキスト(プロンプト)で仕上げていく。 PowerPoint 的なアプリとの相性が良さそう。 マイクロソフト製品でいえば Surface Pro / Go などは元々ペン対応しているので、 その上で、手描きしたイラストをそれなりの見た目に即座に仕上げていく・・・という未来が来そう。

Liked some of this entry? Buy me a coffee, please.