以下のスクリプトは、stable-diffusion-webui-reForegeまたは1111のAPIを使用して、画像を生成しローカルに保存するものです。
目次
全体のコード
import requests
import json
import os
import io
import base64
from pydantic import BaseModel, Field
from PIL import Image, PngImagePlugin
from datetime import datetime, timezone, timedelta
# 日本標準時
JST = timezone(timedelta(hours=9))
# APIエンドポイント
SD_SERVER_URL = "http://127.0.0.1:7860" # LAN内のサーバーURLに変更してください
# 入力データを管理するクラス
class ImageGenerationParams(BaseModel):
prompt: str = Field(..., example="1girl", description="生成したい画像のプロンプト")
negative_prompt: str = Field(
"worst quality", example="worst quality", description="否定プロンプト"
)
steps: int = Field(25, example=25, description="生成ステップ数")
cfg_scale: float = Field(7.0, example=7.0, description="CFGスケールの値")
width: int = Field(512, example=512, description="生成画像の幅")
height: int = Field(512, example=512, description="生成画像の高さ")
sampler_index: str = Field(
"Euler a", example="Euler a", description="サンプラーの種類"
)
batch_count: int = Field(1, example=1, description="バッチ生成の数")
batch_size: int = Field(1, example=1, description="1バッチあたりの画像数")
enable_hr: bool = Field(
False, description="高解像度リサイズモードを有効にするかどうか"
)
denoising_strength: float = Field(
0.4, example=0.4, description="高解像度リサイズ時のノイズ低減強度"
)
hr_scale: float = Field(1.5, example=1.5, description="高解像度リサイズのスケール")
hr_steps: int = Field(
15, example=15, description="高解像度リサイズ時の追加ステップ数"
)
hr_upscaler: str = Field(
"R-ESRGAN 4x+ Anime6B", example="R-ESRGAN 4x+ Anime6B", description="高解像度リサイズのアップスケーラー"
)
def text_to_image(params: ImageGenerationParams, output_dir: str, unique_id: str):
"""
Stable Diffusion API (txt2img) を使用して画像を生成し、PNGとして保存する。
Args:
params: ImageGenerationParamsオブジェクト(画像生成パラメータを含む)
output_dir: 出力先ディレクトリ
unique_id: ファイル名に使用する一意の識別子
"""
# APIへのリクエストペイロード
payload = {
"prompt": params.prompt,
"negative_prompt": params.negative_prompt,
"steps": params.steps,
"cfg_scale": params.cfg_scale,
"width": params.width,
"height": params.height,
"sampler_index": params.sampler_index,
"batch_count": params.batch_count,
"batch_size": params.batch_size,
"enable_hr": params.enable_hr,
"denoising_strength": params.denoising_strength,
"hr_scale": params.hr_scale,
"hr_upscaler": params.hr_upscaler,
"hr_second_pass_steps": params.hr_steps,
}
headers = {"Content-type": "application/json"}
url = f"{SD_SERVER_URL}/sdapi/v1/txt2img"
# APIリクエスト送信
response = requests.post(url, json=payload, headers=headers, timeout=300)
response.raise_for_status()
# レスポンス処理
result = response.json()
meta = json.loads(result["info"])["infotexts"][0]
# 出力ディレクトリの作成
os.makedirs(output_dir, exist_ok=True)
# 画像の保存
for i, image_data in enumerate(result["images"]):
image = Image.open(io.BytesIO(base64.b64decode(image_data.split(",", 1)[0])))
pnginfo = PngImagePlugin.PngInfo()
pnginfo.add_text("parameters", meta)
now = datetime.now(JST).strftime("%Y%m%d%H%M%S")
file_path = os.path.join(output_dir, f"{now}_{unique_id}_{i+1}.png")
print(f"Saving image to {file_path}")
image.save(file_path, pnginfo=pnginfo)
使用例
以下は、このスクリプトを使った画像生成の例です。
# 生成パラメータの設定
params = ImageGenerationParams(
prompt="a futuristic cityscape",
negative_prompt="low quality, blurry",
steps=50,
cfg_scale=7.5,
width=512,
height=512,
sampler_index="Euler a",
batch_count=1,
batch_size=1,
enable_hr=True,
denoising_strength=0.4,
hr_scale=2.0,
hr_steps=20,
hr_upscaler="R-ESRGAN 4x+ Anime6B",
)
# 出力ディレクトリと一意の識別子
output_dir = "./generated_images"
unique_id = "cityscape"
# 画像生成
text_to_image(params, output_dir, unique_id)
まとめ
このスクリプトは、Stable Diffusion APIを利用して画像を生成し、保存するためのシンプルで実用的なスニペットです。ImageGenerationParams
クラスでパラメータを管理し、柔軟性を持たせています。
カスタマイズ可能な部分が明確で、さまざまな利用シーンに対応できるよう設計されています。ぜひ活用してみてください!