File size: 3,592 Bytes
d711651 5770d4b d711651 b43290b d711651 b43290b d711651 b43290b d711651 b61e3ec d711651 b43290b d711651 b43290b d711651 b43290b d711651 b43290b d711651 b43290b d711651 b43290b d711651 5770d4b d711651 8cc36a2 b61e3ec d711651 b61e3ec d711651 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 |
# -*- coding:UTF-8 -*-
# !/usr/bin/env python
import spaces
import numpy as np
import gradio as gr
import gradio.exceptions
import roop.globals
from roop.core import (
start,
decode_execution_providers,
)
from roop.processors.frame.core import get_frame_processors_modules
from roop.utilities import normalize_output_path
import os
from PIL import Image
import uuid
import onnxruntime as ort
import cv2
from roop.face_analyser import get_one_face
@spaces.GPU
def swap_face(source_file, target_file, doFaceEnhancer):
session_id = str(uuid.uuid4()) # Tạo một UUID duy nhất cho mỗi phiên làm việc
session_dir = f"temp/{session_id}"
os.makedirs(session_dir, exist_ok=True)
source_path = os.path.join(session_dir, "input.jpg")
target_path = os.path.join(session_dir, "target.jpg")
source_image = Image.fromarray(source_file)
source_image.save(source_path)
target_image = Image.fromarray(target_file)
target_image.save(target_path)
print("source_path: ", source_path)
print("target_path: ", target_path)
# Check if a face is detected in the source image
source_face = get_one_face(cv2.imread(source_path))
if source_face is None:
raise gradio.exceptions.Error("No face in source path detected.")
# Check if a face is detected in the target image
target_face = get_one_face(cv2.imread(target_path))
if target_face is None:
raise gradio.exceptions.Error("No face in target path detected.")
output_path = os.path.join(session_dir, "output.jpg")
normalized_output_path = normalize_output_path(source_path, target_path, output_path)
frame_processors = ["face_swapper", "face_enhancer"] if doFaceEnhancer else ["face_swapper"]
headless = True
keep_fps = True
keep_audio = True
keep_frames = False
many_faces = False
video_encoder = "libx264"
video_quality = 18
max_memory = "12G"
execution_providers = ["CUDAExecutionProvider", "CPUExecutionProvider"] # Ưu tiên GPU, sau đó là CPU
execution_threads = 4
reference_face_position = 0
similar_face_distance = 0.6
print("Available providers:", ort.get_available_providers()) # Kiểm tra các provider hiện có
print("Configured execution providers:", execution_providers)
for frame_processor in get_frame_processors_modules(frame_processors):
if not frame_processor.pre_check():
print(f"Pre-check failed for {frame_processor}")
raise gradio.exceptions.Error(f"Pre-check failed for {frame_processor}")
roop.globals.source_path = source_path
roop.globals.target_path = target_path
roop.globals.output_path = normalized_output_path
roop.globals.frame_processors = frame_processors
roop.globals.headless = headless
roop.globals.keep_fps = keep_fps
roop.globals.keep_audio = keep_audio
roop.globals.keep_frames = keep_frames
roop.globals.many_faces = many_faces
roop.globals.video_encoder = video_encoder
roop.globals.video_quality = video_quality
roop.globals.max_memory = max_memory
roop.globals.execution_providers = execution_providers
roop.globals.execution_threads = execution_threads
roop.globals.reference_face_position = reference_face_position
roop.globals.similar_face_distance = similar_face_distance
start()
return normalized_output_path
app = gr.Interface(
fn=swap_face,
inputs=[
gr.Image(),
gr.Image(),
gr.Checkbox(label="Face Enhancer?", info="Do face enhancement?")
],
outputs="image"
)
app.launch() |