Реализация 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, fine-tuned на fashion датасете. Для поиска по вектору: Pinecone, Weaviate или pgvector, если каталог до 1–2 миллионов позиций.
// 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
)
}
}
Сегментация при нескольких предметов одежды в кадре
Часто в кадре — полный образ: куртка, джинсы, кроссовки. Сегментация позволяет искать каждый элемент отдельно.
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 месяца с учётом индексирования каталога.







