@@ -781,7 +781,7 @@ def process_images(
781
781
outpath , func_init , func_sample , prompt , seed , sampler_name , skip_grid , skip_save , batch_size ,
782
782
n_iter , steps , cfg_scale , width , height , prompt_matrix , use_GFPGAN , use_RealESRGAN , realesrgan_model_name ,
783
783
fp , ddim_eta = 0.0 , do_not_save_grid = False , normalize_prompt_weights = True , init_img = None , init_mask = None ,
784
- keep_mask = False , mask_blur_strength = 3 , denoising_strength = 0.75 , resize_mode = None , uses_loopback = False ,
784
+ keep_mask = False , mask_blur_strength = 3 , mask_restore = False , denoising_strength = 0.75 , resize_mode = None , uses_loopback = False ,
785
785
uses_random_seed_loopback = False , sort_samples = True , write_info_files = True , write_sample_info_to_log_file = False , jpg_sample = False ,
786
786
variant_amount = 0.0 , variant_seed = None ,imgProcessorTask = False , job_info : JobInfo = None ):
787
787
"""this is the main loop that both txt2img and img2img use; it calls func_init once inside all the scopes and func_sample once per batch"""
@@ -1018,6 +1018,26 @@ def process_images(
1018
1018
if imgProcessorTask == True :
1019
1019
output_images .append (image )
1020
1020
1021
+ if mask_restore and init_mask :
1022
+ #init_mask = init_mask if keep_mask else ImageOps.invert(init_mask)
1023
+ init_mask = init_mask .filter (ImageFilter .GaussianBlur (mask_blur_strength ))
1024
+ init_mask = init_mask .convert ('L' )
1025
+ init_img = init_img .convert ('RGB' )
1026
+ image = image .convert ('RGB' )
1027
+
1028
+ if use_RealESRGAN and RealESRGAN is not None :
1029
+ if RealESRGAN .model .name != realesrgan_model_name :
1030
+ try_loading_RealESRGAN (realesrgan_model_name )
1031
+ output , img_mode = RealESRGAN .enhance (np .array (init_img , dtype = np .uint8 ))
1032
+ init_img = Image .fromarray (output )
1033
+ init_img = init_img .convert ('RGB' )
1034
+
1035
+ output , img_mode = RealESRGAN .enhance (np .array (init_mask , dtype = np .uint8 ))
1036
+ init_mask = Image .fromarray (output )
1037
+ init_mask = init_mask .convert ('L' )
1038
+
1039
+ image = Image .composite (init_img , image , init_mask )
1040
+
1021
1041
if not skip_save :
1022
1042
save_sample (image , sample_path_i , filename , jpg_sample , prompts , seeds , width , height , steps , cfg_scale ,
1023
1043
normalize_prompt_weights , use_GFPGAN , write_info_files , write_sample_info_to_log_file , prompt_matrix , init_img , uses_loopback , uses_random_seed_loopback , skip_save ,
@@ -1225,7 +1245,7 @@ def flag(self, flag_data, flag_option=None, flag_index=None, username=None):
1225
1245
print ("Logged:" , filenames [0 ])
1226
1246
1227
1247
1228
- def img2img (prompt : str , image_editor_mode : str , mask_mode : str , mask_blur_strength : int , ddim_steps : int , sampler_name : str ,
1248
+ def img2img (prompt : str , image_editor_mode : str , mask_mode : str , mask_blur_strength : int , mask_restore : bool , ddim_steps : int , sampler_name : str ,
1229
1249
toggles : List [int ], realesrgan_model_name : str , n_iter : int , cfg_scale : float , denoising_strength : float ,
1230
1250
seed : int , height : int , width : int , resize_mode : int , init_info : any = None , init_info_mask : any = None , fp = None , job_info : JobInfo = None ):
1231
1251
# print([prompt, image_editor_mode, init_info, init_info_mask, mask_mode,
@@ -1428,6 +1448,7 @@ def sample(init_data, x, conditioning, unconditional_conditioning, sampler_name)
1428
1448
init_mask = init_mask ,
1429
1449
keep_mask = keep_mask ,
1430
1450
mask_blur_strength = mask_blur_strength ,
1451
+ mask_restore = mask_restore ,
1431
1452
denoising_strength = denoising_strength ,
1432
1453
resize_mode = resize_mode ,
1433
1454
uses_loopback = loopback ,
@@ -1498,6 +1519,7 @@ def sample(init_data, x, conditioning, unconditional_conditioning, sampler_name)
1498
1519
keep_mask = keep_mask ,
1499
1520
mask_blur_strength = mask_blur_strength ,
1500
1521
denoising_strength = denoising_strength ,
1522
+ mask_restore = mask_restore ,
1501
1523
resize_mode = resize_mode ,
1502
1524
uses_loopback = loopback ,
1503
1525
sort_samples = sort_samples ,
@@ -1638,6 +1660,7 @@ def processGoBig(image):
1638
1660
init_img = result
1639
1661
init_mask = None
1640
1662
keep_mask = False
1663
+ mask_restore = False
1641
1664
assert 0. <= denoising_strength <= 1. , 'can only work with strength in [0.0, 1.0]'
1642
1665
1643
1666
def init ():
@@ -1784,6 +1807,7 @@ def make_mask_image(r):
1784
1807
keep_mask = False ,
1785
1808
mask_blur_strength = None ,
1786
1809
denoising_strength = denoising_strength ,
1810
+ mask_restore = mask_restore ,
1787
1811
resize_mode = resize_mode ,
1788
1812
uses_loopback = False ,
1789
1813
sort_samples = True ,
@@ -2086,6 +2110,7 @@ def run_RealESRGAN(image, model_name: str):
2086
2110
'cfg_scale' : 5.0 ,
2087
2111
'denoising_strength' : 0.75 ,
2088
2112
'mask_mode' : 0 ,
2113
+ 'mask_restore' : False ,
2089
2114
'resize_mode' : 0 ,
2090
2115
'seed' : '' ,
2091
2116
'height' : 512 ,
@@ -2099,10 +2124,39 @@ def run_RealESRGAN(image, model_name: str):
2099
2124
img2img_toggle_defaults = [img2img_toggles [i ] for i in img2img_defaults ['toggles' ]]
2100
2125
img2img_image_mode = 'sketch'
2101
2126
2102
- def change_image_editor_mode (choice , cropped_image , resize_mode , width , height ):
2127
+ def change_image_editor_mode (choice , cropped_image , mask , resize_mode , width , height ):
2103
2128
if choice == "Mask" :
2104
- return [gr .update (visible = False ), gr .update (visible = True ), gr .update (visible = False ), gr .update (visible = True ), gr .update (visible = False ), gr .update (visible = False ), gr .update (visible = True ), gr .update (visible = True )]
2105
- return [gr .update (visible = True ), gr .update (visible = False ), gr .update (visible = True ), gr .update (visible = False ), gr .update (visible = True ), gr .update (visible = True ), gr .update (visible = False ), gr .update (visible = False )]
2129
+ update_image_editor = gr .update (visible = False )
2130
+ update_image_mask = gr .update (visible = True )
2131
+ update_btn_editor = gr .update (visible = False )
2132
+ update_btn_mask = gr .update (visible = True )
2133
+ update_painterro_btn = gr .update (visible = False )
2134
+ update_mask = gr .update (visible = False )
2135
+ update_mask_blur_strength = gr .update (visible = True )
2136
+ update_mask_restore = gr .update (visible = True )
2137
+ # unknown = gr.update(visible=True)
2138
+ else :
2139
+ update_image_editor = gr .update (visible = True )
2140
+ update_image_mask = gr .update (visible = False )
2141
+ update_btn_editor = gr .update (visible = True )
2142
+ update_btn_mask = gr .update (visible = False )
2143
+ update_painterro_btn = gr .update (visible = True )
2144
+ update_mask = gr .update (visible = True )
2145
+ update_mask_blur_strength = gr .update (visible = False )
2146
+ update_mask_restore = gr .update (visible = False )
2147
+ # unknown = gr.update(visible=False)
2148
+
2149
+ return [
2150
+ update_image_editor ,
2151
+ update_image_mask ,
2152
+ update_btn_editor ,
2153
+ update_btn_mask ,
2154
+ update_painterro_btn ,
2155
+ update_mask ,
2156
+ update_mask_blur_strength ,
2157
+ update_mask_restore ,
2158
+ # unknown,
2159
+ ]
2106
2160
2107
2161
def update_image_mask (cropped_image , resize_mode , width , height ):
2108
2162
resized_cropped_image = resize_image (resize_mode , cropped_image , width , height ) if cropped_image else None
0 commit comments