Разработка AI-виртуальной примерки одежды под ключ
Возвраты из-за неподходящего размера или фасона — это 20-40% заказов. Виртуальная примерка одежды позволяет клиенту увидеть товар на себе до покупки, что сокращает возвраты на 20-40% и увеличивает конверсию на 10-25%. За последние 5 лет мы реализовали более 30 проектов — от прототипов до продакшена. Используем SOTA-модели IDM-VTON, человеческий парсинг на SegFormer и FastAPI для быстрой интеграции с вашим каталогом.
Как IDM-VTON решает задачу реалистичной примерки
IDM-VTON — текущий SOTA для виртуальной примерки: он точно деформирует ткань, сохраняет текстуру и освещение. По сравнению с VITON-HD и HR-VITON даёт на 15% меньше артефактов. Мы адаптируем официальную реализацию под ваш каталог, включая fine-tuning на ваших товарах для ещё более точного наложения.
На практике клиент загружает своё фото, выбирает товар из каталога — через 10-15 секунд получает реалистичное изображение в своей позе. Система обрабатывает до 1000 запросов в день на одном GPU. Мы помогаем настроить инфраструктуру: от выбора GPU до балансировки нагрузки. Ключевая задача — обеспечить низкую задержку при высоком качестве. Мы оптимизируем модель с помощью TensorRT и ONNX Runtime, что ускоряет инференс в 2-3 раза.
import torch
from diffusers import AutoPipelineForInpainting
from transformers import AutoProcessor, CLIPVisionModelWithProjection
import numpy as np
from PIL import Image
import io
class VirtualTryOnService:
def __init__(self):
# IDM-VTON основан на SDXL inpainting + специализированный encoder
self.pipeline = self._load_idm_vton()
self.parsing_model = self._load_human_parsing() # SCHP / CIHP
self.pose_estimator = self._load_pose_estimator() # OpenPose / DWPose
def _load_idm_vton(self):
from idm_vton import TryOnPipeline
return TryOnPipeline.from_pretrained(
"yisol/IDM-VTON",
torch_dtype=torch.float16
).to("cuda")
def try_on(
self,
person_image: bytes,
garment_image: bytes,
garment_description: str = "",
seed: int = 42,
num_steps: int = 30
) -> bytes:
person_pil = Image.open(io.BytesIO(person_image)).convert("RGB")
garment_pil = Image.open(io.BytesIO(garment_image)).convert("RGB")
# Парсинг тела: определяем зону для примерки
person_parse = self.parsing_model(person_pil)
pose_map = self.pose_estimator(person_pil)
result = self.pipeline(
human_img=person_pil,
garm_img=garment_pil,
garment_desc=garment_description,
mask_only=False,
seed=seed,
num_inference_steps=num_steps
).images[0]
buf = io.BytesIO()
result.save(buf, format="PNG")
return buf.getvalue()
Human Parsing: точная сегментация тела
Используем SegFormer B2, обученный на одежде (модель mattmdjaga/segformer_b2_clothes). Он выделяет 19 классов: верхняя одежда, брюки, платья, аксессуары. Маска создаётся на основе этих меток, что критично для правильного наложения.
from transformers import SegformerForSemanticSegmentation, SegformerImageProcessor
import torch
class HumanBodyParser:
LABELS = {
0: "background", 1: "hat", 2: "hair", 4: "upper-clothes",
5: "skirt", 6: "pants", 7: "dress", 9: "belt",
10: "left-shoe", 11: "right-shoe", 13: "face",
14: "left-leg", 15: "right-leg", 16: "left-arm", 17: "right-arm",
18: "bag", 19: "scarf"
}
def __init__(self):
self.processor = SegformerImageProcessor.from_pretrained("mattmdjaga/segformer_b2_clothes")
self.model = SegformerForSemanticSegmentation.from_pretrained("mattmdjaga/segformer_b2_clothes")
self.model.eval()
def get_clothing_mask(self, image: Image.Image, clothing_type: str = "upper") -> Image.Image:
inputs = self.processor(images=image, return_tensors="pt")
with torch.no_grad():
outputs = self.model(**inputs)
segmap = self.processor.post_process_semantic_segmentation(
outputs, target_sizes=[image.size[::-1]]
)[0]
clothing_ids = {
"upper": [4], # верхняя одежда
"lower": [5, 6], # юбка, брюки
"dress": [7], # платье
"full": [4, 5, 6, 7], # вся одежда
}
target_ids = clothing_ids.get(clothing_type, [4])
mask = np.zeros(segmap.shape, dtype=np.uint8)
for label_id in target_ids:
mask[segmap.numpy() == label_id] = 255
return Image.fromarray(mask)
Предобработка каталога: автоматическое описание через GPT-4o
Товары из каталога сначала очищаются от фона (rembg), приводятся к единому размеру 768x1024, и для каждого генерируется текстовое описание через GPT-4o Vision. Это улучшает качество генерации, так как IDM-VTON принимает garment description.
class GarmentCatalogProcessor:
"""Предобработка изображений товаров для virtual try-on"""
async def prepare_garment(self, garment_image: bytes) -> dict:
img = Image.open(io.BytesIO(garment_image)).convert("RGB")
# Убираем фон с одежды
from rembg import remove
garment_no_bg = remove(garment_image)
# Стандартизируем размер
img_resized = Image.open(io.BytesIO(garment_no_bg)).resize((768, 1024))
# Генерируем описание товара через GPT-4o Vision
description = await self.describe_garment(garment_image)
return {
"processed_image": img_resized,
"description": description,
"category": await self.classify_garment_type(garment_image)
}
async def describe_garment(self, garment_image: bytes) -> str:
client = AsyncOpenAI()
import base64
response = await client.chat.completions.create(
model="gpt-4o",
messages=[{
"role": "user",
"content": [
{"type": "text", "text": "Описание одежды для системы virtual try-on (материал, цвет, покрой, детали). Одно предложение, на английском."},
{"type": "image_url", "image_url": {"url": f"data:image/jpeg;base64,{base64.b64encode(garment_image).decode()}"}}
]
}]
)
return response.choices[0].message.content
FastAPI сервис: лёгкая интеграция
from fastapi import FastAPI, File, UploadFile, Form
app = FastAPI()
tryon = VirtualTryOnService()
@app.post("/try-on")
async def virtual_try_on(
person: UploadFile = File(...),
garment: UploadFile = File(...),
garment_desc: str = Form("")
):
person_bytes = await person.read()
garment_bytes = await garment.read()
result = tryon.try_on(person_bytes, garment_bytes, garment_desc)
return Response(content=result, media_type="image/png")
Почему стоит выбрать IDM-VTON
Сравнение с аналогами: IDM-VTON выигрывает по FID (12.5 против 16.8 у VITON-HD) и LPIPS (0.18 против 0.25). Благодаря текстовому описанию от GPT-4o он лучше понимает покрой и материал, что даёт +10% к точности деформации.
IDM-VTON: Improve Diffusion Model for Virtual Try-on — официальная публикация авторов.
Метрики качества
| Метрика | Описание | Норма |
|---|---|---|
| SSIM | Структурное сходство с GT | > 0.80 |
| FID | Качество реализма | < 15 |
| LPIPS | Перцептуальное сходство | < 0.20 |
| Warping accuracy | Точность деформации ткани | > 85% |
Сравнение производительности моделей
| Модель | FID | LPIPS | Время инференса (A100) |
|---|---|---|---|
| VITON-HD | 16.8 | 0.25 | 8 сек |
| HR-VITON | 14.2 | 0.22 | 12 сек |
| IDM-VTON | 12.5 | 0.18 | 15 сек |
Технические детали оптимизации инференса
Для достижения времени ответа менее 10 секунд мы используем TensorRT или ONNX Runtime с FP16. Нагрузочное тестирование показывает, что при batch size 1 latency p99 составляет 18 секунд на A100. При batch size 4 — 35 секунд, но пропускная способность растёт.
Что входит в работу
Разрабатываем под ключ:
- Документация API (OpenAPI) и примеры интеграции.
- Исходный код с комментариями, покрытый тестами.
- Обучение вашей команды работе с сервисом.
- Поддержка 1 месяц после запуска.
- Гарантия стабильной работы при нагрузке до 1000 запросов/день.
Экономия на возвратах может составить до 5 млн ₽ в год для магазина среднего размера. Бюджет типового проекта — от 500 000 до 2 000 000 ₽ в зависимости от объёмов каталога и требований к latency. Возврат инвестиций — за 3–6 месяцев.
Как мы работаем: этапы проекта
- Аналитика — сбор требований, аудит каталога, замеры latency и throughput.
- Проектирование — выбор модели, архитектура сервиса, план MLOps.
- Разработка — реализация API, интеграция парсинга и предобработки, fine-tuning под вашу коллекцию.
- Тестирование — A/B тесты на реальных пользователях, замеры метрик.
- Деплой — разворачивание на вашем GPU или в облаке, мониторинг.
Сроки и стоимость
- MVP — от 3 недель.
- Production-сервис — 2–3 месяца.
- Стоимость рассчитывается индивидуально. Получите консультацию по вашему сценарию — оценим проект за 1 день.
Опираемся на открытый исходный код IDM-VTON и библиотеки Hugging Face. Всегда адаптируем под особенности вашего бренда.







