sdxs-2b / generate.py
recoilme's picture
shift6
89a0dfc
Raw
History Blame Contribute Delete
3.56 kB
"""
SDXS-2B image generation from prompts.txt.
Usage:
python generate.py # generates from prompts.txt
python generate.py --prompts my_list.txt # custom file
python generate.py --prompt "your text" # single prompt
"""
import argparse
import os
import sys
import math
import textwrap
import torch
import numpy as np
from pipeline_sdxs import SdxsPipeline
NEGATIVE_PROMPT = (
"low quality, bad quality, blurry, sketch, sepia, text, "
"bad anatomy, bad proportions, bad hands, missing fingers, child drawing"
)
DEFAULT_PROMPTS_FILE = "prompts.txt"
MEDIA_DIR = "media"
def main():
parser = argparse.ArgumentParser(description="SDXS-2B generation")
parser.add_argument("--prompts", type=str, default=None, help="prompts file")
parser.add_argument("--prompt", type=str, default=None, help="single prompt")
parser.add_argument("--steps", type=int, default=40)
parser.add_argument("--guidance", type=float, default=4.0)
parser.add_argument("--seed", type=int, default=0)
parser.add_argument("--width", type=int, default=832)
parser.add_argument("--height", type=int, default=1152)
parser.add_argument("--output", type=str, default=None,
help="output dir for individual images (optional)")
args = parser.parse_args()
# collect prompts
if args.prompt:
prompts = [args.prompt]
elif args.prompts:
with open(args.prompts) as f:
prompts = [l.strip() for l in f if l.strip()]
else:
with open(DEFAULT_PROMPTS_FILE) as f:
prompts = [l.strip() for l in f if l.strip()]
if not prompts:
print("No prompts found")
return
# load pipeline
pipe = SdxsPipeline.from_pretrained(
os.path.dirname(os.path.abspath(__file__)),
torch_dtype=torch.bfloat16,
trust_remote_code=True,
).to("cuda:0")
images = []
for i, prompt in enumerate(prompts):
print(f"[{i+1}/{len(prompts)}] {prompt[:80]}...")
image = pipe(
prompt=prompt,
negative_prompt=NEGATIVE_PROMPT,
guidance_scale=args.guidance,
width=args.width,
height=args.height,
seed=args.seed,
num_inference_steps=args.steps,
show_progress_bar=False,
)[0][0]
images.append(image)
if args.output:
os.makedirs(args.output, exist_ok=True)
path = os.path.join(args.output, f"{i+1:03d}.jpg")
image.save(path, quality=95)
print(f" saved {path}")
# save grid
os.makedirs(MEDIA_DIR, exist_ok=True)
grid_path = os.path.join(MEDIA_DIR, "result_grid.jpg")
import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
cols = min(4, len(images))
rows = math.ceil(len(images) / cols)
fig, axes = plt.subplots(rows, cols, figsize=(cols * 4, rows * 4.5), constrained_layout=True)
axes = list(np.array(axes).flatten())[:len(images)]
for i, (img, prompt) in enumerate(zip(images, prompts)):
ax = axes[i]
ax.imshow(img)
ax.axis("off")
ax.set_aspect("equal")
text = (prompt[:200] + "…") if len(prompt) > 200 else prompt
lines = textwrap.wrap(text, width=35)
while len(lines) < 4:
lines.append("")
ax.set_title("\n".join(lines), fontsize=9, pad=8)
plt.savefig(grid_path, bbox_inches="tight", dpi=150, format="jpeg")
print(f"grid -> {grid_path}")
if __name__ == "__main__":
main()