malkis / app.py
asyoucansee's picture
Update app.py
4beab5e verified
import os
import gc
import cv2
import gradio as gr
import numpy as np
from PIL import Image
from insightface.app import FaceAnalysis
from insightface.model_zoo import get_model
# -----------------------------
# OpenCV CPU control
# -----------------------------
cv2.setNumThreads(2)
# -----------------------------
# Model path (ROOT folder)
# -----------------------------
SWAP_MODEL_PATH = "inswapper_128.onnx"
if not os.path.exists(SWAP_MODEL_PATH):
raise RuntimeError(
"❌ inswapper_128.onnx not found.\n"
"Upload it in the SAME folder as app.py"
)
# -----------------------------
# Face detector (High Quality)
# -----------------------------
face_app = FaceAnalysis(
providers=["CPUExecutionProvider"],
allowed_modules=["detection", "recognition"]
)
face_app.prepare(
ctx_id=0,
det_size=(640, 640) # 16 GB RAM safe
)
# -----------------------------
# Load face swap model (LOCAL)
# -----------------------------
swapper = get_model(
SWAP_MODEL_PATH,
providers=["CPUExecutionProvider"]
)
# -----------------------------
# Face swap function
# -----------------------------
def face_swap(source_img, target_img):
try:
if source_img is None or target_img is None:
return None
src = np.array(source_img.convert("RGB"))
tgt = np.array(target_img.convert("RGB"))
src_faces = face_app.get(src)
tgt_faces = face_app.get(tgt)
if len(src_faces) == 0 or len(tgt_faces) == 0:
return None
result = swapper.get(
tgt,
tgt_faces[0],
src_faces[0],
paste_back=True
)
return Image.fromarray(result)
finally:
del src, tgt, src_faces, tgt_faces
gc.collect()
# -----------------------------
# Gradio Interface
# -----------------------------
demo = gr.Interface(
fn=face_swap,
inputs=[
gr.Image(type="pil", label="Source Face"),
gr.Image(type="pil", label="Target Image")
],
outputs=gr.Image(type="pil"),
analytics_enabled=False
)
# -----------------------------
# Launch (NO deprecated args)
# -----------------------------
demo.launch(
server_name="0.0.0.0",
server_port=7860,
share=False
)