Реализация AI-виртуальной примерки одежды в мобильном приложении
Виртуальная примерка — это наложение одежды на фотографию или живое видео с камеры. Звучит просто, но технически задача включает сегментацию тела, оценку позы, деформацию текстуры одежды под анатомию конкретного человека и реалистичное освещение. Ни одна из этих частей не тривиальна по отдельности.
Два режима: фото и real-time AR
Фото-примерка — пользователь загружает своё фото, выбирает одежду, получает результат через несколько секунд. Качество выше, модели тяжелее, серверный инференс оправдан.
Real-time AR — камера в реальном времени, одежда «надета» прямо на превью. Требует строгого бюджета 30+ fps. На устройстве — только лёгкие модели или mesh-based подход через pose estimation.
Архитектура фото-примерки
Пайплайн состоит из четырёх этапов:
- Human parsing — сегментируем части тела (верх, низ, рукава, воротник, фон). Модели: Self-Correction Human Parsing (SCHP), CDGNet.
- Pose estimation — 17–33 ключевые точки тела. MediaPipe Pose на устройстве, OpenPose на сервере.
- Warping — деформируем изображение одежды под позу и форму тела. TPS (Thin Plate Spline) warping на основе соответствий ключевых точек.
- Try-on synthesis — финальная генерация с учётом теней, складок, освещения. Модели: VITON-HD, HR-VITON, LaDI-VTON.
На мобиле этапы 1 и 2 — on-device (MediaPipe), этапы 3 и 4 — на сервере.
On-device: pose и парсинг через MediaPipe
// MediaPipe Pose Landmarker
let options = PoseLandmarkerOptions()
options.baseOptions.modelAssetPath = Bundle.main.path(forResource: "pose_landmarker_full", ofType: "task")!
options.numPoses = 1
options.minPoseDetectionConfidence = 0.5
options.minPosePresenceConfidence = 0.5
options.minTrackingConfidence = 0.5
let poseLandmarker = try PoseLandmarker(options: options)
// Из фото
let mpImage = try MPImage(uiImage: sourcePhoto)
let result = try poseLandmarker.detect(image: mpImage)
// result.landmarks[0] — массив из 33 NormalizedLandmark
// Ключевые точки: LEFT_SHOULDER (11), RIGHT_SHOULDER (12), LEFT_HIP (23), RIGHT_HIP (24)
Human parsing на устройстве — через конвертированную в Core ML/TFLite модель SCHP. Размер модели ~15 МБ после квантизации. На iPhone 13 — 300–500 мс на изображение 512×512.
// Android: human parsing через TFLite
val interpreter = Interpreter(
FileUtil.loadMappedFile(context, "schp_parsing.tflite"),
Interpreter.Options().apply { addDelegate(GpuDelegate()) }
)
val input = Array(1) { Array(512) { Array(512) { FloatArray(3) } } }
val output = Array(1) { Array(512) { Array(512) { FloatArray(20) } } } // 20 классов
interpreter.run(input, output)
// output[0][y][x] — вектор вероятностей для каждого класса (upper-body, lower-body, etc.)
Серверный try-on: HR-VITON
HR-VITON — state-of-the-art для фото-примерки, работает с разрешением до 1024×768. Принимает: фото человека + фото одежды (на белом фоне или с маской) + human parsing маску + позу.
API на стороне сервера (FastAPI + PyTorch):
@app.post("/tryon")
async def virtual_tryon(
person_image: UploadFile,
clothing_image: UploadFile
):
person = load_image(await person_image.read())
clothing = load_image(await clothing_image.read())
# Parsing и pose — предварительно вычислены или считаем здесь
parse_map = run_human_parsing(person)
keypoints = run_pose_estimation(person)
# HR-VITON inference
result = hrviton_model(person, clothing, parse_map, keypoints)
return StreamingResponse(image_to_bytes(result), media_type="image/jpeg")
Время генерации на A10 GPU — 1.5–3 секунды. На CPU (для тестирования) — 15–30 секунд.
Real-time AR: mesh-based подход
Для real-time без тяжёлого GAN — упрощённый mesh warping:
- MediaPipe Pose в реальном времени (30+ fps on-device).
- Строим 2D-меш тела из ключевых точек (треугольники через Delaunay триангуляцию).
- Деформируем текстуру одежды на меш через Metal.
// Metal vertex shader для warping одежды
vertex VertexOut clothingWarpVertex(
uint vid [[vertex_id]],
constant float2 *clothingUVs [[buffer(0)]], // UV координаты на исходной одежде
constant float2 *bodyPositions [[buffer(1)]] // Позиции на экране (из pose landmarks)
) {
VertexOut out;
out.position = float4(bodyPositions[vid], 0, 1);
out.texCoord = clothingUVs[vid];
return out;
}
Качество — значительно ниже GAN-based подхода: нет реалистичных складок, теней, не учитываются объёмные формы тела. Зато работает в 30 fps даже на iPhone 11.
Управление каталогом одежды
Каждый элемент одежды в каталоге требует специальной подготовки: фото на белом фоне, маска силуэта, категория (upper, lower, dress). Это пайплайн на стороне контента: загрузка → авто-сегментация через RemBG → валидация маски → сохранение в CDN.
Мобильное приложение загружает только превью-изображения (сжатые JPEG), полные данные для try-on передаются серверу напрямую.
Процесс
Аудит каталога одежды и требований к качеству, выбор архитектуры (фото vs AR), настройка серверного пайплайна с HR-VITON или аналогом, on-device компоненты (pose, parsing), UI потока примерки, кэширование результатов.
Ориентиры по срокам
Фото-примерка с серверным инференсом, одна платформа — 4–6 недель. Полная реализация с AR real-time, обе платформы, каталожный пайплайн — 10–16 недель.







