Skip to content

Commit 6353222

Browse files
committed
Merge remote-tracking branch 'origin/main' into dev/diffusers
# Conflicts: # backend/invoke_ai_web_server.py # ldm/generate.py # ldm/invoke/CLI.py # ldm/invoke/generator/base.py # ldm/invoke/generator/txt2img.py # ldm/models/diffusion/cross_attention_control.py # ldm/modules/attention.py
2 parents 66d32b7 + 786b887 commit 6353222

File tree

13 files changed

+518
-184
lines changed

13 files changed

+518
-184
lines changed

backend/invoke_ai_web_server.py

Lines changed: 27 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
get_canvas_generation_mode,
2222
)
2323
from backend.modules.parameters import parameters_to_command
24+
from ldm.generate import Generate
2425
from ldm.invoke.args import Args, APP_ID, APP_VERSION, calculate_init_img_hash
2526
from ldm.invoke.generator.diffusers_pipeline import PipelineIntermediateState
2627
from ldm.invoke.generator.inpaint import infill_methods
@@ -38,7 +39,7 @@
3839

3940

4041
class InvokeAIWebServer:
41-
def __init__(self, generate, gfpgan, codeformer, esrgan) -> None:
42+
def __init__(self, generate: Generate, gfpgan, codeformer, esrgan) -> None:
4243
self.host = args.host
4344
self.port = args.port
4445

@@ -906,16 +907,13 @@ def image_progress(progress_state: PipelineIntermediateState):
906907
},
907908
)
908909

910+
909911
if generation_parameters["progress_latents"]:
910912
image = self.generate.sample_to_lowres_estimated_image(sample)
911913
(width, height) = image.size
912914
width *= 8
913915
height *= 8
914-
buffered = io.BytesIO()
915-
image.save(buffered, format="PNG")
916-
img_base64 = "data:image/png;base64," + base64.b64encode(
917-
buffered.getvalue()
918-
).decode("UTF-8")
916+
img_base64 = image_to_dataURL(image)
919917
self.socketio.emit(
920918
"intermediateResult",
921919
{
@@ -933,7 +931,7 @@ def image_progress(progress_state: PipelineIntermediateState):
933931
self.socketio.emit("progressUpdate", progress.to_formatted_dict())
934932
eventlet.sleep(0)
935933

936-
def image_done(image, seed, first_seed):
934+
def image_done(image, seed, first_seed, attention_maps_image=None):
937935
if self.canceled.is_set():
938936
raise CanceledException
939937

@@ -1095,6 +1093,12 @@ def image_done(image, seed, first_seed):
10951093
self.socketio.emit("progressUpdate", progress.to_formatted_dict())
10961094
eventlet.sleep(0)
10971095

1096+
parsed_prompt, _ = get_prompt_structure(generation_parameters["prompt"])
1097+
tokens = None if type(parsed_prompt) is Blend else \
1098+
get_tokens_for_prompt(self.generate.model, parsed_prompt)
1099+
attention_maps_image_base64_url = None if attention_maps_image is None \
1100+
else image_to_dataURL(attention_maps_image)
1101+
10981102
self.socketio.emit(
10991103
"generationResult",
11001104
{
@@ -1107,6 +1111,8 @@ def image_done(image, seed, first_seed):
11071111
"height": height,
11081112
"boundingBox": original_bounding_box,
11091113
"generationMode": generation_parameters["generation_mode"],
1114+
"attentionMaps": attention_maps_image_base64_url,
1115+
"tokens": tokens,
11101116
},
11111117
)
11121118
eventlet.sleep(0)
@@ -1118,7 +1124,7 @@ def image_done(image, seed, first_seed):
11181124
self.generate.prompt2image(
11191125
**generation_parameters,
11201126
step_callback=image_progress,
1121-
image_callback=image_done,
1127+
image_callback=image_done
11221128
)
11231129

11241130
except KeyboardInterrupt:
@@ -1565,6 +1571,19 @@ def dataURL_to_image(dataURL: str) -> ImageType:
15651571
)
15661572
return image
15671573

1574+
"""
1575+
Converts an image into a base64 image dataURL.
1576+
"""
1577+
1578+
def image_to_dataURL(image: ImageType) -> str:
1579+
buffered = io.BytesIO()
1580+
image.save(buffered, format="PNG")
1581+
image_base64 = "data:image/png;base64," + base64.b64encode(
1582+
buffered.getvalue()
1583+
).decode("UTF-8")
1584+
return image_base64
1585+
1586+
15681587

15691588
"""
15701589
Converts a base64 image dataURL into bytes.

ldm/generate.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
import skimage
1717
import torch
1818
import transformers
19-
from PIL import Image, ImageOps
2019
from diffusers import HeunDiscreteScheduler
2120
from diffusers.pipeline_utils import DiffusionPipeline
2221
from diffusers.schedulers.scheduling_ddim import DDIMScheduler
@@ -27,6 +26,7 @@
2726
from diffusers.schedulers.scheduling_lms_discrete import LMSDiscreteScheduler
2827
from diffusers.schedulers.scheduling_pndm import PNDMScheduler
2928
from omegaconf import OmegaConf
29+
from PIL import Image, ImageOps
3030
from pytorch_lightning import seed_everything, logging
3131

3232
from ldm.invoke.args import metadata_from_png
@@ -461,7 +461,7 @@ def process_image(image,seed):
461461
try:
462462
uc, c, extra_conditioning_info = get_uc_and_c_and_ec(
463463
prompt, model =self.model,
464-
skip_normalize=skip_normalize,
464+
skip_normalize_legacy_blend=skip_normalize,
465465
log_tokens =self.log_tokenization
466466
)
467467

@@ -613,8 +613,8 @@ def apply_postprocessor(
613613
# todo: cross-attention control
614614
uc, c, extra_conditioning_info = get_uc_and_c_and_ec(
615615
prompt, model =self.model,
616-
skip_normalize=opt.skip_normalize,
617-
log_tokens =opt.log_tokenization
616+
skip_normalize_legacy_blend=opt.skip_normalize,
617+
log_tokens =ldm.invoke.conditioning.log_tokenization
618618
)
619619

620620
if tool in ('gfpgan','codeformer','upscale'):

ldm/invoke/CLI.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import traceback
99
import yaml
1010

11+
from ldm.generate import Generate
1112
from ldm.invoke.globals import Globals
1213
from ldm.invoke.prompt_parser import PromptParser
1314
from ldm.invoke.readline import get_completer, Completer
@@ -282,7 +283,7 @@ def main_loop(gen, opt):
282283
prefix = file_writer.unique_prefix()
283284
step_callback = make_step_callback(gen, opt, prefix) if opt.save_intermediates > 0 else None
284285

285-
def image_writer(image, seed, upscaled=False, first_seed=None, use_prefix=None, prompt_in=None):
286+
def image_writer(image, seed, upscaled=False, first_seed=None, use_prefix=None, prompt_in=None, attention_maps_image=None):
286287
# note the seed is the seed of the current image
287288
# the first_seed is the original seed that noise is added to
288289
# when the -v switch is used to generate variations
@@ -790,7 +791,7 @@ def get_next_command(infile=None) -> str: # command string
790791
print(f'#{command}')
791792
return command
792793

793-
def invoke_ai_web_server_loop(gen, gfpgan, codeformer, esrgan):
794+
def invoke_ai_web_server_loop(gen: Generate, gfpgan, codeformer, esrgan):
794795
print('\n* --web was specified, starting web server...')
795796
from backend.invoke_ai_web_server import InvokeAIWebServer
796797
# Change working directory to the stable-diffusion directory

0 commit comments

Comments
 (0)