File size: 3,610 Bytes
205ca4b
 
 
 
 
 
 
 
 
 
 
 
 
e3f4dc3
205ca4b
e3f4dc3
 
 
 
 
205ca4b
e3f4dc3
 
 
 
205ca4b
e3f4dc3
 
 
 
 
 
 
 
 
 
205ca4b
e3f4dc3
 
 
 
 
205ca4b
e3f4dc3
 
 
 
 
 
 
 
 
205ca4b
e3f4dc3
 
 
 
 
 
205ca4b
e3f4dc3
 
 
 
 
 
 
 
 
205ca4b
e3f4dc3
 
 
 
205ca4b
e3f4dc3
 
205ca4b
e3f4dc3
 
205ca4b
e3f4dc3
 
205ca4b
e3f4dc3
205ca4b
 
 
e3f4dc3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
205ca4b
 
e3f4dc3
 
 
205ca4b
 
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
104
105
106
107
108
109
110
111
import numpy as np
import gradio as gr
import roop.globals
from roop.core import (
    start,
    decode_execution_providers,
    suggest_max_memory,
    suggest_execution_threads,
)
from roop.processors.frame.core import get_frame_processors_modules
from roop.utilities import normalize_output_path
import os
from PIL import Image
from datetime import datetime

def swap_face(source_file, target_file, doFaceEnhancer, use_gpu):
    try:
        # Save input images temporarily
        source_path = "input.jpg"
        target_path = "target.jpg"

        source_image = Image.fromarray(source_file)
        source_image.save(source_path)
        target_image = Image.fromarray(target_file)
        target_image.save(target_path)

        # Set global variables for Roop
        roop.globals.source_path = source_path
        roop.globals.target_path = target_path
        
        # Create a dynamic output path
        timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
        output_path = f"output_{timestamp}.jpg"
        roop.globals.output_path = normalize_output_path(
            roop.globals.source_path, roop.globals.target_path, output_path
        )

        # Configure frame processors
        if doFaceEnhancer:
            roop.globals.frame_processors = ["face_swapper", "face_enhancer"]
        else:
            roop.globals.frame_processors = ["face_swapper"]

        # Global settings
        roop.globals.headless = True
        roop.globals.keep_fps = True
        roop.globals.keep_audio = True
        roop.globals.keep_frames = False
        roop.globals.many_faces = False
        roop.globals.video_encoder = "libx264"
        roop.globals.video_quality = 18
        roop.globals.max_memory = suggest_max_memory()

        # Execution providers
        if use_gpu:
            roop.globals.execution_providers = decode_execution_providers(["cuda"])
        else:
            roop.globals.execution_providers = decode_execution_providers(["cpu"])
        roop.globals.execution_threads = suggest_execution_threads()

        print(
            "Starting process with the following parameters:",
            f"Source: {roop.globals.source_path}",
            f"Target: {roop.globals.target_path}",
            f"Output: {roop.globals.output_path}",
            f"Enhancer: {doFaceEnhancer}",
            f"Using GPU: {use_gpu}",
            sep="\n"
        )

        # Pre-check and start process
        for frame_processor in get_frame_processors_modules(roop.globals.frame_processors):
            if not frame_processor.pre_check():
                return "Pre-check failed for frame processors."

        start()
        return output_path

    except Exception as e:
        return f"An error occurred: {e}"

# HTML content for UI information
html_section_1 = "<div><p>This model is running on the selected hardware (CPU/GPU). Processing might take some time.</p></div>"

# Create the Gradio interface
app = gr.Blocks()

with app:
    gr.HTML(html_section_1)
    gr.Markdown("## Face Swap Application")
    gr.Markdown("Upload a source and target image to swap faces. Optionally, enhance the swapped face.")
    
    # Inputs and Interface
    inputs = [
        gr.Image(label="Source Image"),
        gr.Image(label="Target Image"),
        gr.Checkbox(label="Enhance", info="Use Face Enhancer"),
        gr.Checkbox(label="Use GPU (if available)", value=True)
    ]
    
    outputs = gr.Image(label="Swapped Image")
    
    # Interface function call
    gr.Interface(
        fn=swap_face,
        inputs=inputs,
        outputs=outputs
    ).launch()

app.launch()