AI-Розпізнавання одягу й пошук подібних товарів у мобільних застосунках
Користувач бачить на вулиці куртку, яку хоче купити,—фотографує й миттєво знаходить її в інтернет-магазині або аналоги. Це visual search у fashion-сегменті: задача, яку Pinterest, ASOS і Zalando давно вирішили внутрішньо, але як SDK або API для інтеграції доступна через кілька сервісів.
Технічний стек
Два незалежні блоки: розпізнавання атрибутів одягу й пошук подібних товарів за вектором зображення.
Розпізнавання атрибутів—категорія (куртка, сукня, кросовки), колір, паттерн (полоска, клітка, однотонний), стиль (casual, formal). DeepFashion2 датасет, аннотації Fashionpedia працюють добре. Готові API: Google Vision AI (clothing detection), Clarifai Fashion Model, Snap ML Kit.
Пошук подібних—задача similarity search: зображення → embedding вектор → пошук найближчих сусідів у базі товарів. Backbone—ViT (Vision Transformer) або ResNet50, дообучена на fashion датасеті. Для пошуку за вектором: Pinecone, Weaviate або pgvector для каталогів до 1–2 мільйонів позицій.
// iOS: конвеєр від фото до результатів пошуку
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
)
}
}
Сегментація при кількох предметах одягу в кадрі
Часто в кадрі—повний образ: куртка, джинси, кросовки. Сегментація дозволяє шукати кожен елемент окремо.
struct DetectedFashionItem {
let category: FashionCategory // .top, .bottom, .shoes, .accessory
let boundingBox: CGRect
let confidence: Float
let attributes: FashionAttributes?
struct FashionAttributes {
let color: [String] // ["navy blue", "dark"]
let pattern: PatternType // .solid, .stripes, .plaid
let style: StyleTag // .casual, .sport, .formal
}
}
Користувач вибирає, що шукати—тапом по одному з детектованих елементів образу. Краще, ніж автоматичний вибір «найбільшого об'єкта».
Індексування товарного каталогу
Якщо потрібен пошук за власним каталогом магазину—необхідна попередня індексація. Для кожної карточки товару: зображення → 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) критично важлива—показувати «подібне» без наявності бессенсовно.
Орієнтири за часом
Інтеграція готового API (Google Vision + зовнішній маркетплейс) з базовим UI пошуку—1 тиждень. Повна реалізація з власним vector store для індексування каталогу, сегментацією кількох предметів у кадрі, фільтрацією за атрибутами й підтримкою iOS + Android—1–2 місяці з урахуванням індексування каталогу.







