186 lines
8.9 KiB
Python
186 lines
8.9 KiB
Python
import os
|
|
|
|
from modules.ui import plaintext_to_html
|
|
|
|
import cv2
|
|
import glob
|
|
from PIL import Image
|
|
|
|
from extensions.ebsynth_utility.stage1 import ebsynth_utility_stage1,ebsynth_utility_stage1_invert
|
|
from extensions.ebsynth_utility.stage2 import ebsynth_utility_stage2
|
|
from extensions.ebsynth_utility.stage5 import ebsynth_utility_stage5
|
|
from extensions.ebsynth_utility.stage7 import ebsynth_utility_stage7
|
|
from extensions.ebsynth_utility.stage8 import ebsynth_utility_stage8
|
|
from extensions.ebsynth_utility.stage3_5 import ebsynth_utility_stage3_5
|
|
|
|
|
|
def x_ceiling(value, step):
|
|
return -(-value // step) * step
|
|
|
|
def dump_dict(string, d:dict):
|
|
for key in d.keys():
|
|
string += ( key + " : " + str(d[key]) + "\n")
|
|
return string
|
|
|
|
class debug_string:
|
|
txt = ""
|
|
def print(self, comment):
|
|
print(comment)
|
|
self.txt += comment + '\n'
|
|
def to_string(self):
|
|
return self.txt
|
|
|
|
def ebsynth_utility_process(stage_index: int, project_dir:str, original_movie_path:str, frame_width:int, frame_height:int, st1_masking_method_index:int, st1_mask_threshold:float, tb_use_fast_mode:bool, tb_use_jit:bool, clipseg_mask_prompt:str, clipseg_exclude_prompt:str, clipseg_mask_threshold:int, clipseg_mask_blur_size:int, clipseg_mask_blur_size2:int, key_min_gap:int, key_max_gap:int, key_th:float, key_add_last_frame:bool, color_matcher_method:str, st3_5_use_mask:bool, st3_5_use_mask_ref:bool, st3_5_use_mask_org:bool, color_matcher_ref_type:int, color_matcher_ref_image:Image, blend_rate:float, export_type:str, bg_src:str, bg_type:str, mask_blur_size:int, mask_threshold:float, fg_transparency:float, mask_mode:str):
|
|
args = locals()
|
|
info = ""
|
|
info = dump_dict(info, args)
|
|
dbg = debug_string()
|
|
|
|
|
|
def process_end(dbg, info):
|
|
return plaintext_to_html(dbg.to_string()), plaintext_to_html(info)
|
|
|
|
|
|
if not os.path.isdir(project_dir):
|
|
dbg.print("{0} project_dir not found".format(project_dir))
|
|
return process_end( dbg, info )
|
|
|
|
if not os.path.isfile(original_movie_path):
|
|
dbg.print("{0} original_movie_path not found".format(original_movie_path))
|
|
return process_end( dbg, info )
|
|
|
|
is_invert_mask = False
|
|
if mask_mode == "Invert":
|
|
is_invert_mask = True
|
|
|
|
frame_path = os.path.join(project_dir , "video_frame")
|
|
frame_mask_path = os.path.join(project_dir, "video_mask")
|
|
|
|
if is_invert_mask:
|
|
inv_path = os.path.join(project_dir, "inv")
|
|
os.makedirs(inv_path, exist_ok=True)
|
|
|
|
org_key_path = os.path.join(inv_path, "video_key")
|
|
img2img_key_path = os.path.join(inv_path, "img2img_key")
|
|
img2img_upscale_key_path = os.path.join(inv_path, "img2img_upscale_key")
|
|
else:
|
|
org_key_path = os.path.join(project_dir, "video_key")
|
|
img2img_key_path = os.path.join(project_dir, "img2img_key")
|
|
img2img_upscale_key_path = os.path.join(project_dir, "img2img_upscale_key")
|
|
|
|
if mask_mode == "None":
|
|
frame_mask_path = ""
|
|
|
|
|
|
project_args = [project_dir, original_movie_path, frame_path, frame_mask_path, org_key_path, img2img_key_path, img2img_upscale_key_path]
|
|
|
|
|
|
if stage_index == 0:
|
|
ebsynth_utility_stage1(dbg, project_args, frame_width, frame_height, st1_masking_method_index, st1_mask_threshold, tb_use_fast_mode, tb_use_jit, clipseg_mask_prompt, clipseg_exclude_prompt, clipseg_mask_threshold, clipseg_mask_blur_size, clipseg_mask_blur_size2, is_invert_mask)
|
|
if is_invert_mask:
|
|
inv_mask_path = os.path.join(inv_path, "inv_video_mask")
|
|
ebsynth_utility_stage1_invert(dbg, frame_mask_path, inv_mask_path)
|
|
|
|
elif stage_index == 1:
|
|
ebsynth_utility_stage2(dbg, project_args, key_min_gap, key_max_gap, key_th, key_add_last_frame, is_invert_mask)
|
|
elif stage_index == 2:
|
|
|
|
sample_image = glob.glob( os.path.join(frame_path , "*.png" ) )[0]
|
|
img_height, img_width, _ = cv2.imread(sample_image).shape
|
|
if img_width < img_height:
|
|
re_w = 512
|
|
re_h = int(x_ceiling( (512 / img_width) * img_height , 64))
|
|
else:
|
|
re_w = int(x_ceiling( (512 / img_height) * img_width , 64))
|
|
re_h = 512
|
|
img_width = re_w
|
|
img_height = re_h
|
|
|
|
dbg.print("stage 3")
|
|
dbg.print("")
|
|
dbg.print("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
|
|
dbg.print("1. Go to img2img tab")
|
|
dbg.print("2. Select [ebsynth utility] in the script combo box")
|
|
dbg.print("3. Fill in the \"Project directory\" field with [" + project_dir + "]" )
|
|
dbg.print("4. Select in the \"Mask Mode(Override img2img Mask mode)\" field with [" + ("Invert" if is_invert_mask else "Normal") + "]" )
|
|
dbg.print("5. I recommend to fill in the \"Width\" field with [" + str(img_width) + "]" )
|
|
dbg.print("6. I recommend to fill in the \"Height\" field with [" + str(img_height) + "]" )
|
|
dbg.print("7. I recommend to fill in the \"Denoising strength\" field with lower than 0.35" )
|
|
dbg.print(" (When using controlnet together, you can put in large values (even 1.0 is possible).)")
|
|
dbg.print("8. Fill in the remaining configuration fields of img2img. No image and mask settings are required.")
|
|
dbg.print("9. Drop any image onto the img2img main screen. This is necessary to avoid errors, but does not affect the results of img2img.")
|
|
dbg.print("10. Generate")
|
|
dbg.print("(Images are output to [" + img2img_key_path + "])")
|
|
dbg.print("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
|
|
return process_end( dbg, "" )
|
|
|
|
elif stage_index == 3:
|
|
ebsynth_utility_stage3_5(dbg, project_args, color_matcher_method, st3_5_use_mask, st3_5_use_mask_ref, st3_5_use_mask_org, color_matcher_ref_type, color_matcher_ref_image)
|
|
|
|
elif stage_index == 4:
|
|
sample_image = glob.glob( os.path.join(frame_path , "*.png" ) )[0]
|
|
img_height, img_width, _ = cv2.imread(sample_image).shape
|
|
|
|
sample_img2img_key = glob.glob( os.path.join(img2img_key_path , "*.png" ) )[0]
|
|
img_height_key, img_width_key, _ = cv2.imread(sample_img2img_key).shape
|
|
|
|
if is_invert_mask:
|
|
project_dir = inv_path
|
|
|
|
dbg.print("stage 4")
|
|
dbg.print("")
|
|
|
|
if img_height == img_height_key and img_width == img_width_key:
|
|
dbg.print("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
|
|
dbg.print("!! The size of frame and img2img_key matched.")
|
|
dbg.print("!! You can skip this stage.")
|
|
|
|
dbg.print("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
|
|
dbg.print("0. Enable the following item")
|
|
dbg.print("Settings ->")
|
|
dbg.print(" Saving images/grids ->")
|
|
dbg.print(" Use original name for output filename during batch process in extras tab")
|
|
dbg.print("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
|
|
dbg.print("1. If \"img2img_upscale_key\" directory already exists in the %s, delete it manually before executing."%(project_dir))
|
|
dbg.print("2. Go to Extras tab")
|
|
dbg.print("3. Go to Batch from Directory tab")
|
|
dbg.print("4. Fill in the \"Input directory\" field with [" + img2img_key_path + "]" )
|
|
dbg.print("5. Fill in the \"Output directory\" field with [" + img2img_upscale_key_path + "]" )
|
|
dbg.print("6. Go to Scale to tab")
|
|
dbg.print("7. Fill in the \"Width\" field with [" + str(img_width) + "]" )
|
|
dbg.print("8. Fill in the \"Height\" field with [" + str(img_height) + "]" )
|
|
dbg.print("9. Fill in the remaining configuration fields of Upscaler.")
|
|
dbg.print("10. Generate")
|
|
dbg.print("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
|
|
return process_end( dbg, "" )
|
|
elif stage_index == 5:
|
|
ebsynth_utility_stage5(dbg, project_args, is_invert_mask)
|
|
elif stage_index == 6:
|
|
|
|
if is_invert_mask:
|
|
project_dir = inv_path
|
|
|
|
dbg.print("stage 6")
|
|
dbg.print("")
|
|
dbg.print("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
|
|
dbg.print("Running ebsynth.(on your self)")
|
|
dbg.print("Open the generated .ebs under %s and press [Run All] button."%(project_dir))
|
|
dbg.print("If ""out-*"" directory already exists in the %s, delete it manually before executing."%(project_dir))
|
|
dbg.print("If multiple .ebs files are generated, run them all.")
|
|
dbg.print("(I recommend associating the .ebs file with EbSynth.exe.)")
|
|
dbg.print("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
|
|
return process_end( dbg, "" )
|
|
elif stage_index == 7:
|
|
ebsynth_utility_stage7(dbg, project_args, blend_rate, export_type, is_invert_mask)
|
|
elif stage_index == 8:
|
|
if mask_mode != "Normal":
|
|
dbg.print("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
|
|
dbg.print("Please reset [configuration]->[etc]->[Mask Mode] to Normal.")
|
|
dbg.print("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
|
|
return process_end( dbg, "" )
|
|
ebsynth_utility_stage8(dbg, project_args, bg_src, bg_type, mask_blur_size, mask_threshold, fg_transparency, export_type)
|
|
else:
|
|
pass
|
|
|
|
return process_end( dbg, info )
|