asyoucansee commited on
Commit
5a3db6b
·
verified ·
1 Parent(s): 8eb3fec

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +89 -0
app.py ADDED
@@ -0,0 +1,89 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import gc
3
+ import cv2
4
+ import gradio as gr
5
+ import numpy as np
6
+ from PIL import Image
7
+ from insightface.app import FaceAnalysis
8
+ from insightface.model_zoo import get_model
9
+
10
+ cv2.setNumThreads(2)
11
+
12
+ # -----------------------------
13
+ # Model path (ROOT folder)
14
+ # -----------------------------
15
+ SWAP_MODEL_PATH = "inswapper_128.onnx"
16
+
17
+ if not os.path.exists(SWAP_MODEL_PATH):
18
+ raise RuntimeError(
19
+ "inswapper_128.onnx not found in root folder. "
20
+ "Upload it next to app.py"
21
+ )
22
+
23
+ # -----------------------------
24
+ # Face detector (HQ)
25
+ # -----------------------------
26
+ face_app = FaceAnalysis(
27
+ providers=["CPUExecutionProvider"],
28
+ allowed_modules=["detection", "recognition"]
29
+ )
30
+ face_app.prepare(ctx_id=0, det_size=(640, 640))
31
+
32
+ # -----------------------------
33
+ # Load swap model (LOCAL)
34
+ # -----------------------------
35
+ swapper = get_model(
36
+ SWAP_MODEL_PATH,
37
+ providers=["CPUExecutionProvider"]
38
+ )
39
+
40
+ # -----------------------------
41
+ # Face swap logic
42
+ # -----------------------------
43
+ def face_swap_api(source_img, target_img):
44
+ try:
45
+ if source_img is None or target_img is None:
46
+ return None
47
+
48
+ src = np.array(source_img.convert("RGB"))
49
+ tgt = np.array(target_img.convert("RGB"))
50
+
51
+ src_faces = face_app.get(src)
52
+ tgt_faces = face_app.get(tgt)
53
+
54
+ if not src_faces or not tgt_faces:
55
+ return None
56
+
57
+ result = swapper.get(
58
+ tgt,
59
+ tgt_faces[0],
60
+ src_faces[0],
61
+ paste_back=True
62
+ )
63
+
64
+ return Image.fromarray(result)
65
+
66
+ finally:
67
+ del src, tgt, src_faces, tgt_faces
68
+ gc.collect()
69
+
70
+ # -----------------------------
71
+ # Gradio Interface (API-first)
72
+ # -----------------------------
73
+ iface = gr.Interface(
74
+ fn=face_swap_api,
75
+ inputs=[
76
+ gr.Image(type="pil", label="Source Face"),
77
+ gr.Image(type="pil", label="Target Image")
78
+ ],
79
+ outputs=gr.Image(type="pil"),
80
+ allow_flagging="never",
81
+ analytics_enabled=False
82
+ )
83
+
84
+ iface.launch(
85
+ server_name="0.0.0.0",
86
+ server_port=7860,
87
+ show_api=True,
88
+ share=False
89
+ )