ИИ-примерка причёсок
Клиент салона хочет увидеть, как будет выглядеть короткое каре или окрашивание омбре — до того, как сесть в кресло. Виртуальная примерка причёски технически сложнее макияжа: волосы — самая трудная для CV-сегментации область с тонкими деталями и полупрозрачными краями.
Сегментация волос: специфика задачи
Точная маска волос — основа всего. Проблема: граница волосы/фон нечёткая, полупрозрачная, с отдельными прядями шириной 1–3 пикселя. Стандартный семантический сегментатор даёт грубые края, которые убивают реалистичность при наложении.
Специализированные модели:
- Hair-SAM / Matting Anything — сегментация с alpha matte: не бинарная маска, а float32 значения 0..1 на каждый пиксель. На краях — дробные значения, отражающие прозрачность.
- MODNet — lightweight matting model, 35fps на мобильных. Оптимизирован именно для портретов.
- ViTMatte — transformer-based матирование, выше качество на сложных прядях.
from matting import load_model, estimate_foreground_ml
model = load_model('vitmate_vit_b_pretrained.pth')
def segment_hair(image, trimap):
# trimap: 0=точно фон, 128=граничная зона, 255=точно волосы
alpha, foreground = model(image, trimap)
return alpha # float32 маска, 0..1
Наложение новой причёски
Два подхода:
Texture transfer — берём 3D-модель или 2D-reference целевой причёски, деформируем под форму головы пользователя (face shape analysis через 3DMM), накладываем с blending. Работает для схожих длин и форм. Проблема: если у пользователя длинные прямые, а целевая — короткое каре — оригинальные волосы нужно убрать под новую причёску, это требует inpainting кожи головы.
Генеративный подход (диффузионные модели) — более мощный:
- Сегментируем волосы и кожу головы
- Описываем желаемую причёску текстом: «short bob, brown, with bangs»
- Запускаем inpainting через Stable Diffusion с ControlNet (conditioning на форму лица и положение головы)
- Сохраняем лицо (face preservation через IP-Adapter или InstantID)
Главная сложность: сохранить идентичность человека при смене причёски. Без face preservation модель может генерировать другого человека с нужной причёской.
Окрашивание волос
Проще примерки формы: меняем цвет в пределах сегментированной маски волос. Инструменты:
- Selective color transfer в LAB color space: сохраняем L-канал (текстуру), меняем AB (цвет)
- Neural color transfer через AdaIN для сложных эффектов (омбре, балаяж, мелирование)
- Балаяж/омбре: gradient mask + отдельный color transfer по градиенту от корней к кончикам
import cv2
import numpy as np
def recolor_hair(image, hair_mask, target_color_lab):
lab = cv2.cvtColor(image, cv2.COLOR_BGR2LAB).astype(float)
# Вычисляем средний цвет волос
hair_pixels = lab[hair_mask > 128]
mean_ab = hair_pixels[:, 1:].mean(axis=0)
# Сдвигаем AB-каналы к целевому цвету
shift = target_color_lab[1:] - mean_ab
lab[:, :, 1:] += hair_mask[..., None] / 255.0 * shift
lab = np.clip(lab, 0, 255).astype(np.uint8)
return cv2.cvtColor(lab, cv2.COLOR_LAB2BGR)
Real-time vs фото-режим
Real-time (видео): MODNet для сегментации + texture-based recoloring. Ограничение: сложные форм-изменения нереалистичны в реальном времени.
Фото-режим: полный pipeline с ViTMatte + диффузионной генерацией. Время: 3–15 секунд в зависимости от метода.
Сроки
Базовый модуль окрашивания (real-time, все типы цвета): 5–8 недель. Полная примерка с изменением формы + генеративный подход: 12–18 недель. Стоимость рассчитывается индивидуально.







