Реалізація AI-Face Swap на відео

Проектуємо та впроваджуємо системи штучного інтелекту: від прототипу до production-ready рішення. Наша команда поєднує експертизу в машинному навчанні, дата-інжинірингу та MLOps, щоб AI працював не в лабораторії, а в реальному бізнесі.
Показано 1 з 1Усі 1566 послуг
Реалізація AI-Face Swap на відео
Складний
~5 днів
Часті запитання

Напрямки AI-розробки

Етапи розробки AI-рішення

Останні роботи

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1284
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1196
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    901
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1119
  • image_logo-advance_0.webp
    Розробка логотипу компанії B2B Advance
    586
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    853

Розробка AI-системи заміни осіб у відео (Face Swap)

Face swap – технологія заміни обличчя у відео. Застосовується в розважальних програмах, візуалізації одягу/аксесуарів, навчальних матеріалах з анонімізацією, продакшне (заміна каскадера). Вимагає суворого дотримання законодавства та отримання згоди.

Roop / Reactor — рішення з відкритим кодом

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 тижні.