File size: 1,853 Bytes
b5ea024
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
import os
import logging
import gdown
import insightface
import gradio as gr
from insightface.app import FaceAnalysis
from PIL import Image
import numpy as np

logging.basicConfig(format='%(levelname)s:%(message)s', level=logging.INFO)

def prepare_face_analysis():
    """Подготовка приложения FaceAnalysis."""
    app = FaceAnalysis(name='buffalo_l')
    app.prepare(ctx_id=0, det_size=(640, 640))
    return app

def download_model(model_url, model_path):
    """Загрузка модели, если она еще не существует."""
    if not os.path.exists(model_path):
        gdown.download(model_url, model_path, quiet=False)

def load_model(model_path):
    """Загрузка модели."""
    return insightface.model_zoo.get_model(model_path, download=False)

def swap_faces(user_image, celebrity_image):
    """Меняем лица на заданных изображениях."""
    try:
        # Меняем лица
        input_name = onnx_model.get_inputs()[0].name
        input_data = np.concatenate([user_image, celebrity_image], axis=0)
        results = onnx_model.run(None, {input_name: input_data})
        swapped_face = Image.fromarray(results[0])
    except Exception as e:
        logging.error("Ошибка при смене лиц: %s", e)
        swapped_face = user_image
    return swapped_face

# Подготовка приложения FaceAnalysis
app = prepare_face_analysis()

# Загрузка и загрузка модели
model_url = 'https://drive.google.com/uc?id=1HvZ4MAtzlY74Dk4ASGIS9L6Rg5oZdqvu'
model_path = 'inswapper_128.onnx'
download_model(model_url, model_path)
onnx_model = load_model(model_path)

# Запуск интерфейса Gradio
iface = gr.Interface(fn=swap_faces, inputs=["image", "image"], outputs="image")
iface.launch(share=True)