imaginAIry/imaginairy/cmds.py

200 lines
5.3 KiB
Python
Raw Normal View History

import logging.config
2022-09-09 05:22:55 +00:00
import click
2022-09-11 20:58:14 +00:00
from imaginairy import LazyLoadingImage
2022-09-11 07:35:57 +00:00
from imaginairy.api import load_model
from imaginairy.samplers.base import SAMPLER_TYPE_OPTIONS
from imaginairy.suppress_logs import suppress_annoying_logs_and_warnings
logger = logging.getLogger(__name__)
def configure_logging(level="INFO"):
fmt = "%(message)s"
if level == "DEBUG":
fmt = "%(asctime)s [%(levelname)s] %(name)s:%(lineno)d: %(message)s"
2022-09-09 05:22:55 +00:00
LOGGING_CONFIG = {
"version": 1,
"disable_existing_loggers": True,
"formatters": {
"standard": {"format": fmt},
},
"handlers": {
"default": {
"level": "INFO",
"formatter": "standard",
"class": "logging.StreamHandler",
"stream": "ext://sys.stdout", # Default is stderr
},
},
"loggers": {
"": { # root logger
"handlers": ["default"],
"level": "WARNING",
"propagate": False,
},
"imaginairy": {"handlers": ["default"], "level": level, "propagate": False},
"transformers.modeling_utils": {
"handlers": ["default"],
"level": "ERROR",
"propagate": False,
},
},
}
logging.config.dictConfig(LOGGING_CONFIG)
2022-09-09 05:22:55 +00:00
@click.command()
@click.argument("prompt_texts", nargs=-1)
@click.option(
"--prompt-strength",
default=7.5,
show_default=True,
help="How closely to follow the prompt. Image looks unnatural at higher values",
)
@click.option(
"--init-image",
help="Starting image. filepath or url",
)
@click.option(
"--init-image-strength",
default=0.6,
show_default=True,
help="Starting image.",
)
2022-09-09 05:22:55 +00:00
@click.option("--outdir", default="./outputs", help="where to write results to")
@click.option(
"-r",
"--repeats",
default=1,
type=int,
help="How many times to repeat the renders. If you provide two prompts and --repeat=3 then six images will be generated",
)
2022-09-09 05:22:55 +00:00
@click.option(
"-h",
"--height",
default=512,
type=int,
help="image height. should be multiple of 64",
)
@click.option(
"-w", "--width", default=512, type=int, help="image width. should be multiple of 64"
)
@click.option(
"--steps",
default=40,
2022-09-09 05:22:55 +00:00
type=int,
show_default=True,
2022-09-09 05:22:55 +00:00
help="How many diffusion steps to run. More steps, more detail, but with diminishing returns",
)
@click.option(
"--seed",
default=None,
type=int,
help="What seed to use for randomness. Allows reproducible image renders",
)
@click.option("--upscale", is_flag=True)
@click.option(
"--upscale-method", default="realesrgan", type=click.Choice(["realesrgan"])
)
@click.option("--fix-faces", is_flag=True)
@click.option("--fix-faces-method", default="gfpgan", type=click.Choice(["gfpgan"]))
@click.option(
"--sampler-type",
default="plms",
type=click.Choice(SAMPLER_TYPE_OPTIONS),
help="What sampling strategy to use",
)
2022-09-09 05:22:55 +00:00
@click.option("--ddim-eta", default=0.0, type=float)
@click.option(
"--log-level",
default="INFO",
type=click.Choice(["DEBUG", "INFO", "WARNING", "ERROR"]),
help="What level of logs to show.",
)
@click.option(
"--show-work",
default=["none"],
type=click.Choice(["none", "images", "video"]),
multiple=True,
help="Make a video showing the image being created",
)
@click.option(
"--tile",
is_flag=True,
help="Any images rendered will be tileable. Unfortunately cannot be controlled at the per-image level yet",
)
2022-09-09 05:22:55 +00:00
def imagine_cmd(
prompt_texts,
prompt_strength,
init_image,
init_image_strength,
2022-09-09 05:22:55 +00:00
outdir,
repeats,
height,
width,
steps,
seed,
upscale,
upscale_method,
fix_faces,
fix_faces_method,
2022-09-09 05:22:55 +00:00
sampler_type,
ddim_eta,
log_level,
show_work,
tile,
2022-09-09 05:22:55 +00:00
):
"""Render an image"""
suppress_annoying_logs_and_warnings()
configure_logging(log_level)
2022-09-11 07:35:57 +00:00
from imaginairy.api import imagine_image_files
from imaginairy.schema import ImaginePrompt
total_image_count = len(prompt_texts) * repeats
logger.info(
f"🤖🧠 imaginAIry received {len(prompt_texts)} prompt(s) and will repeat them {repeats} times to create {total_image_count} images."
)
2022-09-15 14:55:09 +00:00
if init_image and sampler_type != "ddim":
sampler_type = "ddim"
logger.info(" Sampler type switched to ddim for img2img")
if init_image and init_image.startswith("http"):
init_image = LazyLoadingImage(url=init_image)
2022-09-09 05:22:55 +00:00
prompts = []
load_model(tile_mode=tile)
2022-09-09 05:22:55 +00:00
for _ in range(repeats):
for prompt_text in prompt_texts:
2022-09-09 05:22:55 +00:00
prompt = ImaginePrompt(
prompt_text,
prompt_strength=prompt_strength,
init_image=init_image,
init_image_strength=init_image_strength,
2022-09-09 05:22:55 +00:00
seed=seed,
sampler_type=sampler_type,
steps=steps,
height=height,
width=width,
upscale=upscale,
fix_faces=fix_faces,
2022-09-09 05:22:55 +00:00
)
prompts.append(prompt)
imagine_image_files(
2022-09-09 05:22:55 +00:00
prompts,
outdir=outdir,
ddim_eta=ddim_eta,
record_step_images="images" in show_work,
tile_mode=tile,
output_file_extension="png",
2022-09-09 05:22:55 +00:00
)
if __name__ == "__main__":
imagine_cmd() # noqa