Реализация AI-виртуальной примерки макияжа
Beauty-бренды сталкиваются с дилеммой: как дать покупателю примерить косметику, не контактируя с продуктом физически? Наивное наложение 2D-изображений выглядит неестественно — не учитываются блики, текстура кожи и мимика. Мы решаем это с помощью гибридной архитектуры: landmark-based детекция для real-time и AI-генеративные модели для фото высокого качества. Наш опыт в Computer Vision (5+ лет, 20+ проектов для beauty-сегмента) показывает, что такой подход снижает возвраты косметики на 30% за счёт более точного подбора оттенков. В результате клиенты получают не просто примерку, а инструмент, который увеличивает конверсию в корзину на 25% и сокращает количество возвратов.
Для real-time сцен используем MediaPipe Face Mesh [^1] — решение от Google, обеспечивающее детекцию 468 ключевых точек лица с задержкой менее 5 мс. Для фото с высоким качеством применяем Stable Diffusion Inpainting с маской зон нанесения.
Сравнение подходов: landmark-based vs AI-генеративный
| Характеристика | Landmark-based (MediaPipe) | AI-генеративный (Stable Diffusion) |
|---|---|---|
| Скорость | < 5 мс (real-time) | 5–15 сек (офлайн) |
| Точность наложения | Высокая по контурам | Высокая по текстуре |
| Требования к GPU | Нет (WebGL в браузере) | Да (GPU класса T4+) |
| Реализм | Средний (сглаженный) | Высокий (учитывает освещение) |
| Сфера применения | Live-трансляции, AR-фильтры | Фото-примерка в приложении |
Почему гибридный подход эффективнее чистого AI?
Для real-time сцен критична задержка: MediaPipe даёт 100-кратное преимущество по скорости перед генеративными моделями. При этом точность позиционирования губ, век и скул достаточно высока, чтобы сгладить резкие границы с помощью билинейной фильтрации. Мы гарантируем стабильный фреймрейт 30 FPS даже на мобильных устройствах среднего сегмента. Для фото, где качество важнее скорости, используем Stable Diffusion XL Inpainting с предварительной сегментацией лица — модель получает маску зон нанесения и генерирует текстуру, учитывая рельеф кожи и падающий свет. Это даёт эффект живого макияжа, а не плоского наложения. Время обработки — 5–15 секунд на картинку, что приемлемо для пользовательских фото в приложении.
Как мы обеспечиваем real-time при 30 FPS?
Ключевое — использование WebGL для рендеринга и оптимизированный WASM-билд MediaPipe. Мы избегаем копирования данных между CPU и GPU за счёт прямого доступа к текстурам через WebGL2. В результате на среднем смартфоне (Snapdragon 865+) получаем стабильные 30 FPS с задержкой менее 5 мс. Дополнительно применяем билинейную фильтрацию для сглаживания границ и адаптивный битрейт для видеопотока.
MediaPipe подход (real-time)
import mediapipe as mp
import cv2
import numpy as np
from PIL import Image
class RealTimeMakeupAR:
def __init__(self):
self.face_mesh = mp.solutions.face_mesh.FaceMesh(
static_image_mode=False,
max_num_faces=1,
min_detection_confidence=0.5,
min_tracking_confidence=0.5
)
LIPS_INDICES = [61, 185, 40, 39, 37, 0, 267, 269, 270, 409, 291, 375, 321, 405, 314, 17, 84, 181, 91, 146]
UPPER_LID_L = [362, 382, 381, 380, 374, 373, 390, 249, 263, 466, 388, 387, 386, 385, 384, 398]
CHEEKS_L = [36, 31, 228, 229, 230, 231, 232, 233, 244, 245, 188, 174, 177, 215, 213, 192]
def apply_lipstick(self, frame, color, opacity=0.6):
rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
results = self.face_mesh.process(rgb)
if not results.multi_face_landmarks:
return frame
landmarks = results.multi_face_landmarks[0]
h, w = frame.shape[:2]
lip_points = np.array([
[int(landmarks.landmark[i].x * w),
int(landmarks.landmark[i].y * h)]
for i in self.LIPS_INDICES
], dtype=np.int32)
overlay = frame.copy()
cv2.fillPoly(overlay, [lip_points], color[::-1])
return cv2.addWeighted(frame, 1 - opacity, overlay, opacity, 0)
Как работает AI-генеративная примерка?
Для фото, где качество важнее скорости, мы используем Stable Diffusion XL Inpainting с предварительной сегментацией лица. Модель получает маску зон нанесения (губы, веки, скулы) и генерирует текстуру, учитывая рельеф кожи и падающий свет. Это даёт эффект живого макияжа, а не плоского наложения. Время обработки — 5–15 секунд на картинку, что приемлемо для пользовательских фото в приложении.
AI-генеративный подход (высокое качество)
from diffusers import StableDiffusionXLInpaintPipeline
import torch
from PIL import Image
import io
class AIPhotoMakeupTryOn:
def __init__(self):
self.pipe = StableDiffusionXLInpaintPipeline.from_pretrained(
"diffusers/stable-diffusion-xl-1.0-inpainting-0.1",
torch_dtype=torch.float16
).to("cuda")
self.face_parser = FaceParser()
def apply_makeup_ai(self, photo, makeup_style, intensity=0.7):
img = Image.open(io.BytesIO(photo)).convert("RGB")
face_mask = self.face_parser.get_makeup_zone_mask(img)
result = self.pipe(
prompt=f"beautiful makeup, {makeup_style}, natural skin texture",
negative_prompt="unnatural, heavy, clown, overdone",
image=img,
mask_image=face_mask,
strength=intensity,
num_inference_steps=30,
guidance_scale=8.0
).images[0]
buf = io.BytesIO()
result.save(buf, format="PNG")
return buf.getvalue()
Детали настройки пайплайна
Для повышения реализма мы fine-tune модель на датасете из 5000 профессиональных beauty-фото с разными оттенками кожи и освещением. Используем LoRA-адаптеры, что ускоряет обучение и уменьшает размер модели. Inference запускается на GPU класса T4 с использованием TensorRT для оптимизации задержки.Этапы разработки виртуальной примерки
| Этап | Длительность | Результат |
|---|---|---|
| Анализ требований и сбор референсов | 3–5 дней | Техническое задание, прототипы интерфейса |
| Выбор архитектуры и подготовка моделей | 5–7 дней | Выбор landmark-based или AI-генеративного подхода |
| Реализация детекции и рендеринга | 7–10 дней | Рабочий прототип в браузере или приложении |
| Интеграция с каталогом продукции | 3–5 дней | Подключение API, синхронизация оттенков |
| Тестирование и оптимизация | 5–7 дней | Проверка на устройствах, настройка производительности |
| Деплой и документация | 2–4 дня | Развёртывание, обучение команды |
Что входит в работу
Наш сертифицированный опыт в Computer Vision позволяет выполнить проект под ключ. В результате вы получаете:
- документацию: архитектурная схема, описание API, руководство по интеграции
- исходный код с комментариями и CI/CD пайплайном
- обучение вашей команды работе с системой
- поддержку на этапе промышленной эксплуатации (SLA не ниже 99.9%)
Архитектура продукта
Веб/мобильное приложение
├── Camera/Photo mode
│ ├── Real-time: MediaPipe WASM + WebGL (< 5мс)
│ └── Photo: AI inpainting API (10–15 сек)
├── Product catalog (оттенки помады, теней)
├── Shade picker + color mixer
└── Share / Download result
Сроки: браузерный real-time AR макияж (MediaPipe) — 3–4 недели. AI фото-примерка с API — 1–2 недели. Полное мобильное приложение с каталогом — 3–4 месяца.
Браузерная real-time реализация
import * as faceMesh from '@mediapipe/face_mesh';
import * as drawingUtils from '@mediapipe/drawing_utils';
const faceMeshInstance = new faceMesh.FaceMesh({locateFile: (file) => {
return `https://cdn.jsdelivr.net/npm/@mediapipe/face_mesh/${file}`;
}});
faceMeshInstance.setOptions({
maxNumFaces: 1,
minDetectionConfidence: 0.5,
minTrackingConfidence: 0.5
});
function renderLipstick(ctx, landmarks, color, opacity) {
const lipIndices = [61, 185, 40, 39, 37, 0, 267, 269, 270, 409, 291, 375];
ctx.globalAlpha = opacity;
ctx.fillStyle = color;
ctx.beginPath();
lipIndices.forEach((idx, i) => {
const lm = landmarks[idx];
if (i === 0) ctx.moveTo(lm.x * canvas.width, lm.y * canvas.height);
else ctx.lineTo(lm.x * canvas.width, lm.y * canvas.height);
});
ctx.closePath();
ctx.fill();
ctx.globalAlpha = 1.0;
}
Свяжитесь с нами для пилотного проекта — получите demo за 5 дней. Закажите консультацию — подберём оптимальную архитектуру под ваши задачи.
[^1]: MediaPipe Face Mesh — библиотека для детекции и отслеживания ключевых точек лица.







