Home About
Stable Diffusion , Diffusers

Stable Diffusion で足りない背景を描き足す

正方形の画像が必要だが、縦長の写真 ( 270 x 360px )しかなかった場合。

bread

これを左右を描き足して正方形の画像にしたい。

runwayml/stable-diffusion-inpainting モデルを使って inpainting というか outpainting した結果の画像( 360 x 360px )。

bread

えっと・・・もうこれは言われない限りは、AIで描き足されたことは全く気づかないレベル。

Stable Diffusion Inpainting / Outpainting

作動環境については過去のエントリーを参照ください。

概要

処理の流れとしては以下の通りです。

overview

この手のことは Photoshop 生成塗りつぶし を使えば簡単にできるだろう。 まあ、それはともかくやってみます。

Step 1

元画像を加工して入力用画像と outpaint させるための領域を指定するマスク画像を用意します。

入力用画像 bread_input.png

正方形サイズの黒塗り画像を用意して中央に元画像を配置。

bread input

マスク画像 bread_input_mask.png

bread input mask

左右のマスク領域(白塗りした部分が)机と 24ピクセル 重なるように設定しています。

Step 2

Inpaint / Outpaint するためのコード。

詳細はこちら: https://huggingface.co/docs/diffusers/using-diffusers/inpaint

main.py

import requests
import torch
from PIL import Image
from io import BytesIO
from diffusers import StableDiffusionInpaintPipeline

def load_image(image_file_path):
    with open(image_file_path, "rb") as f:
        image = Image.open(f).convert("RGB")
    return image

pipeline = StableDiffusionInpaintPipeline.from_pretrained(
    "runwayml/stable-diffusion-inpainting",
    torch_dtype=torch.float16,
)
pipeline = pipeline.to("cuda")

init_image = load_image("bread_input.png")
mask_image = load_image("bread_input_mask.png")

prompt = "photorealistic"
image = pipeline(prompt=prompt, image=init_image, mask_image=mask_image).images[0]

output_image_file = "result.png"
image.save(output_image_file)

Step 3

描き足し処理を実行。

$ python main.py

結果の画像 result.png

bread result

ちょっと右下部分は違和感があります。 あとで調整します。

マスクする部分に机をどれくらい含めるとよいのか

このようにちょうどの部分にマスク領域を設定した場合

マスク画像 bread_input_mask_2.png

bread input mask 2

こうなります。

bread result 2

境目に線が入ってしまいました。明らかにこれは失敗です。

では、5ピクセルだけ左右に机を含めるようにしたらどうか?

マスク画像 bread_input_mask_3.png

bread input mask 3

こうなりました。(大成功)

bread result 3

最初に試したときのマスク画像は 24ピクセル 机を含めるように設定していたのですが、 それを今回のように 5ピクセル だけ含めるようにしたマスク画像を使ったときのほうが違和感がない画像を生成できました。 ただし、シード固定はしていないので、偶然かもしれません。

実際に生成される画像サイズは 512 x 512px になります。 掲載の都合で、生成された画像はリサイズしています。

まとめ

描き足された部分を満足いくまで何パターンも出したり、うまくいかなかった領域だけ再度マスク画像を作り直して実行したり、という繰り返し作業で絵をつくっていくとなれば Photoshop のように GUI で対話的に処理できないと厳しいです。

一方で、画像サイズの揃ったテスト画像の準備といったようなタスクで、品質はそこまで問わないが一括で大量に処理したい場合はこのやり方は威力を発揮しそうです。

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