mirror of
https://github.com/invoke-ai/InvokeAI
synced 2024-08-30 20:32:17 +00:00
380 lines
11 KiB
Python
380 lines
11 KiB
Python
# Copyright 2023 Lincoln D. Stein and the InvokeAI Team
|
|
|
|
import argparse
|
|
import shlex
|
|
from argparse import ArgumentParser
|
|
|
|
# note that this includes both old sampler names and new scheduler names
|
|
# in order to be able to parse both 2.0 and 3.0-pre-nodes versions of invokeai.init
|
|
SAMPLER_CHOICES = [
|
|
"ddim",
|
|
"ddpm",
|
|
"deis",
|
|
"lms",
|
|
"lms_k",
|
|
"pndm",
|
|
"heun",
|
|
"heun_k",
|
|
"euler",
|
|
"euler_k",
|
|
"euler_a",
|
|
"kdpm_2",
|
|
"kdpm_2_a",
|
|
"dpmpp_2s",
|
|
"dpmpp_2s_k",
|
|
"dpmpp_2m",
|
|
"dpmpp_2m_k",
|
|
"dpmpp_2m_sde",
|
|
"dpmpp_2m_sde_k",
|
|
"dpmpp_sde",
|
|
"dpmpp_sde_k",
|
|
"unipc",
|
|
"k_dpm_2_a",
|
|
"k_dpm_2",
|
|
"k_dpmpp_2_a",
|
|
"k_dpmpp_2",
|
|
"k_euler_a",
|
|
"k_euler",
|
|
"k_heun",
|
|
"k_lms",
|
|
"plms",
|
|
"lcm",
|
|
]
|
|
|
|
PRECISION_CHOICES = [
|
|
"auto",
|
|
"float32",
|
|
"autocast",
|
|
"float16",
|
|
]
|
|
|
|
|
|
class FileArgumentParser(ArgumentParser):
|
|
"""
|
|
Supports reading defaults from an init file.
|
|
"""
|
|
|
|
def convert_arg_line_to_args(self, arg_line):
|
|
return shlex.split(arg_line, comments=True)
|
|
|
|
|
|
legacy_parser = FileArgumentParser(
|
|
description="""
|
|
Generate images using Stable Diffusion.
|
|
Use --web to launch the web interface.
|
|
Use --from_file to load prompts from a file path or standard input ("-").
|
|
Otherwise you will be dropped into an interactive command prompt (type -h for help.)
|
|
Other command-line arguments are defaults that can usually be overridden
|
|
prompt the command prompt.
|
|
""",
|
|
fromfile_prefix_chars="@",
|
|
)
|
|
general_group = legacy_parser.add_argument_group("General")
|
|
model_group = legacy_parser.add_argument_group("Model selection")
|
|
file_group = legacy_parser.add_argument_group("Input/output")
|
|
web_server_group = legacy_parser.add_argument_group("Web server")
|
|
render_group = legacy_parser.add_argument_group("Rendering")
|
|
postprocessing_group = legacy_parser.add_argument_group("Postprocessing")
|
|
deprecated_group = legacy_parser.add_argument_group("Deprecated options")
|
|
|
|
deprecated_group.add_argument("--laion400m")
|
|
deprecated_group.add_argument("--weights") # deprecated
|
|
general_group.add_argument("--version", "-V", action="store_true", help="Print InvokeAI version number")
|
|
model_group.add_argument(
|
|
"--root_dir",
|
|
default=None,
|
|
help='Path to directory containing "models", "outputs" and "configs". If not present will read from environment variable INVOKEAI_ROOT. Defaults to ~/invokeai.',
|
|
)
|
|
model_group.add_argument(
|
|
"--config",
|
|
"-c",
|
|
"-config",
|
|
dest="conf",
|
|
default="./configs/models.yaml",
|
|
help="Path to configuration file for alternate models.",
|
|
)
|
|
model_group.add_argument(
|
|
"--model",
|
|
help='Indicates which diffusion model to load (defaults to "default" stanza in configs/models.yaml)',
|
|
)
|
|
model_group.add_argument(
|
|
"--weight_dirs",
|
|
nargs="+",
|
|
type=str,
|
|
help="List of one or more directories that will be auto-scanned for new model weights to import",
|
|
)
|
|
model_group.add_argument(
|
|
"--png_compression",
|
|
"-z",
|
|
type=int,
|
|
default=6,
|
|
choices=range(0, 9),
|
|
dest="png_compression",
|
|
help="level of PNG compression, from 0 (none) to 9 (maximum). Default is 6.",
|
|
)
|
|
model_group.add_argument(
|
|
"-F",
|
|
"--full_precision",
|
|
dest="full_precision",
|
|
action="store_true",
|
|
help="Deprecated way to set --precision=float32",
|
|
)
|
|
model_group.add_argument(
|
|
"--max_loaded_models",
|
|
dest="max_loaded_models",
|
|
type=int,
|
|
default=2,
|
|
help="Maximum number of models to keep in memory for fast switching, including the one in GPU",
|
|
)
|
|
model_group.add_argument(
|
|
"--free_gpu_mem",
|
|
dest="free_gpu_mem",
|
|
action="store_true",
|
|
help="Force free gpu memory before final decoding",
|
|
)
|
|
model_group.add_argument(
|
|
"--sequential_guidance",
|
|
dest="sequential_guidance",
|
|
action="store_true",
|
|
help="Calculate guidance in serial instead of in parallel, lowering memory requirement " "at the expense of speed",
|
|
)
|
|
model_group.add_argument(
|
|
"--xformers",
|
|
action=argparse.BooleanOptionalAction,
|
|
default=True,
|
|
help="Enable/disable xformers support (default enabled if installed)",
|
|
)
|
|
model_group.add_argument(
|
|
"--always_use_cpu", dest="always_use_cpu", action="store_true", help="Force use of CPU even if GPU is available"
|
|
)
|
|
model_group.add_argument(
|
|
"--precision",
|
|
dest="precision",
|
|
type=str,
|
|
choices=PRECISION_CHOICES,
|
|
metavar="PRECISION",
|
|
help=f'Set model precision. Defaults to auto selected based on device. Options: {", ".join(PRECISION_CHOICES)}',
|
|
default="auto",
|
|
)
|
|
model_group.add_argument(
|
|
"--ckpt_convert",
|
|
action=argparse.BooleanOptionalAction,
|
|
dest="ckpt_convert",
|
|
default=True,
|
|
help="Deprecated option. Legacy ckpt files are now always converted to diffusers when loaded.",
|
|
)
|
|
model_group.add_argument(
|
|
"--internet",
|
|
action=argparse.BooleanOptionalAction,
|
|
dest="internet_available",
|
|
default=True,
|
|
help="Indicate whether internet is available for just-in-time model downloading (default: probe automatically).",
|
|
)
|
|
model_group.add_argument(
|
|
"--nsfw_checker",
|
|
"--safety_checker",
|
|
action=argparse.BooleanOptionalAction,
|
|
dest="safety_checker",
|
|
default=False,
|
|
help="Check for and blur potentially NSFW images. Use --no-nsfw_checker to disable.",
|
|
)
|
|
model_group.add_argument(
|
|
"--autoimport",
|
|
default=None,
|
|
type=str,
|
|
help="Check the indicated directory for .ckpt/.safetensors weights files at startup and import directly",
|
|
)
|
|
model_group.add_argument(
|
|
"--autoconvert",
|
|
default=None,
|
|
type=str,
|
|
help="Check the indicated directory for .ckpt/.safetensors weights files at startup and import as optimized diffuser models",
|
|
)
|
|
model_group.add_argument(
|
|
"--patchmatch",
|
|
action=argparse.BooleanOptionalAction,
|
|
default=True,
|
|
help="Load the patchmatch extension for outpainting. Use --no-patchmatch to disable.",
|
|
)
|
|
file_group.add_argument(
|
|
"--from_file",
|
|
dest="infile",
|
|
type=str,
|
|
help="If specified, load prompts from this file",
|
|
)
|
|
file_group.add_argument(
|
|
"--outdir",
|
|
"-o",
|
|
type=str,
|
|
help="Directory to save generated images and a log of prompts and seeds. Default: ROOTDIR/outputs",
|
|
default="outputs",
|
|
)
|
|
file_group.add_argument(
|
|
"--prompt_as_dir",
|
|
"-p",
|
|
action="store_true",
|
|
help="Place images in subdirectories named after the prompt.",
|
|
)
|
|
render_group.add_argument(
|
|
"--fnformat",
|
|
default="{prefix}.{seed}.png",
|
|
type=str,
|
|
help="Overwrite the filename format. You can use any argument as wildcard enclosed in curly braces. Default is {prefix}.{seed}.png",
|
|
)
|
|
render_group.add_argument("-s", "--steps", type=int, default=50, help="Number of steps")
|
|
render_group.add_argument(
|
|
"-W",
|
|
"--width",
|
|
type=int,
|
|
help="Image width, multiple of 64",
|
|
)
|
|
render_group.add_argument(
|
|
"-H",
|
|
"--height",
|
|
type=int,
|
|
help="Image height, multiple of 64",
|
|
)
|
|
render_group.add_argument(
|
|
"-C",
|
|
"--cfg_scale",
|
|
default=7.5,
|
|
type=float,
|
|
help='Classifier free guidance (CFG) scale - higher numbers cause generator to "try" harder.',
|
|
)
|
|
render_group.add_argument(
|
|
"--sampler",
|
|
"-A",
|
|
"-m",
|
|
dest="sampler_name",
|
|
type=str,
|
|
choices=SAMPLER_CHOICES,
|
|
metavar="SAMPLER_NAME",
|
|
help=f'Set the default sampler. Supported samplers: {", ".join(SAMPLER_CHOICES)}',
|
|
default="k_lms",
|
|
)
|
|
render_group.add_argument(
|
|
"--log_tokenization", "-t", action="store_true", help="shows how the prompt is split into tokens"
|
|
)
|
|
render_group.add_argument(
|
|
"-f",
|
|
"--strength",
|
|
type=float,
|
|
help="img2img strength for noising/unnoising. 0.0 preserves image exactly, 1.0 replaces it completely",
|
|
)
|
|
render_group.add_argument(
|
|
"-T",
|
|
"-fit",
|
|
"--fit",
|
|
action=argparse.BooleanOptionalAction,
|
|
help="If specified, will resize the input image to fit within the dimensions of width x height (512x512 default)",
|
|
)
|
|
|
|
render_group.add_argument("--grid", "-g", action=argparse.BooleanOptionalAction, help="generate a grid")
|
|
render_group.add_argument(
|
|
"--embedding_directory",
|
|
"--embedding_path",
|
|
dest="embedding_path",
|
|
default="embeddings",
|
|
type=str,
|
|
help="Path to a directory containing .bin and/or .pt files, or a single .bin/.pt file. You may use subdirectories. (default is ROOTDIR/embeddings)",
|
|
)
|
|
render_group.add_argument(
|
|
"--lora_directory",
|
|
dest="lora_path",
|
|
default="loras",
|
|
type=str,
|
|
help="Path to a directory containing LoRA files; subdirectories are not supported. (default is ROOTDIR/loras)",
|
|
)
|
|
render_group.add_argument(
|
|
"--embeddings",
|
|
action=argparse.BooleanOptionalAction,
|
|
default=True,
|
|
help="Enable embedding directory (default). Use --no-embeddings to disable.",
|
|
)
|
|
render_group.add_argument("--enable_image_debugging", action="store_true", help="Generates debugging image to display")
|
|
render_group.add_argument(
|
|
"--karras_max",
|
|
type=int,
|
|
default=None,
|
|
help="control the point at which the K* samplers will shift from using the Karras noise schedule (good for low step counts) to the LatentDiffusion noise schedule (good for high step counts). Set to 0 to use LatentDiffusion for all step values, and to a high value (e.g. 1000) to use Karras for all step values. [29].",
|
|
)
|
|
# Restoration related args
|
|
postprocessing_group.add_argument(
|
|
"--no_restore",
|
|
dest="restore",
|
|
action="store_false",
|
|
help="Disable face restoration with GFPGAN or codeformer",
|
|
)
|
|
postprocessing_group.add_argument(
|
|
"--no_upscale",
|
|
dest="esrgan",
|
|
action="store_false",
|
|
help="Disable upscaling with ESRGAN",
|
|
)
|
|
postprocessing_group.add_argument(
|
|
"--esrgan_bg_tile",
|
|
type=int,
|
|
default=400,
|
|
help="Tile size for background sampler, 0 for no tile during testing. Default: 400.",
|
|
)
|
|
postprocessing_group.add_argument(
|
|
"--esrgan_denoise_str",
|
|
type=float,
|
|
default=0.75,
|
|
help="esrgan denoise str. 0 is no denoise, 1 is max denoise. Default: 0.75",
|
|
)
|
|
postprocessing_group.add_argument(
|
|
"--gfpgan_model_path",
|
|
type=str,
|
|
default="./models/gfpgan/GFPGANv1.4.pth",
|
|
help="Indicates the path to the GFPGAN model",
|
|
)
|
|
web_server_group.add_argument(
|
|
"--web",
|
|
dest="web",
|
|
action="store_true",
|
|
help="Start in web server mode.",
|
|
)
|
|
web_server_group.add_argument(
|
|
"--web_develop",
|
|
dest="web_develop",
|
|
action="store_true",
|
|
help="Start in web server development mode.",
|
|
)
|
|
web_server_group.add_argument(
|
|
"--web_verbose",
|
|
action="store_true",
|
|
help="Enables verbose logging",
|
|
)
|
|
web_server_group.add_argument(
|
|
"--cors",
|
|
nargs="*",
|
|
type=str,
|
|
help="Additional allowed origins, comma-separated",
|
|
)
|
|
web_server_group.add_argument(
|
|
"--host",
|
|
type=str,
|
|
default="127.0.0.1",
|
|
help="Web server: Host or IP to listen on. Set to 0.0.0.0 to accept traffic from other devices on your network.",
|
|
)
|
|
web_server_group.add_argument("--port", type=int, default="9090", help="Web server: Port to listen on")
|
|
web_server_group.add_argument(
|
|
"--certfile",
|
|
type=str,
|
|
default=None,
|
|
help="Web server: Path to certificate file to use for SSL. Use together with --keyfile",
|
|
)
|
|
web_server_group.add_argument(
|
|
"--keyfile",
|
|
type=str,
|
|
default=None,
|
|
help="Web server: Path to private key file to use for SSL. Use together with --certfile",
|
|
)
|
|
web_server_group.add_argument(
|
|
"--gui",
|
|
dest="gui",
|
|
action="store_true",
|
|
help="Start InvokeAI GUI",
|
|
)
|