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()