正方形の画像が必要だが、縦長の写真 ( 270 x 360px )しかなかった場合。
これを左右を描き足して正方形の画像にしたい。
runwayml/stable-diffusion-inpainting モデルを使って inpainting というか outpainting した結果の画像( 360 x 360px )。
えっと・・・もうこれは言われない限りは、AIで描き足されたことは全く気づかないレベル。
作動環境については過去のエントリーを参照ください。
処理の流れとしては以下の通りです。
この手のことは Photoshop 生成塗りつぶし を使えば簡単にできるだろう。 まあ、それはともかくやってみます。
元画像を加工して入力用画像と outpaint させるための領域を指定するマスク画像を用意します。
入力用画像 bread_input.png
正方形サイズの黒塗り画像を用意して中央に元画像を配置。
マスク画像 bread_input_mask.png
左右のマスク領域(白塗りした部分が)机と 24ピクセル 重なるように設定しています。
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)
描き足し処理を実行。
$ python main.py
結果の画像 result.png
ちょっと右下部分は違和感があります。 あとで調整します。
このようにちょうどの部分にマスク領域を設定した場合
マスク画像 bread_input_mask_2.png
こうなります。
境目に線が入ってしまいました。明らかにこれは失敗です。
では、5ピクセルだけ左右に机を含めるようにしたらどうか?
マスク画像 bread_input_mask_3.png
こうなりました。(大成功)
最初に試したときのマスク画像は 24ピクセル 机を含めるように設定していたのですが、 それを今回のように 5ピクセル だけ含めるようにしたマスク画像を使ったときのほうが違和感がない画像を生成できました。 ただし、シード固定はしていないので、偶然かもしれません。
実際に生成される画像サイズは 512 x 512px になります。 掲載の都合で、生成された画像はリサイズしています。
描き足された部分を満足いくまで何パターンも出したり、うまくいかなかった領域だけ再度マスク画像を作り直して実行したり、という繰り返し作業で絵をつくっていくとなれば Photoshop のように GUI で対話的に処理できないと厳しいです。
一方で、画像サイズの揃ったテスト画像の準備といったようなタスクで、品質はそこまで問わないが一括で大量に処理したい場合はこのやり方は威力を発揮しそうです。
Liked some of this entry? Buy me a coffee, please.