| import numpy as np
|
| from PIL import Image
|
| import insightface
|
| from insightface.app import FaceAnalysis
|
|
|
| import os
|
| import requests
|
|
|
| MODEL_URL = "https://huggingface.co/kaizma/face-swap-inswapper/resolve/da20be1c8ba9b074d52c6a0540f8935d3e3605e5/inswapper_128.onnx"
|
| MODEL_PATH = "inswapper_128.onnx"
|
|
|
|
|
| if not os.path.exists(MODEL_PATH):
|
| print("Downloading model...")
|
| r = requests.get(MODEL_URL, stream=True)
|
| with open(MODEL_PATH, "wb") as f:
|
| for chunk in r.iter_content(chunk_size=8192):
|
| f.write(chunk)
|
| print("Model downloaded.")
|
|
|
|
|
| def swap_faces(src_pil, tgt_pil):
|
|
|
| src = np.array(src_pil)[:, :, ::-1].copy()
|
| tgt = np.array(tgt_pil)[:, :, ::-1].copy()
|
|
|
|
|
| app = FaceAnalysis(name='buffalo_l')
|
| app.prepare(ctx_id=0, det_size=(640, 640))
|
| model_path = r"C:\Users\Dell\Desktop\Face Swap\inswapper_128.onnx"
|
| swapper = insightface.model_zoo.get_model(model_path)
|
|
|
|
|
| src_faces = app.get(src)
|
| tgt_faces = app.get(tgt)
|
| if len(src_faces) == 0 or len(tgt_faces) == 0:
|
| raise ValueError("No face detected in one of the images.")
|
|
|
| source_face = src_faces[0]
|
| res = tgt.copy()
|
| for face in tgt_faces:
|
| res = swapper.get(res, face, source_face, paste_back=True)
|
|
|
|
|
| res_pil = Image.fromarray(res[:, :, ::-1])
|
| return res_pil |