mirror of
https://github.com/invoke-ai/InvokeAI
synced 2024-08-30 20:32:17 +00:00
d1a2c4cd8c
* Implements rudimentary api * Fixes blocking in API * Adds UI to monorepo > src/frontend/ * Updates frontend/README * Reverts conda env name to `ldm` * Fixes environment yamls * CORS config for testing * Fixes LogViewer position * API WID * Adds actions to image viewer * Increases vite chunkSizeWarningLimit to 1500 * Implements init image * Implements state persistence in localStorage * Improve progress data handling * Final build * Fixes mimetypes error on windows * Adds error logging * Fixes bugged img2img strength component * Adds sourcemaps to dev build * Fixes missing key * Changes connection status indicator to text * Adds ability to serve other hosts than localhost * Adding Flask API server * Removes source maps from config * Fixes prop transfer * Add missing packages and add CORS support * Adding API doc * Remove defaults from openapi doc * Adds basic error handling for server config query * Mostly working socket.io implementation. * Fixes bug preventing mask upload * Fixes bug with sampler name not written to metadata * UI Overhaul, numerous fixes Co-authored-by: Kyle Schouviller <kyle0654@hotmail.com> Co-authored-by: Lincoln Stein <lincoln.stein@gmail.com>
207 lines
6.7 KiB
Python
207 lines
6.7 KiB
Python
from modules.parse_seed_weights import parse_seed_weights
|
|
import argparse
|
|
|
|
SAMPLER_CHOICES = [
|
|
'ddim',
|
|
'k_dpm_2_a',
|
|
'k_dpm_2',
|
|
'k_euler_a',
|
|
'k_euler',
|
|
'k_heun',
|
|
'k_lms',
|
|
'plms',
|
|
]
|
|
|
|
|
|
def parameters_to_command(params):
|
|
"""
|
|
Converts dict of parameters into a `dream.py` REPL command.
|
|
"""
|
|
|
|
switches = list()
|
|
|
|
if 'prompt' in params:
|
|
switches.append(f'"{params["prompt"]}"')
|
|
if 'steps' in params:
|
|
switches.append(f'-s {params["steps"]}')
|
|
if 'seed' in params:
|
|
switches.append(f'-S {params["seed"]}')
|
|
if 'width' in params:
|
|
switches.append(f'-W {params["width"]}')
|
|
if 'height' in params:
|
|
switches.append(f'-H {params["height"]}')
|
|
if 'cfg_scale' in params:
|
|
switches.append(f'-C {params["cfg_scale"]}')
|
|
if 'sampler_name' in params:
|
|
switches.append(f'-A {params["sampler_name"]}')
|
|
if 'seamless' in params and params["seamless"] == True:
|
|
switches.append(f'--seamless')
|
|
if 'init_img' in params and len(params['init_img']) > 0:
|
|
switches.append(f'-I {params["init_img"]}')
|
|
if 'init_mask' in params and len(params['init_mask']) > 0:
|
|
switches.append(f'-M {params["init_mask"]}')
|
|
if 'strength' in params and 'init_img' in params:
|
|
switches.append(f'-f {params["strength"]}')
|
|
if 'fit' in params and params["fit"] == True:
|
|
switches.append(f'--fit')
|
|
if 'gfpgan_strength' in params and params["gfpgan_strength"]:
|
|
switches.append(f'-G {params["gfpgan_strength"]}')
|
|
if 'upscale' in params and params["upscale"]:
|
|
switches.append(f'-U {params["upscale"][0]} {params["upscale"][1]}')
|
|
if 'variation_amount' in params and params['variation_amount'] > 0:
|
|
switches.append(f'-v {params["variation_amount"]}')
|
|
if 'with_variations' in params:
|
|
seed_weight_pairs = ','.join(f'{seed}:{weight}' for seed, weight in params["with_variations"])
|
|
switches.append(f'-V {seed_weight_pairs}')
|
|
|
|
return ' '.join(switches)
|
|
|
|
|
|
|
|
def create_cmd_parser():
|
|
"""
|
|
This is simply a copy of the parser from `dream.py` with a change to give
|
|
prompt a default value. This is a temporary hack pending merge of #587 which
|
|
provides a better way to do this.
|
|
"""
|
|
parser = argparse.ArgumentParser(
|
|
description='Example: dream> a fantastic alien landscape -W1024 -H960 -s100 -n12',
|
|
exit_on_error=True,
|
|
)
|
|
parser.add_argument('prompt', nargs='?', default='')
|
|
parser.add_argument('-s', '--steps', type=int, help='Number of steps')
|
|
parser.add_argument(
|
|
'-S',
|
|
'--seed',
|
|
type=int,
|
|
help='Image seed; a +ve integer, or use -1 for the previous seed, -2 for the one before that, etc',
|
|
)
|
|
parser.add_argument(
|
|
'-n',
|
|
'--iterations',
|
|
type=int,
|
|
default=1,
|
|
help='Number of samplings to perform (slower, but will provide seeds for individual images)',
|
|
)
|
|
parser.add_argument(
|
|
'-W', '--width', type=int, help='Image width, multiple of 64'
|
|
)
|
|
parser.add_argument(
|
|
'-H', '--height', type=int, help='Image height, multiple of 64'
|
|
)
|
|
parser.add_argument(
|
|
'-C',
|
|
'--cfg_scale',
|
|
default=7.5,
|
|
type=float,
|
|
help='Classifier free guidance (CFG) scale - higher numbers cause generator to "try" harder.',
|
|
)
|
|
parser.add_argument(
|
|
'-g', '--grid', action='store_true', help='generate a grid'
|
|
)
|
|
parser.add_argument(
|
|
'--outdir',
|
|
'-o',
|
|
type=str,
|
|
default=None,
|
|
help='Directory to save generated images and a log of prompts and seeds',
|
|
)
|
|
parser.add_argument(
|
|
'--seamless',
|
|
action='store_true',
|
|
help='Change the model to seamless tiling (circular) mode',
|
|
)
|
|
parser.add_argument(
|
|
'-i',
|
|
'--individual',
|
|
action='store_true',
|
|
help='Generate individual files (default)',
|
|
)
|
|
parser.add_argument(
|
|
'-I',
|
|
'--init_img',
|
|
type=str,
|
|
help='Path to input image for img2img mode (supersedes width and height)',
|
|
)
|
|
parser.add_argument(
|
|
'-M',
|
|
'--init_mask',
|
|
type=str,
|
|
help='Path to input mask for inpainting mode (supersedes width and height)',
|
|
)
|
|
parser.add_argument(
|
|
'-T',
|
|
'-fit',
|
|
'--fit',
|
|
action='store_true',
|
|
help='If specified, will resize the input image to fit within the dimensions of width x height (512x512 default)',
|
|
)
|
|
parser.add_argument(
|
|
'-f',
|
|
'--strength',
|
|
default=0.75,
|
|
type=float,
|
|
help='Strength for noising/unnoising. 0.0 preserves image exactly, 1.0 replaces it completely',
|
|
)
|
|
parser.add_argument(
|
|
'-G',
|
|
'--gfpgan_strength',
|
|
default=0,
|
|
type=float,
|
|
help='The strength at which to apply the GFPGAN model to the result, in order to improve faces.',
|
|
)
|
|
parser.add_argument(
|
|
'-U',
|
|
'--upscale',
|
|
nargs='+',
|
|
default=None,
|
|
type=float,
|
|
help='Scale factor (2, 4) for upscaling followed by upscaling strength (0-1.0). If strength not specified, defaults to 0.75'
|
|
)
|
|
parser.add_argument(
|
|
'-save_orig',
|
|
'--save_original',
|
|
action='store_true',
|
|
help='Save original. Use it when upscaling to save both versions.',
|
|
)
|
|
# variants is going to be superseded by a generalized "prompt-morph" function
|
|
# parser.add_argument('-v','--variants',type=int,help="in img2img mode, the first generated image will get passed back to img2img to generate the requested number of variants")
|
|
parser.add_argument(
|
|
'-x',
|
|
'--skip_normalize',
|
|
action='store_true',
|
|
help='Skip subprompt weight normalization',
|
|
)
|
|
parser.add_argument(
|
|
'-A',
|
|
'-m',
|
|
'--sampler',
|
|
dest='sampler_name',
|
|
default=None,
|
|
type=str,
|
|
choices=SAMPLER_CHOICES,
|
|
metavar='SAMPLER_NAME',
|
|
help=f'Switch to a different sampler. Supported samplers: {", ".join(SAMPLER_CHOICES)}',
|
|
)
|
|
parser.add_argument(
|
|
'-t',
|
|
'--log_tokenization',
|
|
action='store_true',
|
|
help='shows how the prompt is split into tokens'
|
|
)
|
|
parser.add_argument(
|
|
'-v',
|
|
'--variation_amount',
|
|
default=0.0,
|
|
type=float,
|
|
help='If > 0, generates variations on the initial seed instead of random seeds per iteration. Must be between 0 and 1. Higher values will be more different.'
|
|
)
|
|
parser.add_argument(
|
|
'-V',
|
|
'--with_variations',
|
|
default=None,
|
|
type=str,
|
|
help='list of variations to apply, in the format `seed:weight,seed:weight,...'
|
|
)
|
|
return parser
|