ИИ-примерка макияжа в реальном времени
Конверсия в интернет-магазине косметики растёт на 25–35% при наличии AR-примерки — пользователь видит, как помада или тени выглядят на его лице, и принимает решение быстрее. Технически это задача face landmark detection + texture rendering + real-time compositing.
Пайплайн виртуальной примерки
Шаг 1: Face mesh — MediaPipe Face Mesh даёт 468 ключевых точек лица в реальном времени (~12ms на CPU, ~3ms на GPU). Точки покрывают все зоны для косметики: губы (32 точки), веки (60 точек), брови (20 точек), щёки. На мобильных устройствах: MediaPipe через TFLite, ~5ms на A15 Bionic.
Шаг 2: 3D face model — из 2D landmarks реконструируем 3D-форму лица через 3DMM (3D Morphable Model) или dense face alignment. Это нужно для корректного нанесения текстуры с учётом перспективы и поворота головы.
Шаг 3: Texture application — нанесение макияжа как texture overlay с blending:
- Помада: заполнение полигонов губ, alpha blending 0.7–0.9
- Тени: мягкий gradient на веках, multiply/overlay blending mode
- Румяна: gaussian softblend на polygon щёк
- Карандаш: thin stroke вдоль контура
Шаг 4: Lighting adaptation — цвет макияжа должен «жить» в реальном освещении. Оценка ambient light из кадра (средний тон нейтральных зон — лоб, нос) и умножение на color temperature correction matrix.
# MediaPipe face mesh + makeup overlay
import mediapipe as mp
import cv2
import numpy as np
mp_face_mesh = mp.solutions.face_mesh
face_mesh = mp_face_mesh.FaceMesh(
static_image_mode=False,
max_num_faces=1,
refine_landmarks=True, # ирис и контур губ высокого разрешения
min_detection_confidence=0.7
)
def apply_lipstick(frame, landmarks, color_bgr, alpha=0.75):
h, w = frame.shape[:2]
# Индексы точек контура губ (MediaPipe lip indices)
UPPER_LIP = [61, 185, 40, 39, 37, 0, 267, 269, 270, 409, 291]
LOWER_LIP = [61, 146, 91, 181, 84, 17, 314, 405, 321, 375, 291]
lip_pts = [(int(landmarks[i].x * w), int(landmarks[i].y * h))
for i in UPPER_LIP + LOWER_LIP[::-1]]
mask = np.zeros(frame.shape[:2], dtype=np.uint8)
cv2.fillPoly(mask, [np.array(lip_pts)], 255)
colored = np.zeros_like(frame)
colored[:] = color_bgr
return cv2.addWeighted(frame, 1-alpha, colored, alpha, 0,
dst=np.where(mask[..., None] > 0,
cv2.addWeighted(frame, 1-alpha,
colored, alpha, 0),
frame))
Фотореалистичность: где сложно
Зубы и отражения. При открытом рте помада должна корректно заканчиваться на внешнем контуре губ, не закрашивая зубы. Рефайнд контур MediaPipe + tooth detection маска.
Текстура кожи. Простой flat-color overlay выглядит неестественно — помада «плоская». Реалистично: сохраняем HSV-структуру текстуры кожи (morph texture transfer), меняем только hue/saturation компоненту. Метод: LAB color space transfer — меняем A/B каналы (цвет), сохраняем L (яркость/текстуру).
Быстрые движения. При резком повороте головы или моргании facial landmark модель дает temporal jitter — контур «прыгает» на 2–4 пикселя. Temporal smoothing через Kalman filter на координатах landmarks — устраняет дрожание, сохраняет отзывчивость.
Мобильная и веб-реализация
Веб: MediaPipe JavaScript + WebGL для рендеринга. Latency на современном смартфоне в браузере: 30–50ms на кадр (20–30fps).
iOS/Android: TFLite + Metal/Vulkan для рендеринга. 60fps на устройствах 2021+ года.
Backend-режим: для фото-примерки (не real-time) обработка на сервере с ONNX Runtime + OpenCV. Время на фото: 200–500ms.
Сроки
Базовая примерка помады + теней (real-time, веб + мобайл): 6–10 недель. Полный модуль (все продукты + AR-эффекты): 12–18 недель. Стоимость рассчитывается индивидуально.







