Spaces:
Running
Running
| import gradio as gr | |
| from PIL import Image | |
| import torch | |
| from diffusers import StableDiffusionInpaintPipeline | |
| def expand_image(image): | |
| # 画像が256x256より大きい場合、表示用にリサイズ | |
| max_size = 256 # 最大表示サイズ | |
| width, height = image.size | |
| aspect_ratio = width / height # アスペクト比 | |
| # アスペクト比を維持しながらリサイズ | |
| if width > max_size or height > max_size: | |
| if width > height: | |
| # 横幅が大きい場合、幅をmax_sizeに合わせて高さを自動で調整 | |
| image = image.resize((max_size, int(max_size / aspect_ratio))) | |
| else: | |
| # 縦幅が大きい場合、高さをmax_sizeに合わせて幅を自動で調整 | |
| image = image.resize((int(max_size * aspect_ratio), max_size)) | |
| print(f'{image.size=}') # リサイズ後の画像サイズを確認 | |
| # 画像サイズ(幅)を2.5倍に拡張 | |
| new_width = int(width * 2.5) | |
| # 新しいキャンバスを白で作成し、元画像を中央に配置 | |
| new_image = Image.new("RGB", (new_width, height), (0, 0, 0)) # 黒背景 | |
| new_image.paste(image, ((new_width - width) // 2, 0)) # 元画像を中央に配置 | |
| # マスク画像を作成(変更する部分を白、変更しない部分を黒) | |
| mask = Image.new("L", (new_width, height), 255) # 変更する部分を白 | |
| mask.paste(0, ((new_width - width) // 2, 0, (new_width + width) // 2, height)) # 元画像部分を黒 (変更しない部分) | |
| model_id = "runwayml/stable-diffusion-inpainting"# Stable Diffusion Inpainting パイプラインの準備 | |
| pipe = StableDiffusionInpaintPipeline.from_pretrained(model_id, torch_dtype=torch.float32, use_safetensors=False) | |
| pipe.to("cpu") # huggingface は GPUが使えないのでCPUに変更 | |
| prompt = "retain the original image, Extend the current image by adding the most probable realistic elements based on the original content" | |
| negative_prompt = "repeating, tiling, nsfw, nudity, sexual, violence, explicit, harmful" | |
| # Inpainting 処理を実行 | |
| output = pipe(prompt=prompt, negative_prompt=negative_prompt, image=new_image, mask_image=mask).images[0] | |
| return output # 画像をリサイズ後、結果とともに返す | |
| # Gradioインターフェースの作成 | |
| iface = gr.Interface( | |
| fn=expand_image, | |
| inputs=gr.Image(type="pil"), | |
| outputs=gr.Image(), | |
| title="画像拡張ツール", | |
| description="入力画像の幅を2.5倍に拡張します。 WIP yet" | |
| ) | |
| iface.launch() | |