File size: 1,588 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
import gradio as gr
import insightface
import onnxruntime
from insightface.app import FaceAnalysis

def face_swap(user_image, celebrity_image):

  # Загрузка моделей
  detector = insightface.model_zoo.get_model('retinaface_r50_v1')
  arcface = insightface.model_zoo.get_model('arcface_r100_v1')
  
  # Определение пути к модели замены лица
  onnx_model_path = 'face_swap_model.onnx'

  # Обнаружение лиц
  user_bbox, user_landmarks = detector.detect(user_image)
  celebrity_bbox, celebrity_landmarks = detector.detect(celebrity_image)

  # Выравнивание лиц
  user_aligned = FaceAnalysis.align(user_image, user_landmarks)
  celebrity_aligned = FaceAnalysis.align(celebrity_image, celebrity_landmarks)

  # Получение векторных представлений лиц
  user_embedding = arcface.get_embedding(user_aligned)
  celebrity_embedding = arcface.get_embedding(celebrity_aligned)

  # Загрузка модели ONNX
  session = onnxruntime.InferenceSession(onnx_model_path)

  # Подготовка входных данных
  input_name = session.get_inputs()[0].name
  user_data = user_aligned.transpose(2, 0, 1)
  celebrity_data = celebrity_aligned.transpose(2, 0, 1)
  input_feed = {input_name: np.concatenate([user_data, celebrity_data], axis=0)}

  # Замена лица
  results = session.run(None, input_feed)
  swapped_face = results[0].transpose(1, 2, 0)

  return swapped_face


iface = gr.Interface(fn=face_swap, inputs=["image", "image"], outputs="image")

iface.launch()