diff --git a/cli/simple-img2img.py b/cli/simple-img2img.py index 8590fc62a..8501f16b5 100755 --- a/cli/simple-img2img.py +++ b/cli/simple-img2img.py @@ -1,9 +1,10 @@ #!/usr/bin/env python import os import io -import sys +import time import base64 import logging +import argparse import requests import urllib3 from PIL import Image @@ -14,22 +15,13 @@ sd_password = os.environ.get('SDAPI_PWD', None) logging.basicConfig(level = logging.INFO, format = '%(asctime)s %(levelname)s: %(message)s') log = logging.getLogger(__name__) +urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) + +filename='/tmp/simple-img2img.jpg' options = { - "init_images": [], - "prompt": "city at night", - "negative_prompt": "foggy, blurry", - "steps": 20, - "batch_size": 1, - "n_iter": 1, - "seed": -1, - "sampler_name": "Euler a", - "cfg_scale": 6, - "width": 512, - "height": 512, "save_images": False, "send_images": True, } -urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) def auth(): @@ -51,26 +43,44 @@ def encode(f): image = image.convert('RGB') with io.BytesIO() as stream: image.save(stream, 'JPEG') + image.close() values = stream.getvalue() encoded = base64.b64encode(values).decode() return encoded -def generate(num: int = 0): - log.info(f'sending generate request: {num+1} {options}') - options['init_images'] = [encode('html/logo-dark.png')] - options['batch_size'] = len(options['init_images']) +def generate(args): # pylint: disable=redefined-outer-name + t0 = time.time() + if args.model is not None: + post('/sdapi/v1/options', { 'sd_model_checkpoint': args.model }) + post('/sdapi/v1/reload-checkpoint') # needed if running in api-only to trigger new model load + options['prompt'] = args.prompt + options['negative_prompt'] = args.negative + options['steps'] = int(args.steps) + options['seed'] = int(args.seed) + options['sampler_name'] = args.sampler data = post('/sdapi/v1/img2img', options) + t1 = time.time() if 'images' in data: for i in range(len(data['images'])): b64 = data['images'][i].split(',',1)[0] + info = data['info'] image = Image.open(io.BytesIO(base64.b64decode(b64))) - log.info(f'received image: {image.size}') + image.save(filename) + log.info(f'received image: size={image.size} file={filename} time={t1-t0:.2f} info="{info}"') else: log.warning(f'no images received: {data}') + if __name__ == "__main__": - sys.argv.pop(0) - repeats = int(''.join(sys.argv) or '1') - log.info(f'repeats: {repeats}') - for n in range(repeats): - generate(n) + parser = argparse.ArgumentParser(description = 'simple-img2img') + parser.add_argument('--init', required=True, help='init image') + parser.add_argument('--mask', required=False, help='mask image') + parser.add_argument('--prompt', required=False, default='', help='prompt text') + parser.add_argument('--negative', required=False, default='', help='negative prompt text') + parser.add_argument('--steps', required=False, default=20, help='number of steps') + parser.add_argument('--seed', required=False, default=-1, help='initial seed') + parser.add_argument('--sampler', required=False, default='Euler a', help='sampler name') + parser.add_argument('--model', required=False, help='model name') + args = parser.parse_args() + log.info(f'img2img: {args}') + generate(args) diff --git a/cli/simple-txt2img.py b/cli/simple-txt2img.py index 70e60a916..c2a5ee001 100755 --- a/cli/simple-txt2img.py +++ b/cli/simple-txt2img.py @@ -1,9 +1,10 @@ #!/usr/bin/env python import io import os -import sys +import time import base64 import logging +import argparse import requests import urllib3 from PIL import Image @@ -17,18 +18,7 @@ log = logging.getLogger(__name__) urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) filename='/tmp/simple-txt2img.jpg' -model = None # desired model name, will be set if not none options = { - "prompt": "city at night", - "negative_prompt": "foggy, blurry", - "steps": 20, - "batch_size": 1, - "n_iter": 1, - "seed": -1, - "sampler_name": "UniPC", - "cfg_scale": 6, - "width": 512, - "height": 512, "save_images": False, "send_images": True, } @@ -48,25 +38,41 @@ def post(endpoint: str, dct: dict = None): return req.json() -def generate(num: int = 0): - log.info(f'sending generate request: {num+1} {options}') - if model is not None: - post('/sdapi/v1/options', { 'sd_model_checkpoint': model }) +def generate(args): # pylint: disable=redefined-outer-name + t0 = time.time() + if args.model is not None: + post('/sdapi/v1/options', { 'sd_model_checkpoint': args.model }) post('/sdapi/v1/reload-checkpoint') # needed if running in api-only to trigger new model load + options['prompt'] = args.prompt + options['negative_prompt'] = args.negative + options['steps'] = int(args.steps) + options['seed'] = int(args.seed) + options['sampler_name'] = args.sampler + options['width'] = int(args.width) + options['height'] = int(args.height) data = post('/sdapi/v1/txt2img', options) + t1 = time.time() if 'images' in data: for i in range(len(data['images'])): b64 = data['images'][i].split(',',1)[0] image = Image.open(io.BytesIO(base64.b64decode(b64))) + info = data['info'] image.save(filename) - log.info(f'received image: size={image.size} file={filename}') + log.info(f'received image: size={image.size} file={filename} time={t1-t0:.2f} info="{info}"') else: log.warning(f'no images received: {data}') if __name__ == "__main__": - sys.argv.pop(0) - repeats = int(''.join(sys.argv) or '1') - log.info(f'repeats: {repeats}') - for n in range(repeats): - generate(n) + parser = argparse.ArgumentParser(description = 'simple-txt2img') + parser.add_argument('--prompt', required=False, default='', help='prompt text') + parser.add_argument('--negative', required=False, default='', help='negative prompt text') + parser.add_argument('--width', required=False, default=512, help='image width') + parser.add_argument('--height', required=False, default=512, help='image height') + parser.add_argument('--steps', required=False, default=20, help='number of steps') + parser.add_argument('--seed', required=False, default=-1, help='initial seed') + parser.add_argument('--sampler', required=False, default='Euler a', help='sampler name') + parser.add_argument('--model', required=False, help='model name') + args = parser.parse_args() + log.info(f'txt2img: {args}') + generate(args) diff --git a/extensions-builtin/stable-diffusion-webui-images-browser b/extensions-builtin/stable-diffusion-webui-images-browser index 323ce7efe..730187753 160000 --- a/extensions-builtin/stable-diffusion-webui-images-browser +++ b/extensions-builtin/stable-diffusion-webui-images-browser @@ -1 +1 @@ -Subproject commit 323ce7efef3e3f67b11c09c9e7fa3567d293b048 +Subproject commit 7301877532180b621207f3580a212cf008d621ca diff --git a/modules/processing.py b/modules/processing.py index 7da5c5512..020e187de 100644 --- a/modules/processing.py +++ b/modules/processing.py @@ -423,7 +423,7 @@ class Processed: "styles": self.styles, "job_timestamp": self.job_timestamp, "clip_skip": self.clip_skip, - "is_using_inpainting_conditioning": self.is_using_inpainting_conditioning, + # "is_using_inpainting_conditioning": self.is_using_inpainting_conditioning, } return json.dumps(obj) @@ -753,12 +753,8 @@ def validate_sample(tensor): return tensor if tensor.dtype == torch.bfloat16: # numpy does not support bf16 tensor = tensor.to(torch.float16) - if shared.backend == shared.Backend.ORIGINAL: - sample = 255.0 * np.moveaxis(tensor.cpu().numpy(), 0, 2) - else: - sample = 255.0 * tensor - if isinstance(tensor, torch.Tensor) and hasattr(tensor, 'detach'): - sample = sample.detach().cpu().numpy() + sample = tensor.detach().cpu().numpy() if isinstance(tensor, torch.Tensor) and hasattr(tensor, 'detach') else tensor.cpu().numpy() + sample = 255.0 * np.moveaxis(sample, 0, 2) if shared.backend == shared.Backend.ORIGINAL else 255.0 * sample with warnings.catch_warnings(record=True) as w: cast = sample.astype(np.uint8) if len(w) > 0: