| import gradio as gr |
| import cv2 |
| import insightface |
| from insightface.app import FaceAnalysis |
| import PIL.Image |
| import numpy as np |
| import os |
| import requests |
|
|
| |
| def download_file(url, filename): |
| if not os.path.exists(filename): |
| response = requests.get(url) |
| with open(filename, "wb") as f: |
| f.write(response.content) |
|
|
| |
| try: |
| app = FaceAnalysis(name='buffalore_l', providers=['CPUExecutionProvider']) |
| app.prepare(ctx_id=0, det_size=(640, 640)) |
| except: |
| |
| app = FaceAnalysis(providers=['CPUExecutionProvider']) |
| app.prepare(ctx_id=0, det_size=(640, 640)) |
|
|
| |
| model_url = "https://huggingface.co/ezioruan/inswapper_128.onnx/resolve/main/inswapper_128.onnx" |
| model_path = "inswapper_128.onnx" |
| download_file(model_url, model_path) |
| swapper = insightface.model_zoo.get_model(model_path, download=False) |
|
|
| def swap(source_img, target_img): |
| if source_img is None or target_img is None: |
| return None |
| |
| source_faces = app.get(np.array(source_img)) |
| target_faces = app.get(np.array(target_img)) |
| |
| if not source_faces: |
| return target_img |
| |
| result = np.array(target_img) |
| for face in target_faces: |
| result = swapper.get(result, face, source_faces[0], paste_back=True) |
| |
| return PIL.Image.fromarray(result) |
|
|
| demo = gr.Interface( |
| fn=swap, |
| inputs=[gr.Image(type="pil", label="Лицо-донор"), gr.Image(type="pil", label="Целевое фото")], |
| outputs=gr.Image(label="Результат"), |
| title="🎭 Мой Face Swap" |
| ) |
|
|
| demo.launch() |