8
8
import traceback
9
9
import yaml
10
10
11
+ from ldm .generate import Generate
11
12
from ldm .invoke .globals import Globals
12
13
from ldm .invoke .prompt_parser import PromptParser
13
14
from ldm .invoke .readline import get_completer , Completer
@@ -27,7 +28,7 @@ def main():
27
28
"""Initialize command-line parsers and the diffusion model"""
28
29
global infile
29
30
print ('* Initializing, be patient...' )
30
-
31
+
31
32
opt = Args ()
32
33
args = opt .parse_args ()
33
34
if not args :
@@ -47,7 +48,7 @@ def main():
47
48
# alert - setting globals here
48
49
Globals .root = os .path .expanduser (args .root_dir or os .environ .get ('INVOKEAI_ROOT' ) or os .path .abspath ('.' ))
49
50
Globals .try_patchmatch = args .patchmatch
50
-
51
+
51
52
print (f'>> InvokeAI runtime directory is "{ Globals .root } "' )
52
53
53
54
# loading here to avoid long delays on startup
@@ -281,7 +282,7 @@ def main_loop(gen, opt):
281
282
prefix = file_writer .unique_prefix ()
282
283
step_callback = make_step_callback (gen , opt , prefix ) if opt .save_intermediates > 0 else None
283
284
284
- def image_writer (image , seed , upscaled = False , first_seed = None , use_prefix = None , prompt_in = None ):
285
+ def image_writer (image , seed , upscaled = False , first_seed = None , use_prefix = None , prompt_in = None , attention_maps_image = None ):
285
286
# note the seed is the seed of the current image
286
287
# the first_seed is the original seed that noise is added to
287
288
# when the -v switch is used to generate variations
@@ -341,8 +342,8 @@ def image_writer(image, seed, upscaled=False, first_seed=None, use_prefix=None,
341
342
filename ,
342
343
tool ,
343
344
formatted_dream_prompt ,
344
- )
345
-
345
+ )
346
+
346
347
if (not postprocessed ) or opt .save_original :
347
348
# only append to results if we didn't overwrite an earlier output
348
349
results .append ([path , formatted_dream_prompt ])
@@ -432,7 +433,7 @@ def do_command(command:str, gen, opt:Args, completer) -> tuple:
432
433
add_embedding_terms (gen , completer )
433
434
completer .add_history (command )
434
435
operation = None
435
-
436
+
436
437
elif command .startswith ('!models' ):
437
438
gen .model_cache .print_models ()
438
439
completer .add_history (command )
@@ -533,7 +534,7 @@ def add_weights_to_config(model_path:str, gen, opt, completer):
533
534
534
535
completer .complete_extensions (('.yaml' ,'.yml' ))
535
536
completer .linebuffer = 'configs/stable-diffusion/v1-inference.yaml'
536
-
537
+
537
538
done = False
538
539
while not done :
539
540
new_config ['config' ] = input ('Configuration file for this model: ' )
@@ -564,7 +565,7 @@ def add_weights_to_config(model_path:str, gen, opt, completer):
564
565
print ('** Please enter a valid integer between 64 and 2048' )
565
566
566
567
make_default = input ('Make this the default model? [n] ' ) in ('y' ,'Y' )
567
-
568
+
568
569
if write_config_file (opt .conf , gen , model_name , new_config , make_default = make_default ):
569
570
completer .add_model (model_name )
570
571
@@ -577,14 +578,14 @@ def del_config(model_name:str, gen, opt, completer):
577
578
gen .model_cache .commit (opt .conf )
578
579
print (f'** { model_name } deleted' )
579
580
completer .del_model (model_name )
580
-
581
+
581
582
def edit_config (model_name :str , gen , opt , completer ):
582
583
config = gen .model_cache .config
583
-
584
+
584
585
if model_name not in config :
585
586
print (f'** Unknown model { model_name } ' )
586
587
return
587
-
588
+
588
589
print (f'\n >> Editing model { model_name } from configuration file { opt .conf } ' )
589
590
590
591
conf = config [model_name ]
@@ -597,10 +598,10 @@ def edit_config(model_name:str, gen, opt, completer):
597
598
make_default = input ('Make this the default model? [n] ' ) in ('y' ,'Y' )
598
599
completer .complete_extensions (None )
599
600
write_config_file (opt .conf , gen , model_name , new_config , clobber = True , make_default = make_default )
600
-
601
+
601
602
def write_config_file (conf_path , gen , model_name , new_config , clobber = False , make_default = False ):
602
603
current_model = gen .model_name
603
-
604
+
604
605
op = 'modify' if clobber else 'import'
605
606
print ('\n >> New configuration:' )
606
607
if make_default :
@@ -623,7 +624,7 @@ def write_config_file(conf_path, gen, model_name, new_config, clobber=False, mak
623
624
gen .model_cache .set_default_model (model_name )
624
625
625
626
gen .model_cache .commit (conf_path )
626
-
627
+
627
628
do_switch = input (f'Keep model loaded? [y]' )
628
629
if len (do_switch )== 0 or do_switch [0 ] in ('y' ,'Y' ):
629
630
pass
@@ -653,7 +654,7 @@ def do_postprocess (gen, opt, callback):
653
654
opt .prompt = opt .new_prompt
654
655
else :
655
656
opt .prompt = None
656
-
657
+
657
658
if os .path .dirname (file_path ) == '' : #basename given
658
659
file_path = os .path .join (opt .outdir ,file_path )
659
660
@@ -718,7 +719,7 @@ def add_postprocessing_to_metadata(opt,original_file,new_file,tool,command):
718
719
)
719
720
meta ['image' ]['postprocessing' ] = pp
720
721
write_metadata (new_file ,meta )
721
-
722
+
722
723
def prepare_image_metadata (
723
724
opt ,
724
725
prefix ,
@@ -789,28 +790,28 @@ def get_next_command(infile=None) -> str: # command string
789
790
print (f'#{ command } ' )
790
791
return command
791
792
792
- def invoke_ai_web_server_loop (gen , gfpgan , codeformer , esrgan ):
793
+ def invoke_ai_web_server_loop (gen : Generate , gfpgan , codeformer , esrgan ):
793
794
print ('\n * --web was specified, starting web server...' )
794
795
from backend .invoke_ai_web_server import InvokeAIWebServer
795
796
# Change working directory to the stable-diffusion directory
796
797
os .chdir (
797
798
os .path .abspath (os .path .join (os .path .dirname (__file__ ), '..' ))
798
799
)
799
-
800
+
800
801
invoke_ai_web_server = InvokeAIWebServer (generate = gen , gfpgan = gfpgan , codeformer = codeformer , esrgan = esrgan )
801
802
802
803
try :
803
804
invoke_ai_web_server .run ()
804
805
except KeyboardInterrupt :
805
806
pass
806
-
807
+
807
808
def add_embedding_terms (gen ,completer ):
808
809
'''
809
810
Called after setting the model, updates the autocompleter with
810
811
any terms loaded by the embedding manager.
811
812
'''
812
813
completer .add_embedding_terms (gen .model .embedding_manager .list_terms ())
813
-
814
+
814
815
def split_variations (variations_string ) -> list :
815
816
# shotgun parsing, woo
816
817
parts = []
@@ -867,15 +868,15 @@ def callback(img, step):
867
868
image = gen .sample_to_image (img )
868
869
image .save (filename ,'PNG' )
869
870
return callback
870
-
871
+
871
872
def retrieve_dream_command (opt ,command ,completer ):
872
873
'''
873
874
Given a full or partial path to a previously-generated image file,
874
875
will retrieve and format the dream command used to generate the image,
875
876
and pop it into the readline buffer (linux, Mac), or print out a comment
876
877
for cut-and-paste (windows)
877
878
878
- Given a wildcard path to a folder with image png files,
879
+ Given a wildcard path to a folder with image png files,
879
880
will retrieve and format the dream command used to generate the images,
880
881
and save them to a file commands.txt for further processing
881
882
'''
@@ -911,7 +912,7 @@ def write_commands(opt, file_path:str, outfilepath:str):
911
912
except ValueError :
912
913
print (f'## "{ basename } ": unacceptable pattern' )
913
914
return
914
-
915
+
915
916
commands = []
916
917
cmd = None
917
918
for path in paths :
@@ -940,7 +941,7 @@ def emergency_model_reconfigure():
940
941
print (' After reconfiguration is done, please relaunch invoke.py. ' )
941
942
print ('!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' )
942
943
print ('configure_invokeai is launching....\n ' )
943
-
944
+
944
945
sys .argv = ['configure_invokeai' ,'--interactive' ]
945
946
import configure_invokeai
946
947
configure_invokeai .main ()
0 commit comments