Fanta_App / app.py
AshanGimhana's picture
Update app.py
97885f2 verified
# Dependencies
import os
os.system("pip uninstall -y gradio")
os.system("pip install gradio==3.50")
os.system("pip uninstall -y numpy")
os.system("pip install numpy==1.23.5")
import gradio as gr
import cv2
import insightface
import numpy as np
import gradio.components as gr_comp
import asyncio
import logging
from PIL import Image
# Setup logging
logging.basicConfig(level=logging.INFO)
# Constants for DPI and pixel dimensions
DPI = 300
WIDTH_PIXELS = 1182
HEIGHT_PIXELS = 1773
# Load the insightface model once
providers = ["CUDAExecutionProvider", "CPUExecutionProvider"] if cv2.cuda.getCudaEnabledDeviceCount() > 0 else ["CPUExecutionProvider"]
model_path = 'inswapper_128.onnx'
model_swap_insightface = insightface.model_zoo.get_model(model_path, providers=providers)
# Prepare the FaceAnalysis model once
FACE_ANALYSER = insightface.app.FaceAnalysis(
name="buffalo_l",
root=".", providers=providers, allowed_modules=["landmark_3d_68", "landmark_2d_106", "detection", "recognition"]
)
FACE_ANALYSER.prepare(ctx_id=0 if cv2.cuda.getCudaEnabledDeviceCount() > 0 else -1, det_size=(640, 640))
# Function to update template choices based on gender
def update_templates(gender):
if gender == 'Male':
return gr.Dropdown.update(choices=['Boy Template 1.JPG', 'Boy Template 2.JPG', 'Boy Template 3.JPG'])
elif gender == 'Female':
return gr.Dropdown.update(choices=['Girl Template 1.JPG', 'Girl Template 2.JPG', 'Girl Template 3.JPG'])
else:
return gr.Dropdown.update(choices=[])
# Main function for face swapping
async def face_swap_and_merge(src_image, gender, template_choice):
try:
logging.info("Starting face swap and merge process")
# Resize the source image to the required dimensions for uniform processing
src_image = cv2.resize(src_image, (WIDTH_PIXELS, HEIGHT_PIXELS))
template_image_path = f'{template_choice}'
template_image = cv2.imread(template_image_path, cv2.IMREAD_UNCHANGED)
# Resize the template image to the required dimensions for uniform processing
template_image = cv2.resize(template_image, (WIDTH_PIXELS, HEIGHT_PIXELS))
src_faces = FACE_ANALYSER.get(src_image)
template_faces = FACE_ANALYSER.get(template_image)
img_fake = model_swap_insightface.get(img=template_image, target_face=template_faces[0], source_face=src_faces[0], paste_back=True)
img_fake_rgb = cv2.cvtColor(img_fake, cv2.COLOR_BGR2RGB)
# Convert to PIL image to set DPI
pil_image = Image.fromarray(img_fake_rgb)
pil_image.info['dpi'] = (DPI, DPI)
logging.info("Face swap and merge process completed successfully")
return np.array(pil_image)
except Exception as e:
logging.error(f"Error in face_swap_and_merge: {e}")
return None
# Function to clear only the output image
def clear_output():
return None
# Function to clear all inputs and outputs
def clear_all():
return None, None, None, None
# Create Gradio interface with title and theme
with gr.Blocks(theme='upsatwal/mlsc_tiet') as iface:
gr.Markdown("# Face Changer")
gr.Markdown(" ")
src_image = gr.Image(type="numpy", label="Input Image")
gender = gr.Dropdown(["Male", "Female"], label="Select Gender", interactive=True)
template_choice = gr.Dropdown([], label="Select Template", interactive=True)
gender.change(fn=update_templates, inputs=gender, outputs=template_choice)
result_image = gr.Image(label="Output Image")
submit_button = gr.Button("Submit")
submit_button.click(fn=face_swap_and_merge, inputs=[src_image, gender, template_choice], outputs=result_image)
clear_output_button = gr.Button("Clear Output")
clear_output_button.click(fn=clear_output, inputs=[], outputs=result_image)
clear_all_button = gr.Button("Clear All")
clear_all_button.click(fn=clear_all, inputs=[], outputs=[src_image, gender, template_choice, result_image])
iface.launch(debug=True)