app.py
Browse files
app.py
CHANGED
@@ -26,7 +26,7 @@ from utils import trim_video, StreamerThread, ProcessBar, open_directory, split_
|
|
26 |
|
27 |
## ------------------------------ USER ARGS ------------------------------
|
28 |
|
29 |
-
parser = argparse.ArgumentParser(description="
|
30 |
parser.add_argument("--out_dir", help="Default Output directory", default=os.getcwd())
|
31 |
parser.add_argument("--batch_size", help="Gpu batch size", default=32)
|
32 |
parser.add_argument("--cuda", action="store_true", help="Enable cuda", default=False)
|
@@ -183,27 +183,27 @@ def process(
|
|
183 |
|
184 |
start_time = time.time()
|
185 |
total_exec_time = lambda start_time: divmod(time.time() - start_time, 60)
|
186 |
-
get_finsh_text = lambda start_time: f"
|
187 |
|
188 |
## ------------------------------ PREPARE INPUTS & LOAD MODELS ------------------------------
|
189 |
|
190 |
|
191 |
|
192 |
-
yield "### \n
|
193 |
load_face_analyser_model()
|
194 |
|
195 |
-
yield "### \n
|
196 |
load_face_swapper_model()
|
197 |
|
198 |
if face_enhancer_name != "NONE":
|
199 |
if face_enhancer_name not in cv2_interpolations:
|
200 |
-
yield f"### \n
|
201 |
FACE_ENHANCER = load_face_enhancer_model(name=face_enhancer_name, device=device)
|
202 |
else:
|
203 |
FACE_ENHANCER = None
|
204 |
|
205 |
if enable_face_parser:
|
206 |
-
yield "### \n
|
207 |
load_face_parser_model()
|
208 |
|
209 |
includes = mask_regions_to_list(mask_includes)
|
@@ -221,7 +221,7 @@ def process(
|
|
221 |
## ------------------------------ CONTENT CHECK ------------------------------
|
222 |
|
223 |
|
224 |
-
yield "### \n
|
225 |
if condition != "Specific Face":
|
226 |
source_data = source_path, age
|
227 |
else:
|
@@ -237,7 +237,7 @@ def process(
|
|
237 |
|
238 |
## ------------------------------ SWAP FUNC ------------------------------
|
239 |
|
240 |
-
yield "### \n
|
241 |
preds = []
|
242 |
matrs = []
|
243 |
count = 0
|
@@ -251,13 +251,13 @@ def process(
|
|
251 |
if USE_CUDA:
|
252 |
image_grid = create_image_grid(batch_pred, size=128)
|
253 |
PREVIEW = image_grid[:, :, ::-1]
|
254 |
-
yield f"### \n
|
255 |
|
256 |
## ------------------------------ FACE ENHANCEMENT ------------------------------
|
257 |
|
258 |
generated_len = len(preds)
|
259 |
if face_enhancer_name != "NONE":
|
260 |
-
yield f"### \n
|
261 |
for idx, pred in tqdm(enumerate(preds), total=generated_len, desc=f"Upscaling with {face_enhancer_name}"):
|
262 |
enhancer_model, enhancer_model_runner = FACE_ENHANCER
|
263 |
pred = enhancer_model_runner(pred, enhancer_model)
|
@@ -267,7 +267,7 @@ def process(
|
|
267 |
## ------------------------------ FACE PARSING ------------------------------
|
268 |
|
269 |
if enable_face_parser:
|
270 |
-
yield "### \n
|
271 |
masks = []
|
272 |
count = 0
|
273 |
for batch_mask in get_parsed_mask(FACE_PARSER, preds, classes=includes, device=device, batch_size=BATCH_SIZE, softness=int(mask_soft_iterations)):
|
@@ -278,7 +278,7 @@ def process(
|
|
278 |
if len(batch_mask) > 1:
|
279 |
image_grid = create_image_grid(batch_mask, size=128)
|
280 |
PREVIEW = image_grid[:, :, ::-1]
|
281 |
-
yield f"### \n
|
282 |
masks = np.concatenate(masks, axis=0) if len(masks) >= 1 else masks
|
283 |
else:
|
284 |
masks = [None] * generated_len
|
@@ -294,7 +294,7 @@ def process(
|
|
294 |
|
295 |
## ------------------------------ PASTE-BACK ------------------------------
|
296 |
|
297 |
-
yield "### \n
|
298 |
def post_process(frame_idx, frame_img, split_preds, split_matrs, split_masks, enable_laplacian_blend, crop_mask, blur_amount, erode_amount):
|
299 |
whole_img_path = frame_img
|
300 |
whole_img = cv2.imread(whole_img_path)
|
@@ -350,7 +350,7 @@ def process(
|
|
350 |
temp_path = os.path.join(output_path, output_name, "sequence")
|
351 |
os.makedirs(temp_path, exist_ok=True)
|
352 |
|
353 |
-
yield "### \n
|
354 |
image_sequence = []
|
355 |
cap = cv2.VideoCapture(video_path)
|
356 |
curr_idx = 0
|
@@ -367,12 +367,12 @@ def process(
|
|
367 |
for info_update in swap_process(image_sequence):
|
368 |
yield info_update
|
369 |
|
370 |
-
yield "### \n
|
371 |
output_video_path = os.path.join(output_path, output_name + ".mp4")
|
372 |
merge_img_sequence_from_ref(video_path, image_sequence, output_video_path)
|
373 |
|
374 |
if os.path.exists(temp_path) and not keep_output_sequence:
|
375 |
-
yield "### \n
|
376 |
shutil.rmtree(temp_path)
|
377 |
|
378 |
WORKSPACE = output_path
|
@@ -490,7 +490,7 @@ def video_changed(video_path):
|
|
490 |
|
491 |
|
492 |
def analyse_settings_changed(detect_condition, detection_size, detection_threshold):
|
493 |
-
yield "### \n
|
494 |
global FACE_ANALYSER
|
495 |
global DETECT_CONDITION
|
496 |
DETECT_CONDITION = detect_condition
|
@@ -500,7 +500,7 @@ def analyse_settings_changed(detect_condition, detection_size, detection_thresho
|
|
500 |
det_size=(int(detection_size), int(detection_size)),
|
501 |
det_thresh=float(detection_threshold),
|
502 |
)
|
503 |
-
yield f"### \n
|
504 |
|
505 |
|
506 |
def stop_running():
|
@@ -526,14 +526,14 @@ def slider_changed(show_frame, video_path, frame_index):
|
|
526 |
|
527 |
|
528 |
def trim_and_reload(video_path, output_path, output_name, start_frame, stop_frame):
|
529 |
-
yield video_path, f"### \n
|
530 |
try:
|
531 |
output_path = os.path.join(output_path, output_name)
|
532 |
trimmed_video = trim_video(video_path, output_path, start_frame, stop_frame)
|
533 |
-
yield trimmed_video, "### \n
|
534 |
except Exception as e:
|
535 |
print(e)
|
536 |
-
yield video_path, "### \n
|
537 |
|
538 |
|
539 |
## ------------------------------ GRADIO GUI ------------------------------
|
@@ -543,15 +543,15 @@ footer{display:none !important}
|
|
543 |
"""
|
544 |
|
545 |
with gr.Blocks(css=css) as interface:
|
546 |
-
gr.Markdown("#
|
547 |
-
gr.Markdown("###
|
548 |
with gr.Row():
|
549 |
with gr.Row():
|
550 |
with gr.Column(scale=0.4):
|
551 |
-
with gr.Tab("
|
552 |
swap_option = gr.Dropdown(
|
553 |
swap_options_list,
|
554 |
-
info="
|
555 |
multiselect=False,
|
556 |
show_label=False,
|
557 |
value=swap_options_list[0],
|
@@ -561,13 +561,13 @@ with gr.Blocks(css=css) as interface:
|
|
561 |
value=25, label="Value", interactive=True, visible=False
|
562 |
)
|
563 |
|
564 |
-
with gr.Tab("
|
565 |
detect_condition_dropdown = gr.Dropdown(
|
566 |
detect_conditions,
|
567 |
label="Condition",
|
568 |
value=DETECT_CONDITION,
|
569 |
interactive=True,
|
570 |
-
info="
|
571 |
)
|
572 |
detection_size = gr.Number(
|
573 |
label="Detection Size", value=DETECT_SIZE, interactive=True
|
@@ -579,7 +579,7 @@ with gr.Blocks(css=css) as interface:
|
|
579 |
)
|
580 |
apply_detection_settings = gr.Button("Apply settings")
|
581 |
|
582 |
-
with gr.Tab("
|
583 |
output_directory = gr.Text(
|
584 |
label="Output Directory",
|
585 |
value=DEF_OUTPUT_PATH,
|
@@ -592,7 +592,7 @@ with gr.Blocks(css=css) as interface:
|
|
592 |
label="Keep output sequence", value=False, interactive=True
|
593 |
)
|
594 |
|
595 |
-
with gr.Tab("
|
596 |
face_scale = gr.Slider(
|
597 |
label="Face Scale",
|
598 |
minimum=0,
|
@@ -668,7 +668,7 @@ with gr.Blocks(css=css) as interface:
|
|
668 |
|
669 |
|
670 |
source_image_input = gr.Image(
|
671 |
-
label="
|
672 |
)
|
673 |
|
674 |
with gr.Box(visible=False) as specific_face:
|
@@ -699,15 +699,15 @@ with gr.Blocks(css=css) as interface:
|
|
699 |
|
700 |
with gr.Box(visible=True) as input_image_group:
|
701 |
image_input = gr.Image(
|
702 |
-
label="
|
703 |
)
|
704 |
|
705 |
with gr.Box(visible=False) as input_video_group:
|
706 |
vid_widget = gr.Video if USE_COLAB else gr.Text
|
707 |
video_input = gr.Video(
|
708 |
-
label="
|
709 |
)
|
710 |
-
with gr.Accordion("
|
711 |
with gr.Column():
|
712 |
with gr.Row():
|
713 |
set_slider_range_btn = gr.Button(
|
@@ -754,38 +754,35 @@ with gr.Blocks(css=css) as interface:
|
|
754 |
info = gr.Markdown(value="...")
|
755 |
|
756 |
with gr.Row():
|
757 |
-
swap_button = gr.Button("
|
758 |
-
cancel_button = gr.Button("
|
759 |
|
760 |
-
preview_image = gr.Image(label="Output", interactive=False)
|
761 |
preview_video = gr.Video(
|
762 |
label="Output", interactive=False, visible=False
|
763 |
)
|
764 |
|
765 |
with gr.Row():
|
766 |
output_directory_button = gr.Button(
|
767 |
-
"
|
768 |
)
|
769 |
output_video_button = gr.Button(
|
770 |
-
"
|
771 |
)
|
772 |
|
773 |
with gr.Box():
|
774 |
with gr.Row():
|
775 |
gr.Markdown(
|
776 |
-
"
|
777 |
)
|
778 |
gr.Markdown(
|
779 |
-
"
|
780 |
)
|
781 |
gr.Markdown(
|
782 |
-
"
|
783 |
)
|
784 |
gr.Markdown(
|
785 |
-
"
|
786 |
-
)
|
787 |
-
gr.Markdown(
|
788 |
-
"### [🤗 Acknowledgements](https://github.com/harisreedhar/Swap-Mukham#acknowledgements)"
|
789 |
)
|
790 |
|
791 |
## ------------------------------ GRADIO EVENTS ------------------------------
|
@@ -903,4 +900,4 @@ if __name__ == "__main__":
|
|
903 |
if USE_COLAB:
|
904 |
print("Running in colab mode")
|
905 |
|
906 |
-
interface.queue(concurrency_count=2, max_size=20).launch(share=USE_COLAB)
|
|
|
26 |
|
27 |
## ------------------------------ USER ARGS ------------------------------
|
28 |
|
29 |
+
parser = argparse.ArgumentParser(description="FSawap-BypassNSFW")
|
30 |
parser.add_argument("--out_dir", help="Default Output directory", default=os.getcwd())
|
31 |
parser.add_argument("--batch_size", help="Gpu batch size", default=32)
|
32 |
parser.add_argument("--cuda", action="store_true", help="Enable cuda", default=False)
|
|
|
183 |
|
184 |
start_time = time.time()
|
185 |
total_exec_time = lambda start_time: divmod(time.time() - start_time, 60)
|
186 |
+
get_finsh_text = lambda start_time: f"📌 Completed in {int(total_exec_time(start_time)[0])} min {int(total_exec_time(start_time)[1])} sec."
|
187 |
|
188 |
## ------------------------------ PREPARE INPUTS & LOAD MODELS ------------------------------
|
189 |
|
190 |
|
191 |
|
192 |
+
yield "### \n â° Loading face analyser model...", *ui_before()
|
193 |
load_face_analyser_model()
|
194 |
|
195 |
+
yield "### \n â° model မျက်နှာဖလှယ်နေá€á€šá€º...", *ui_before()
|
196 |
load_face_swapper_model()
|
197 |
|
198 |
if face_enhancer_name != "NONE":
|
199 |
if face_enhancer_name not in cv2_interpolations:
|
200 |
+
yield f"### \n ⌛ Loading {face_enhancer_name} model...", *ui_before()
|
201 |
FACE_ENHANCER = load_face_enhancer_model(name=face_enhancer_name, device=device)
|
202 |
else:
|
203 |
FACE_ENHANCER = None
|
204 |
|
205 |
if enable_face_parser:
|
206 |
+
yield "### \n ⰠLoading model မျက်နှာစီစဉ်နေပါပြီ...", *ui_before()
|
207 |
load_face_parser_model()
|
208 |
|
209 |
includes = mask_regions_to_list(mask_includes)
|
|
|
221 |
## ------------------------------ CONTENT CHECK ------------------------------
|
222 |
|
223 |
|
224 |
+
yield "### \n 🔮 Face data á€á€½á€±á€…ီစဉ်နေပြီ...", *ui_before()
|
225 |
if condition != "Specific Face":
|
226 |
source_data = source_path, age
|
227 |
else:
|
|
|
237 |
|
238 |
## ------------------------------ SWAP FUNC ------------------------------
|
239 |
|
240 |
+
yield "### \n 🩵 Face ကá€á€¯á€–န်á€á€®á€¸á€”ေပါပြီ...", *ui_before()
|
241 |
preds = []
|
242 |
matrs = []
|
243 |
count = 0
|
|
|
251 |
if USE_CUDA:
|
252 |
image_grid = create_image_grid(batch_pred, size=128)
|
253 |
PREVIEW = image_grid[:, :, ::-1]
|
254 |
+
yield f"### \n 🧲 face Batch ပြုလုပ်နေပါပြီ...{count}", *ui_before()
|
255 |
|
256 |
## ------------------------------ FACE ENHANCEMENT ------------------------------
|
257 |
|
258 |
generated_len = len(preds)
|
259 |
if face_enhancer_name != "NONE":
|
260 |
+
yield f"### \n 🎀 Upscaling faces with {face_enhancer_name}...", *ui_before()
|
261 |
for idx, pred in tqdm(enumerate(preds), total=generated_len, desc=f"Upscaling with {face_enhancer_name}"):
|
262 |
enhancer_model, enhancer_model_runner = FACE_ENHANCER
|
263 |
pred = enhancer_model_runner(pred, enhancer_model)
|
|
|
267 |
## ------------------------------ FACE PARSING ------------------------------
|
268 |
|
269 |
if enable_face_parser:
|
270 |
+
yield "### \n 🎠Face-parsing mask...", *ui_before()
|
271 |
masks = []
|
272 |
count = 0
|
273 |
for batch_mask in get_parsed_mask(FACE_PARSER, preds, classes=includes, device=device, batch_size=BATCH_SIZE, softness=int(mask_soft_iterations)):
|
|
|
278 |
if len(batch_mask) > 1:
|
279 |
image_grid = create_image_grid(batch_mask, size=128)
|
280 |
PREVIEW = image_grid[:, :, ::-1]
|
281 |
+
yield f"### \n 🎯 Face parsing Batch {count}", *ui_before()
|
282 |
masks = np.concatenate(masks, axis=0) if len(masks) >= 1 else masks
|
283 |
else:
|
284 |
masks = [None] * generated_len
|
|
|
294 |
|
295 |
## ------------------------------ PASTE-BACK ------------------------------
|
296 |
|
297 |
+
yield "### \n 🛑 Pasting ပြုလုပ်နေပြီ...", *ui_before()
|
298 |
def post_process(frame_idx, frame_img, split_preds, split_matrs, split_masks, enable_laplacian_blend, crop_mask, blur_amount, erode_amount):
|
299 |
whole_img_path = frame_img
|
300 |
whole_img = cv2.imread(whole_img_path)
|
|
|
350 |
temp_path = os.path.join(output_path, output_name, "sequence")
|
351 |
os.makedirs(temp_path, exist_ok=True)
|
352 |
|
353 |
+
yield "### \n 🚀 Extracting video frames...", *ui_before()
|
354 |
image_sequence = []
|
355 |
cap = cv2.VideoCapture(video_path)
|
356 |
curr_idx = 0
|
|
|
367 |
for info_update in swap_process(image_sequence):
|
368 |
yield info_update
|
369 |
|
370 |
+
yield "### \n ðŸ“½ï¸ Merging sequence...", *ui_before()
|
371 |
output_video_path = os.path.join(output_path, output_name + ".mp4")
|
372 |
merge_img_sequence_from_ref(video_path, image_sequence, output_video_path)
|
373 |
|
374 |
if os.path.exists(temp_path) and not keep_output_sequence:
|
375 |
+
yield "### \n 🎠Removing temporary files...", *ui_before()
|
376 |
shutil.rmtree(temp_path)
|
377 |
|
378 |
WORKSPACE = output_path
|
|
|
490 |
|
491 |
|
492 |
def analyse_settings_changed(detect_condition, detection_size, detection_threshold):
|
493 |
+
yield "### \n 🔋 Applying new values..."
|
494 |
global FACE_ANALYSER
|
495 |
global DETECT_CONDITION
|
496 |
DETECT_CONDITION = detect_condition
|
|
|
500 |
det_size=(int(detection_size), int(detection_size)),
|
501 |
det_thresh=float(detection_threshold),
|
502 |
)
|
503 |
+
yield f"### \n 📌 Applied detect condition:{detect_condition}, detection size: {detection_size}, detection threshold: {detection_threshold}"
|
504 |
|
505 |
|
506 |
def stop_running():
|
|
|
526 |
|
527 |
|
528 |
def trim_and_reload(video_path, output_path, output_name, start_frame, stop_frame):
|
529 |
+
yield video_path, f"### \n ðŸ› ï¸ Trimming video frame {start_frame} to {stop_frame}..."
|
530 |
try:
|
531 |
output_path = os.path.join(output_path, output_name)
|
532 |
trimmed_video = trim_video(video_path, output_path, start_frame, stop_frame)
|
533 |
+
yield trimmed_video, "### \n ✂ï¸âœ‚ï¸ Video trimmed and reloaded."
|
534 |
except Exception as e:
|
535 |
print(e)
|
536 |
+
yield video_path, "### \n 🔴 Video trimming failed. See console for more info."
|
537 |
|
538 |
|
539 |
## ------------------------------ GRADIO GUI ------------------------------
|
|
|
543 |
"""
|
544 |
|
545 |
with gr.Blocks(css=css) as interface:
|
546 |
+
gr.Markdown("# 💞 GeepDeep 💞")
|
547 |
+
gr.Markdown("### FaceSwap app အား 🗂ï¸insightface inswapperðŸ—‚ï¸ á€–á€¼á€„á€·á€ºá€–á€”á€ºá€á€®á€¸á€•ါသည်.")
|
548 |
with gr.Row():
|
549 |
with gr.Row():
|
550 |
with gr.Column(scale=0.4):
|
551 |
+
with gr.Tab("💟 Swap Condition"):
|
552 |
swap_option = gr.Dropdown(
|
553 |
swap_options_list,
|
554 |
+
info="🎛ï¸á€•ြောင်းလဲလá€á€¯á€žá€Šá€·á€º မျက်နှာ အနေအထားအား ရွေးá€á€»á€šá€ºá€•ါ🎛ï¸.",
|
555 |
multiselect=False,
|
556 |
show_label=False,
|
557 |
value=swap_options_list[0],
|
|
|
561 |
value=25, label="Value", interactive=True, visible=False
|
562 |
)
|
563 |
|
564 |
+
with gr.Tab("👌 Detection Settings"):
|
565 |
detect_condition_dropdown = gr.Dropdown(
|
566 |
detect_conditions,
|
567 |
label="Condition",
|
568 |
value=DETECT_CONDITION,
|
569 |
interactive=True,
|
570 |
+
info="👫 မျက်နှာနှစ်á€á€¯á€›á€½á€±á€¸á€›á€”်အá€á€½á€€á€ºá€–ြစ်သည်áŠðŸ‘«.",
|
571 |
)
|
572 |
detection_size = gr.Number(
|
573 |
label="Detection Size", value=DETECT_SIZE, interactive=True
|
|
|
579 |
)
|
580 |
apply_detection_settings = gr.Button("Apply settings")
|
581 |
|
582 |
+
with gr.Tab("🌠Output Settings"):
|
583 |
output_directory = gr.Text(
|
584 |
label="Output Directory",
|
585 |
value=DEF_OUTPUT_PATH,
|
|
|
592 |
label="Keep output sequence", value=False, interactive=True
|
593 |
)
|
594 |
|
595 |
+
with gr.Tab("👠Other Settings"):
|
596 |
face_scale = gr.Slider(
|
597 |
label="Face Scale",
|
598 |
minimum=0,
|
|
|
668 |
|
669 |
|
670 |
source_image_input = gr.Image(
|
671 |
+
label="ðŸá€¡á€žá€¯á€¶á€¸á€•ြုမည့်မျက်နှာðŸ", type="filepath", interactive=True
|
672 |
)
|
673 |
|
674 |
with gr.Box(visible=False) as specific_face:
|
|
|
699 |
|
700 |
with gr.Box(visible=True) as input_image_group:
|
701 |
image_input = gr.Image(
|
702 |
+
label="📸 ပြောင်းလဲလá€á€¯á€žá€Šá€ºá€·á€™á€»á€€á€ºá€”ှာ 📸", interactive=True, type="filepath"
|
703 |
)
|
704 |
|
705 |
with gr.Box(visible=False) as input_video_group:
|
706 |
vid_widget = gr.Video if USE_COLAB else gr.Text
|
707 |
video_input = gr.Video(
|
708 |
+
label="🖥ï¸á€•ြောင်းမည့်video🖥ï¸", interactive=True
|
709 |
)
|
710 |
+
with gr.Accordion("âœ‚ï¸ video á€á€Šá€ºá€¸á€–ြá€á€ºá€›á€”်", open=False):
|
711 |
with gr.Column():
|
712 |
with gr.Row():
|
713 |
set_slider_range_btn = gr.Button(
|
|
|
754 |
info = gr.Markdown(value="...")
|
755 |
|
756 |
with gr.Row():
|
757 |
+
swap_button = gr.Button("💗 Swap 💕", variant="primary")
|
758 |
+
cancel_button = gr.Button("💔 Cancel 💔")
|
759 |
|
760 |
+
preview_image = gr.Image(label="💕Output💕", interactive=False)
|
761 |
preview_video = gr.Video(
|
762 |
label="Output", interactive=False, visible=False
|
763 |
)
|
764 |
|
765 |
with gr.Row():
|
766 |
output_directory_button = gr.Button(
|
767 |
+
"🗂ï¸", interactive=False, visible=False
|
768 |
)
|
769 |
output_video_button = gr.Button(
|
770 |
+
"📽ï¸", interactive=False, visible=False
|
771 |
)
|
772 |
|
773 |
with gr.Box():
|
774 |
with gr.Row():
|
775 |
gr.Markdown(
|
776 |
+
"[🆚မူရင်းကုဒ်](https://huggingface.co/spaces/victorisgeek/SwapYoFace)"
|
777 |
)
|
778 |
gr.Markdown(
|
779 |
+
"[🚨ရှင်းလင်းá€á€»á€€á€º ကြည့်ကျက်လုပ်လá€á€¯á€€á€º]"
|
780 |
)
|
781 |
gr.Markdown(
|
782 |
+
"[🧿 Run in Colab](https://colab.research.google.com/github/victorgeel/FaceSwapNoNfsw)"
|
783 |
)
|
784 |
gr.Markdown(
|
785 |
+
"[💥🖕မအေလá€á€¯á€¸á€™á€„်းအောင်လှá€á€¯á€„်🖕💥]"
|
|
|
|
|
|
|
786 |
)
|
787 |
|
788 |
## ------------------------------ GRADIO EVENTS ------------------------------
|
|
|
900 |
if USE_COLAB:
|
901 |
print("Running in colab mode")
|
902 |
|
903 |
+
interface.queue(concurrency_count=2, max_size=20).launch(share=USE_COLAB)
|