Compare commits

...

5 Commits

Author SHA1 Message Date
Bhl0318 ec78c98be8
Merge 6c4cf425be into 88164c6303 2024-10-05 18:55:25 +05:30
KRSHH 88164c6303
Show FPS Switch 2024-10-05 17:39:41 +05:30
KRSHH a49d3fc6e5
Face Mapping fix 2024-10-05 15:00:00 +05:30
Kenneth Estanislao e531f6f26e improved performance enhancement
improved performance
2024-10-05 01:42:40 +08:00
Bhl0318 6c4cf425be up 2024-09-29 13:28:51 +08:00
4 changed files with 50 additions and 18 deletions

1
.gitignore vendored
View File

@ -24,3 +24,4 @@ models/GFPGANv1.4.pth
models/DMDNet.pth models/DMDNet.pth
faceswap/ faceswap/
.vscode/ .vscode/
/ffmpeg-7.0.2-full_build

View File

@ -34,5 +34,4 @@ headless = None
log_level = 'error' log_level = 'error'
fp_ui: Dict[str, bool] = {} fp_ui: Dict[str, bool] = {}
camera_input_combobox = None camera_input_combobox = None
webcam_preview_running = False webcam_preview_running = False
opacity = 100

View File

@ -18,7 +18,7 @@ NAME = 'DLC.FACE-SWAPPER'
def pre_check() -> bool: def pre_check() -> bool:
download_directory_path = resolve_relative_path('../models') download_directory_path = resolve_relative_path('../models')
conditional_download(download_directory_path, ['https://huggingface.co/hacksider/deep-live-cam/blob/main/inswapper_128.onnx']) conditional_download(download_directory_path, ['https://huggingface.co/hacksider/deep-live-cam/blob/main/inswapper_128_fp16.onnx'])
return True return True
@ -40,7 +40,7 @@ def get_face_swapper() -> Any:
with THREAD_LOCK: with THREAD_LOCK:
if FACE_SWAPPER is None: if FACE_SWAPPER is None:
model_path = resolve_relative_path('../models/inswapper_128.onnx') model_path = resolve_relative_path('../models/inswapper_128_fp16.onnx')
FACE_SWAPPER = insightface.model_zoo.get_model(model_path, providers=modules.globals.execution_providers) FACE_SWAPPER = insightface.model_zoo.get_model(model_path, providers=modules.globals.execution_providers)
return FACE_SWAPPER return FACE_SWAPPER

View File

