File size: 3,593 Bytes
205b8f5
1f6a041
e496964
1f6a041
51a3166
205b8f5
1f6a041
 
 
 
 
 
 
 
 
3aff737
28ae202
205b8f5
 
51a3166
705287f
a39ec9f
3aff737
 
 
 
 
 
1f6a041
 
 
 
 
 
 
 
 
205b8f5
 
 
 
 
 
 
 
 
 
3aff737
42b1f81
1f6a041
42b1f81
 
 
 
 
 
 
 
cc21c96
324786c
cc21c96
42b1f81
 
decc5b1
28ae202
 
1f6a041
42b1f81
1f6a041
438e3e2
205b8f5
1f6a041
42b1f81
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1f6a041
205b8f5
1f6a041
 
438e3e2
 
 
 
 
 
 
1f6a041
8725ec6
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
103
# -*- 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 = 2
    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()