|
import cv2 |
|
import re |
|
import os |
|
import glob |
|
import time |
|
|
|
from sys import byteorder |
|
import binascii |
|
import numpy as np |
|
|
|
SYNTHS_PER_PROJECT = 15 |
|
|
|
def to_float_bytes(f): |
|
if byteorder == 'little': |
|
return np.array([ float(f) ], dtype='<f4').tobytes() |
|
else: |
|
return np.array([ float(f) ], dtype='>f4').tobytes() |
|
|
|
def path2framenum(path): |
|
return int( os.path.splitext(os.path.basename( path ))[0] ) |
|
|
|
def search_key_dir(key_dir): |
|
frames = glob.glob( os.path.join(key_dir ,"[0-9]*.png"), recursive=False) |
|
|
|
frames = sorted(frames) |
|
|
|
basename = os.path.splitext(os.path.basename( frames[0] ))[0] |
|
|
|
key_list = [ path2framenum(key) for key in frames ] |
|
|
|
print("digits = " + str(len(basename))) |
|
print("keys = " + str(key_list)) |
|
|
|
return len(basename), key_list |
|
|
|
|
|
def search_video_dir(video_dir): |
|
frames = glob.glob( os.path.join(video_dir, "[0-9]*.png"), recursive=False) |
|
|
|
frames = sorted(frames) |
|
|
|
first = path2framenum( frames[0] ) |
|
last = path2framenum( frames[-1] ) |
|
|
|
return first, last |
|
|
|
def export_project( project, proj_filename ): |
|
|
|
proj_path = os.path.join( project["proj_dir"] , proj_filename + ".ebs") |
|
|
|
with open(proj_path, 'wb') as f: |
|
|
|
f.write( binascii.unhexlify('45') ) |
|
f.write( binascii.unhexlify('42') ) |
|
f.write( binascii.unhexlify('53') ) |
|
f.write( binascii.unhexlify('30') ) |
|
f.write( binascii.unhexlify('35') ) |
|
f.write( binascii.unhexlify('00') ) |
|
|
|
|
|
f.write( len( project["video_dir"] + project["file_name"]).to_bytes(4, byteorder) ) |
|
f.write( (project["video_dir"] + project["file_name"]).encode() ) |
|
|
|
|
|
if project["mask_dir"]: |
|
f.write( len( project["mask_dir"] + project["file_name"]).to_bytes(4, byteorder) ) |
|
f.write( (project["mask_dir"] + project["file_name"]).encode() ) |
|
else: |
|
f.write( int(0).to_bytes(4, byteorder) ) |
|
|
|
|
|
f.write( len( project["key_dir"] + project["file_name"]).to_bytes(4, byteorder) ) |
|
f.write( (project["key_dir"] + project["file_name"]).encode() ) |
|
|
|
|
|
if project["mask_dir"]: |
|
f.write( int(1).to_bytes(1, byteorder) ) |
|
else: |
|
f.write( int(0).to_bytes(1, byteorder) ) |
|
|
|
|
|
|
|
f.write( to_float_bytes( project["key_weight"] ) ) |
|
|
|
|
|
f.write( to_float_bytes( project["video_weight"] ) ) |
|
|
|
|
|
f.write( to_float_bytes( project["mask_weight"] ) ) |
|
|
|
|
|
f.write( to_float_bytes( project["adv_mapping"] ) ) |
|
|
|
|
|
f.write( to_float_bytes( project["adv_de-flicker"] ) ) |
|
|
|
|
|
f.write( to_float_bytes( project["adv_diversity"] ) ) |
|
|
|
|
|
|
|
f.write( len( project["synth_list"] ).to_bytes(4, byteorder) ) |
|
|
|
|
|
for synth in project["synth_list"]: |
|
|
|
f.write( int( synth["key"] ).to_bytes(4, byteorder) ) |
|
|
|
f.write( int(1).to_bytes(1, byteorder) ) |
|
|
|
f.write( int(1).to_bytes(1, byteorder) ) |
|
|
|
f.write( int( synth["prev_key"] ).to_bytes(4, byteorder) ) |
|
|
|
f.write( int( synth["next_key"] ).to_bytes(4, byteorder) ) |
|
|
|
|
|
path = "out-" + str(synth["key"]).zfill( project["number_of_digits"] ) + project["file_name"] |
|
f.write( len(path).to_bytes(4, byteorder) ) |
|
f.write( path.encode() ) |
|
|
|
|
|
f.write( binascii.unhexlify('56') ) |
|
f.write( binascii.unhexlify('30') ) |
|
f.write( binascii.unhexlify('32') ) |
|
f.write( binascii.unhexlify('00') ) |
|
|
|
|
|
f.write( int( project["adv_detail"] ).to_bytes(1, byteorder) ) |
|
|
|
|
|
f.write( binascii.unhexlify('00') ) |
|
f.write( binascii.unhexlify('00') ) |
|
f.write( binascii.unhexlify('00') ) |
|
|
|
|
|
f.write( int( project["adv_gpu"] ).to_bytes(1, byteorder) ) |
|
|
|
|
|
f.write( binascii.unhexlify('00') ) |
|
f.write( binascii.unhexlify('00') ) |
|
f.write( binascii.unhexlify('F0') ) |
|
f.write( binascii.unhexlify('41') ) |
|
f.write( binascii.unhexlify('C0') ) |
|
f.write( binascii.unhexlify('02') ) |
|
f.write( binascii.unhexlify('00') ) |
|
f.write( binascii.unhexlify('00') ) |
|
|
|
|
|
def rename_keys(key_dir): |
|
imgs = glob.glob(os.path.join(key_dir, "*.png"), recursive=False) |
|
|
|
if not imgs: |
|
print('no files in %s' % key_dir) |
|
return |
|
|
|
p = re.compile(r'([0-9]+).*\.png') |
|
|
|
for img in imgs: |
|
|
|
filename = os.path.basename(img) |
|
|
|
m = p.fullmatch(filename) |
|
|
|
if m: |
|
f = m.group(1) + ".png" |
|
dirname = os.path.dirname(img) |
|
os.rename(img, os.path.join(dirname, f)) |
|
|
|
def ebsynth_utility_stage5(dbg, project_args, is_invert_mask): |
|
dbg.print("stage5") |
|
dbg.print("") |
|
|
|
project_dir, _, frame_path, frame_mask_path, _, img2img_key_path, img2img_upscale_key_path = project_args |
|
|
|
if not os.path.isdir(project_dir): |
|
dbg.print('project_dir : no such dir %s' % project_dir) |
|
return |
|
if not os.path.isdir(frame_path): |
|
dbg.print('frame_path : no such dir %s' % frame_path) |
|
return |
|
|
|
no_upscale = False |
|
|
|
if not os.path.isdir(img2img_upscale_key_path): |
|
dbg.print('img2img_upscale_key_path : no such dir %s' % img2img_upscale_key_path) |
|
if not os.path.isdir(img2img_key_path): |
|
return |
|
|
|
sample_img2img_key = glob.glob( os.path.join(img2img_key_path , "*.png" ) )[0] |
|
img_height1, img_width1, _ = cv2.imread(sample_img2img_key).shape |
|
sample_frame = glob.glob( os.path.join(frame_path , "*.png" ) )[0] |
|
img_height2, img_width2, _ = cv2.imread(sample_frame).shape |
|
|
|
if img_height1 != img_height2 or img_width1 != img_width2: |
|
return |
|
|
|
dbg.print('The size of frame and img2img_key matched. use %s instead' % img2img_key_path) |
|
img2img_upscale_key_path = img2img_key_path |
|
no_upscale = True |
|
|
|
else: |
|
rename_keys(img2img_upscale_key_path) |
|
|
|
number_of_digits, keys = search_key_dir( img2img_upscale_key_path ) |
|
|
|
if number_of_digits == -1: |
|
dbg.print('no key frame') |
|
return |
|
|
|
first_frame, last_frame = search_video_dir( frame_path ) |
|
|
|
|
|
synth_list = [] |
|
next_key = last_frame |
|
|
|
for key in keys[::-1]: |
|
synth_list.append( { "next_key": next_key }) |
|
next_key = key |
|
|
|
synth_list = synth_list[::-1] |
|
prev_key = first_frame |
|
|
|
|
|
for i, key in enumerate(keys): |
|
synth_list[i]["key"] = key |
|
synth_list[i]["prev_key"] = prev_key |
|
prev_key = key |
|
|
|
project = { |
|
"proj_dir" : project_dir if is_invert_mask == False else os.path.join(project_dir, "inv"), |
|
"file_name" : "/[" + "#" * number_of_digits + "].png", |
|
"number_of_digits" : number_of_digits, |
|
|
|
"key_dir" : "img2img_upscale_key" if no_upscale == False else "img2img_key", |
|
"video_dir" : "video_frame" if is_invert_mask == False else "../video_frame", |
|
"mask_dir" : "video_mask" if is_invert_mask == False else "inv_video_mask", |
|
"key_weight" : 1.0, |
|
"video_weight" : 4.0, |
|
"mask_weight" : 1.0, |
|
"adv_mapping" : 10.0, |
|
"adv_de-flicker" : 1.0, |
|
"adv_diversity" : 3500.0, |
|
"adv_detail" : 1, |
|
"adv_gpu" : 1, |
|
} |
|
|
|
if not frame_mask_path: |
|
|
|
project["mask_dir"] = "" |
|
|
|
proj_base_name = time.strftime("%Y%m%d-%H%M%S") |
|
if is_invert_mask: |
|
proj_base_name = "inv_" + proj_base_name |
|
|
|
tmp=[] |
|
proj_index = 0 |
|
for i, synth in enumerate(synth_list): |
|
tmp.append(synth) |
|
if (i % SYNTHS_PER_PROJECT == SYNTHS_PER_PROJECT-1): |
|
project["synth_list"] = tmp |
|
proj_file_name = proj_base_name + "_" + str(proj_index).zfill(5) |
|
export_project( project, proj_file_name ) |
|
proj_index += 1 |
|
tmp = [] |
|
dbg.print("exported : " + proj_file_name + ".ebs" ) |
|
|
|
if tmp: |
|
project["synth_list"] = tmp |
|
proj_file_name = proj_base_name + "_" + str(proj_index).zfill(5) |
|
export_project( project, proj_file_name ) |
|
proj_index += 1 |
|
dbg.print("exported : " + proj_file_name + ".ebs" ) |
|
|
|
dbg.print("") |
|
dbg.print("completed.") |
|
|
|
|
|
|
|
|