diff --git a/core/config.py b/core/config.py index bbaad5e..151ad33 100644 --- a/core/config.py +++ b/core/config.py @@ -1,5 +1,4 @@ import insightface -import onnxruntime import core.globals face_analyser = insightface.app.FaceAnalysis(name='buffalo_l', providers=core.globals.providers) diff --git a/core/globals.py b/core/globals.py index 83d7277..cbd26c2 100644 --- a/core/globals.py +++ b/core/globals.py @@ -1,4 +1,4 @@ import onnxruntime use_gpu = False -providers = onnxruntime.get_available_providers() +providers = onnxruntime.get_available_providers() diff --git a/core/processor.py b/core/processor.py index eb75975..d67b1cf 100644 --- a/core/processor.py +++ b/core/processor.py @@ -1,11 +1,14 @@ +import os import cv2 import insightface -import onnxruntime import core.globals from core.config import get_face from core.utils import rreplace -face_swapper = insightface.model_zoo.get_model('inswapper_128.onnx', providers=core.globals.providers) +if os.path.isfile('inswapper_128.onnx'): + face_swapper = insightface.model_zoo.get_model('inswapper_128.onnx', providers=core.globals.providers) +else: + quit('File "inswapper_128.onnx" does not exist!') def process_video(source_img, frame_paths): @@ -23,7 +26,7 @@ def process_video(source_img, frame_paths): except Exception as e: print('E', end='', flush=True) pass - print(flush=True) + def process_img(source_img, target_path): frame = cv2.imread(target_path) diff --git a/core/utils.py b/core/utils.py index 9c5cd75..228d83b 100644 --- a/core/utils.py +++ b/core/utils.py @@ -17,6 +17,7 @@ def run_command(command, mode="silent"): return os.system(command) return os.popen(command).read() + def detect_fps(input_path): input_path = path(input_path) output = os.popen(f'ffprobe -v error -select_streams v -of default=noprint_wrappers=1:nokey=1 -show_entries stream=r_frame_rate "{input_path}"').read() @@ -58,6 +59,7 @@ def add_audio(output_dir, target_path, keep_frames, output_file): def is_img(path): return path.lower().endswith(("png", "jpg", "jpeg", "bmp")) + def rreplace(s, old, new, occurrence): li = s.rsplit(old, occurrence) return new.join(li) diff --git a/requirements.txt b/requirements.txt index b4d8baa..96153a2 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,7 +1,8 @@ numpy==1.24.3 opencv-python==4.7.0.72 onnx==1.14.0 -onnxruntime==1.15.0 +onnxruntime-gpu==1.15.0 insightface==0.7.3 psutil==5.9.5 tk==0.1.0 +torch==2.0.1 \ No newline at end of file diff --git a/run.py b/run.py old mode 100644 new mode 100755 index ce1b9e3..ac67feb --- a/run.py +++ b/run.py @@ -1,4 +1,7 @@ +#!/usr/bin/env python3 import sys +import time +import torch import shutil import core.globals @@ -31,7 +34,8 @@ parser.add_argument('-f', '--face', help='use this face', dest='source_img') parser.add_argument('-t', '--target', help='replace this face', dest='target_path') parser.add_argument('-o', '--output', help='save output to this file', dest='output_file') parser.add_argument('--keep-fps', help='maintain original fps', dest='keep_fps', action='store_true', default=False) -parser.add_argument('--gpu', help='use gpu', dest='gpu', action='store_true', default=False) +if torch.cuda.is_available(): + parser.add_argument('--gpu', help='use gpu', dest='gpu', action='store_true', default=False) parser.add_argument('--keep-frames', help='keep frames directory', dest='keep_frames', action='store_true', default=False) for name, value in vars(parser.parse_args()).items(): @@ -44,8 +48,12 @@ if os.name == "nt": def start_processing(): + start_time = time.time() if args['gpu']: process_video(args['source_img'], args["frame_paths"]) + end_time = time.time() + print(flush=True) + print(f"Processing time: {end_time - start_time:.2f} seconds", flush=True) return frame_paths = args["frame_paths"] n = len(frame_paths)//(psutil.cpu_count()-1) @@ -57,6 +65,9 @@ def start_processing(): p.get() pool.close() pool.join() + end_time = time.time() + print(flush=True) + print(f"Processing time: {end_time - start_time:.2f} seconds", flush=True) def select_face():