|
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 ) |
|
|