Разработка AI-системы замены лиц в видео (Face Swap)
Face swap — технология замены лица в видео. Применяется в развлекательных приложениях, визуализации одежды/аксессуаров, обучающих материалах с анонимизацией, продакшне (замена каскадёра). Требует строгого соблюдения законодательства и получения согласий.
Roop / Reactor — open source решения
import subprocess
import os
class FaceSwapService:
def __init__(self, model_dir: str = "./models"):
self.model_dir = model_dir
# Используем InsightFace для детекции + sim swap для замены
def swap_face_in_video(
self,
source_face: str, # Изображение с исходным лицом
target_video: str, # Видео, в котором меняем лицо
output_path: str,
face_index: int = 0 # Какое лицо в target заменяем
) -> str:
subprocess.run([
"python", "roop/run.py",
"--source", source_face,
"--target", target_video,
"--output", output_path,
"--face-restore",
"--frame-processor", "face_swapper", "face_enhancer",
"-e", "colab-run"
], check=True)
return output_path
def batch_swap(self, face_path: str, video_paths: list[str], output_dir: str) -> list[str]:
results = []
for video in video_paths:
filename = os.path.basename(video)
output = os.path.join(output_dir, f"swapped_{filename}")
results.append(self.swap_face_in_video(face_path, video, output))
return results
InsightFace напрямую (продвинутый контроль)
import insightface
import cv2
import numpy as np
from gfpgan import GFPGANer
class AdvancedFaceSwapper:
def __init__(self):
self.face_analysis = insightface.app.FaceAnalysis(
name="buffalo_l",
providers=["CUDAExecutionProvider"]
)
self.face_analysis.prepare(ctx_id=0, det_size=(640, 640))
self.swapper = insightface.model_zoo.get_model(
"inswapper_128.onnx",
download=True
)
self.enhancer = GFPGANer(model_path="GFPGANv1.4.pth", upscale=1)
def swap_faces_in_frame(
self,
source_face_embedding,
frame: np.ndarray,
target_face_idx: int = 0
) -> np.ndarray:
faces = self.face_analysis.get(frame)
if not faces or target_face_idx >= len(faces):
return frame
target_face = faces[target_face_idx]
result = self.swapper.get(frame, target_face, source_face_embedding, paste_back=True)
# Улучшаем лицо после замены
_, _, result = self.enhancer.enhance(result, has_aligned=False, paste_back=True)
return result
def process_video(
self,
source_image: str,
target_video: str,
output_path: str
) -> str:
# Получаем embedding исходного лица
source_img = cv2.imread(source_image)
source_faces = self.face_analysis.get(source_img)
if not source_faces:
raise ValueError("Лицо не найдено в source image")
source_embedding = source_faces[0]
cap = cv2.VideoCapture(target_video)
fps = cap.get(cv2.CAP_PROP_FPS)
w = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
h = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
out = cv2.VideoWriter(output_path, cv2.VideoWriter_fourcc(*"mp4v"), fps, (w, h))
while True:
ret, frame = cap.read()
if not ret:
break
processed = self.swap_faces_in_frame(source_embedding, frame)
out.write(processed)
cap.release()
out.release()
return output_path
Правовые ограничения и этика
Запрещено:
- Deepfake порнография (уголовная ответственность во многих юрисдикциях)
- Создание поддельного контента с реальными людьми без их согласия
- Использование в дезинформации, мошенничестве
Требуется:
- Письменное согласие человека, чьё лицо используется
- Явная маркировка контента как AI-generated
- Политика хранения и удаления биометрических данных (ФЗ-152)
Добавление watermark:
def add_ai_watermark(video_path: str, output_path: str) -> str:
subprocess.run([
"ffmpeg", "-i", video_path,
"-vf", "drawtext=text='AI GENERATED':fontsize=24:fontcolor=white:alpha=0.7:x=10:y=10",
output_path
], check=True)
return output_path
Сроки: face swap сервис для изображений — 1 неделя. Для видео с очередью и face enhancement — 2–3 недели.