@ -5,7 +5,7 @@ from typing import Callable, Tuple
import cv2 import cv2
from cv2_enumerate_cameras import enumerate_cameras # Add this import from cv2_enumerate_cameras import enumerate_cameras # Add this import
from PIL import Image, ImageOps from PIL import Image, ImageOps
import time
import modules.globals import modules.globals
import modules.metadata import modules.metadata
from modules.face_analyser import ( from modules.face_analyser import (
@ -81,7 +81,7 @@ def init(start: Callable[[], None], destroy: Callable[[], None]) -> ctk.CTk:
def create_root(start: Callable[[], None], destroy: Callable[[], None]) -> ctk.CTk: def create_root(start: Callable[[], None], destroy: Callable[[], None]) -> ctk.CTk:
global source_label, target_label, status_label global source_label, target_label, status_label, show_fps_switch
ctk.deactivate_automatic_dpi_awareness() ctk.deactivate_automatic_dpi_awareness()
ctk.set_appearance_mode("system") ctk.set_appearance_mode("system")
@ -201,6 +201,17 @@ def create_root(start: Callable[[], None], destroy: Callable[[], None]) -> ctk.C
) )
map_faces_switch.place(relx=0.1, rely=0.75) map_faces_switch.place(relx=0.1, rely=0.75)
# Add Show FPS switch
show_fps_value = ctk.BooleanVar(value=False)
show_fps_switch = ctk.CTkSwitch(
root,
text="Show FPS",
variable=show_fps_value,
cursor="hand2",
command=lambda: setattr(modules.globals, "show_fps", show_fps_value.get()),
)
show_fps_switch.place(relx=0.6, rely=0.75)
start_button = ctk.CTkButton( start_button = ctk.CTkButton(
root, text="Start", cursor="hand2", command=lambda: analyze_target(start, root) root, text="Start", cursor="hand2", command=lambda: analyze_target(start, root)
) )
@ -492,12 +503,13 @@ def swap_faces_paths() -> None:
def select_target_path() -> None: def select_target_path() -> None:
global RECENT_DIRECTORY_TARGET, img_ft, vid_ft global RECENT_DIRECTORY_TARGET, img_ft, vid_ft
combined_types = ('Media',(img_ft[-1] + vid_ft[-1])
)
PREVIEW.withdraw() PREVIEW.withdraw()
target_path = ctk.filedialog.askopenfilename( target_path = ctk.filedialog.askopenfilename(
title="select an target image or video", title="select an target image or video",
initialdir=RECENT_DIRECTORY_TARGET, initialdir=RECENT_DIRECTORY_TARGET,
filetypes=[img_ft, vid_ft], filetypes=[combined_types],
) )
if is_image(target_path): if is_image(target_path):
modules.globals.target_path = target_path modules.globals.target_path = target_path
@ -641,17 +653,17 @@ def update_preview(frame_number: int = 0) -> None:
PREVIEW.deiconify() PREVIEW.deiconify()
def webcam_preview(root: ctk.CTk, camera_index: int): # Added camera_index parameter def webcam_preview(root: ctk.CTk, camera_index: int):
if not modules.globals.map_faces: if not modules.globals.map_faces:
if modules.globals.source_path is None: if modules.globals.source_path is None:
# No image selected # No image selected
return return
create_webcam_preview( create_webcam_preview(camera_index)
camera_index
) # Pass camera_index to create_webcam_preview
else: else:
modules.globals.souce_target_map = [] modules.globals.souce_target_map = []
create_source_target_popup_for_webcam(root, modules.globals.souce_target_map) create_source_target_popup_for_webcam(
root, modules.globals.souce_target_map, camera_index
)
def get_available_cameras(): def get_available_cameras():
@ -668,10 +680,10 @@ def get_available_cameras():
return (camera_indices, camera_names) return (camera_indices, camera_names)
def create_webcam_preview(camera_index: int): # Added camera_index parameter def create_webcam_preview(camera_index: int):
global preview_label, PREVIEW global preview_label, PREVIEW
camera = cv2.VideoCapture(camera_index) # Use the provided camera index camera = cv2.VideoCapture(camera_index)
camera.set(cv2.CAP_PROP_FRAME_WIDTH, PREVIEW_DEFAULT_WIDTH) camera.set(cv2.CAP_PROP_FRAME_WIDTH, PREVIEW_DEFAULT_WIDTH)
camera.set(cv2.CAP_PROP_FRAME_HEIGHT, PREVIEW_DEFAULT_HEIGHT) camera.set(cv2.CAP_PROP_FRAME_HEIGHT, PREVIEW_DEFAULT_HEIGHT)
camera.set(cv2.CAP_PROP_FPS, 60) camera.set(cv2.CAP_PROP_FPS, 60)
@ -683,6 +695,8 @@ def create_webcam_preview(camera_index: int): # Added camera_index parameter
frame_processors = get_frame_processors_modules(modules.globals.frame_processors) frame_processors = get_frame_processors_modules(modules.globals.frame_processors)
source_image = None source_image = None
prev_time = time.time()
fps = 0
while camera: while camera:
ret, frame = camera.read() ret, frame = camera.read()
@ -711,6 +725,22 @@ def create_webcam_preview(camera_index: int): # Added camera_index parameter
for frame_processor in frame_processors: for frame_processor in frame_processors:
temp_frame = frame_processor.process_frame_v2(temp_frame) temp_frame = frame_processor.process_frame_v2(temp_frame)
# Calculate and display FPS
current_time = time.time()
fps = 1 / (current_time - prev_time)
prev_time = current_time
if modules.globals.show_fps:
cv2.putText(
temp_frame,
f"FPS: {fps:.2f}",
(10, 30),
cv2.FONT_HERSHEY_SIMPLEX,
1,
(0, 255, 0),
2,
)
image = cv2.cvtColor(temp_frame, cv2.COLOR_BGR2RGB) image = cv2.cvtColor(temp_frame, cv2.COLOR_BGR2RGB)
image = Image.fromarray(image) image = Image.fromarray(image)
image = ImageOps.contain( image = ImageOps.contain(
@ -727,7 +757,9 @@ def create_webcam_preview(camera_index: int): # Added camera_index parameter
PREVIEW.withdraw() PREVIEW.withdraw()
def create_source_target_popup_for_webcam(root: ctk.CTk, map: list) -> None: def create_source_target_popup_for_webcam(
root: ctk.CTk, map: list, camera_index: int
) -> None:
global POPUP_LIVE, popup_status_label_live global POPUP_LIVE, popup_status_label_live
POPUP_LIVE = ctk.CTkToplevel(root) POPUP_LIVE = ctk.CTkToplevel(root)
@ -739,9 +771,9 @@ def create_source_target_popup_for_webcam(root: ctk.CTk, map: list) -> None:
if has_valid_map(): if has_valid_map():
POPUP_LIVE.destroy() POPUP_LIVE.destroy()
simplify_maps() simplify_maps()
create_webcam_preview() create_webcam_preview(camera_index)
else: else:
update_pop_live_status("Atleast 1 source with target is required!") update_pop_live_status("At least 1 source with target is required!")
def on_add_click(): def on_add_click():
add_blank_map() add_blank_map()