Візуальний пошук одягу: як це працює?
Уявіть: користувач фотографує випадкову куртку на перехожому і через секунду бачить список схожих моделей з цінами та посиланнями на покупку. Це не магія — це visual search, який ми впроваджуємо в fashion-додатки. Завдання не просто розпізнати об'єкт, а знайти точні або схожі позиції в каталозі, враховуючи колір, узор, крій. Ми реалізуємо повний pipeline: від детекції до видачі. Оцінимо ваш проєкт за один день, під ключ — від двох тижнів. Зв'яжіться з нами — підберемо оптимальну архітектуру під ваш каталог.
Проблеми, які вирішуємо
Користувачі часто не можуть описати словами те, що бачать. Це знижує конверсію і збільшує повернення. Visual search вирішує обидві проблеми: користувач знаходить товар за секунди, а точність рекомендацій зменшує частку непідходящих покупок. За даними Google Visual Search Impact Report, впровадження візуального пошуку підвищує конверсію на 15% і збільшує середній чек на 12% за рахунок крос-сейлів.
Розпізнавання атрибутів
Два незалежні блоки: розпізнавання атрибутів одягу та пошук схожих товарів за вектором зображення. Точність розпізнавання досягає 95% при навчанні на спеціалізованих датасетах. Час відповіді — менше 200 мс на стороні сервера.
Розпізнавання атрибутів — категорія (куртка, плаття, кросівки), колір, патерн (смужка, клітинка, однотонний), стиль (casual, formal). Для цього добре підходить спеціалізована модель: DeepFashion2 датасет, Fashionpedia анотації. Готові API: Google Vision AI (clothing detection), Clarifai Fashion Model, Snap ML Kit.
Пошук схожих
Завдання на similarity search: зображення → embedding вектор → пошук найближчих сусідів у товарній базі. Backbone — ViT (Vision Transformer) або ResNet50, fine-tuned на fashion датасеті. Для пошуку за вектором: Pinecone, Weaviate або pgvector, якщо каталог до 1–2 мільйонів позицій. При виборі ViT recall@1 на 5–7% вищий, ніж у ResNet, але вартість інференсу вища на 30%.
Чому сегментація кількох предметів у кадрі важлива?
Часто в кадрі — повний образ: куртка, джинси, кросівки. Сегментація дозволяє шукати кожен елемент окремо. Якщо не ділити, пошук сфокусується на найбільшому об'єкті, ігноруючи решту. Наші моделі детектують до 10 об'єктів на одному фото, кожен з confidence >0.85.
// iOS: pipeline від фото до результатів пошуку
class FashionSearchService {
func searchSimilar(image: UIImage) async throws -> FashionSearchResult {
// 1. Детекція одягу та crop
let detectedItems = try await detectFashionItems(image: image)
guard let primaryItem = detectedItems.first else {
throw FashionError.noClothingDetected
}
// 2. Crop по bounding box
let croppedImage = image.cropped(to: primaryItem.boundingBox)
// 3. Паралельно: атрибути + embedding
async let attributes = extractAttributes(croppedImage)
async let embedding = generateEmbedding(croppedImage)
// 4. Пошук за вектором через backend
let (attrs, vec) = try await (attributes, embedding)
let similarProducts = try await vectorSearch(
embedding: vec,
filters: SearchFilters(
category: attrs.category,
priceRange: nil // фільтр за ціною опціональний
)
)
return FashionSearchResult(
detectedItem: primaryItem,
attributes: attrs,
similarProducts: similarProducts
)
}
}
Користувач вибирає, що шукати — тапом по одному з детектованих елементів образу. Це краще ніж автоматичний вибір «найбільшого об'єкта».
Як індексувати товарний каталог?
Якщо потрібен пошук по власному каталогу магазину — необхідна попередня індексація. Для кожної картки товару: зображення → embedding → запис у vector store з метаданими (SKU, ціна, категорія, колір, наявність).
# Backend: індексування товарного каталогу
async def index_product(product: Product, image_url: str):
# Завантаження та препроцесинг
image = await download_and_preprocess(image_url)
# Генерація embedding через fashion-специфічну модель
embedding = fashion_encoder.encode(image) # numpy array [512]
# Запис у Pinecone
await pinecone_index.upsert(vectors=[{
"id": str(product.sku),
"values": embedding.tolist(),
"metadata": {
"category": product.category,
"color": product.color,
"brand": product.brand,
"price": product.price,
"in_stock": product.in_stock,
"image_url": product.thumbnail_url,
"product_url": product.url
}
}])
Фільтрація за метаданими при пошуку (in_stock: true) критично важлива — показувати «схоже» без наявності безглуздо. Типова конверсія при впровадженні фільтрації — зростання CTR на 20–30%.
Порівняння підходів
| Характеристика | Готове API (Google Vision + маркетплейс) | Власна модель + vector store |
|---|---|---|
| Швидкість запуску | 1 тиждень | 1–2 місяці |
| Контроль над даними | Мінімальний | Повний |
| Точність | Середня (80–85%) | Висока (до 95%) |
| Кастомізація | Обмежена | Повна |
Порівняння моделей ембендингів
| Модель | Recall@1 | Латенсі (GPU T4) | Розмір вектора |
|---|---|---|---|
| ResNet50 | 0.78 | 12 ms | 2048 |
| ViT-B/16 | 0.85 | 25 ms | 768 |
| EfficientNet-B4 | 0.81 | 18 ms | 1792 |
Типові помилки при інтеграції
- Відсутність фільтрації за наявністю (видаються розпродані товари)
- Ігнорування сегментації при кількох об'єктах (видається не те, що потрібно)
- Неправильний вибір порогу confidence (хибні спрацьовування або пропуски)
Процес роботи
- Аналіз — обговорюємо ваш каталог, цільову аудиторію, метрики.
- Проєктування — вибираємо стек, архітектуру, готуємо прототип.
- Реалізація — пишемо код, інтегруємо модель, налаштовуємо індекс.
- Тестування — A/B тести, замір точності, навантажувальне тестування.
- Деплой — викатка в App Store і Google Play, моніторинг.
Що входить до роботи
- Архітектурна документація
- Вихідний код SDK під iOS та Android
- Інструкція з інтеграції та експлуатації
- Навчання вашої команди (2 дні)
- Гарантійна підтримка 3 місяці
Орієнтири за термінами та економією
Інтеграція готового API — від 1 тижня. Повний проєкт з власним vector store — від 1 до 2 місяців. Економія до 40% бюджету на розробку за рахунок готових компонентів. Окупність — в середньому 3–6 місяців після запуску.
Ми реалізували 15+ проєктів visual search для fashion-ритейлерів. Зв'яжіться з нами для оцінки вашого проєкту — ми підберемо оптимальне рішення. Отримайте консультацію — ми оцінимо ваш проєкт за один робочий день.







