Поиск аналогов по фото: AI-распознавание мебели в мобильном приложении
Клиент хочет, чтобы пользователь сфотографировал диван и получил похожие модели с ценами. Но мебель — не одежда: одинаковые с виду кресла могут отличаться по стилю и размерам. Ошибка на этапе классификации изображений ведёт к ложным рекомендациям. Мы решаем эту задачу с помощью комбинации Transfer Learning на свёрточных сетях и векторного поиска. Наш опыт показывает, что правильно настроенная модель экономит до 40% времени на ручной обработке каталога, а стоимость поддержки каталога снижается на 25% за счёт автоматизации.
Почему мебель сложнее одежды?
У мебели жёсткая геометрия и узнаваемые формы — это упрощает классификацию. Но поиск «похожего за меньшие деньги» требует не только визуального совпадения, но и понимания стиля (скандинавский минимализм, лофт, классика) и масштаба. Диван на фото без контекста — не позволяет понять, трёхместный он или двухместный. Мы решаем это с помощью дополнительных классификаторов стиля мебели и фильтрации по атрибутам.
Источник: рекомендации по обработке изображений мебели из открытых датасетов (например, Furniture-180).
Проблемы, которые мы решаем
- Категоризация: Большинство готовых моделей (Google Cloud Vision, AWS Rekognition) обучены на ImageNet — там мебели достаточно. Но точность падает для редких форм. Мы дообучаем EfficientNet или MobileNetV3 на каталоге магазина: 50 000 изображений (по 200–300 на категорию) дают уверенную классификацию основных категорий: диван, кресло, стол, стул, шкаф, кровать, тумба.
- Определение стиля: Категория — только первый шаг. Для поиска аналогов важен стиль. Используем CLIP, который понимает текстовые описания: "скандинавский минимализм", "лофт", "классика". CLIP сравнивает эмбеддинг изображения с эмбеддингами текстовых стилей и возвращает наиболее вероятный.
- Поиск с фильтрами: Архитектура та же, что и для одежды: эмбеддинг → vector search. Но для мебели важна фильтрация по материалу (дерево, металл, ткань), цвету, размерной группе. Размерный класс без AR определяется приблизительно — по соотношению сторон и типичным пропорциям для категории.
Сравнение подходов к классификации
| Подход | Точность | Время на обучение | Набор данных |
|---|---|---|---|
| Готовый API (Google Cloud Vision) | 75-85% | 0 | Не требуется |
| Transfer Learning (MobileNetV3) | 92-96% | 2-4 дня | 500–1000 на категорию |
| Обучение с нуля (ResNet) | 96%+ | 2-4 недели | 10000+ на категорию |
Transfer Learning — оптимальный выбор для большинства ритейлеров: точность 92% при минимальных затратах времени. Он точнее готового API в среднем на 15% по нашим тестам. При этом Transfer Learning требует в 2-3 раза меньше данных, чем обучение с нуля, при сравнимой точности. Мы используем MobileNetV3 или EfficientNet-Lite — они работают прямо на устройстве.
Как определить стиль мебели?
| Метод | Точность определения стиля | Необходимость разметки |
|---|---|---|
| Только визуальные признаки (CNN) | 70-80% | 500+ изображений на стиль |
| CLIP (текст+изображение) | 85-95% | Текстовые описания стилей |
| Гибрид (CLIP + кастомный классификатор) | 90-97% | 200 изображений на стиль |
CLIP позволяет быстро подстроиться под новый стиль без переобучения — достаточно добавить текстовое описание. Подробнее о CLIP можно узнать в официальном репозитории.
Как мы это делаем: стек и примеры
Для Android используем TFLite с XNNPACK оптимизацией. Пример классификатора:
// Android: TFLite классификация мебели
class FurnitureClassifier(context: Context) {
private val interpreter: Interpreter by lazy {
val model = FileUtil.loadMappedFile(context, "furniture_classifier_v2.tflite")
Interpreter(model, Interpreter.Options().apply {
numThreads = 4
useXNNPACK = true
})
}
fun classify(bitmap: Bitmap): List<FurnitureClassification> {
val resized = Bitmap.createScaledBitmap(bitmap, 224, 224, true)
val input = TensorImage.fromBitmap(resized)
val output = TensorBuffer.createFixedSize(intArrayOf(1, NUM_CLASSES), DataType.FLOAT32)
interpreter.run(input.buffer, output.buffer)
return output.floatArray
.mapIndexed { index, score -> FurnitureClassification(LABELS[index], score) }
.filter { it.score > 0.1f }
.sortedByDescending { it.score }
}
}
Для iOS — Core ML. CLIP позволяет определять стиль через текстовые промпты:
// iOS: CLIP-based style detection через Core ML
// CLIP модель конвертирована в .mlpackage
func detectStyle(_ image: UIImage) async throws -> [StyleScore] {
let styleDescriptions = [
"scandinavian minimalist furniture",
"industrial loft style furniture",
"classic traditional furniture",
"mid-century modern furniture",
"boho eclectic furniture"
]
// CLIP сравнивает image embedding с text embeddings стилей
let imageEmbedding = try await clipEncoder.encodeImage(image)
return styleDescriptions.enumerated().map { i, desc in
let textEmbedding = clipEncoder.encodeText(desc)
let similarity = cosineSimilarity(imageEmbedding, textEmbedding)
return StyleScore(style: desc, score: similarity)
}.sorted { $0.score > $1.score }
}
Как работает поиск аналогов по каталогу?
Эмбеддинги товаров хранятся в векторной БД (например, FAISS или Pinecone). Поиск включает несколько этапов:
- Извлечение эмбеддинга: изображение пользователя проходит через ту же модель, что и каталог.
- Векторный поиск: косинусное расстояние до всех эмбеддингов каталога.
- Применение фильтров: отсев по категории, стилю, материалу, цвету, размеру и цене.
- Постобработка: сортировка по схожести и вывод топ-10 результатов.
struct FurnitureSearchFilters {
let category: FurnitureCategory
let style: StyleTag?
let colorFamily: ColorFamily? // warm, cool, neutral
let material: MaterialType? // wood, metal, upholstered
let maxDimensionClass: SizeClass? // compact, standard, large
let priceRange: ClosedRange<Int>?
let inStockOnly: Bool
}
Процесс интеграции
Внедрение функции распознавания и поиска аналогов проходит несколько этапов:
Подробнее об этапах
- Анализ каталога: оценка объёма изображений, категорий, стилей.
- Подготовка данных: разметка 200–500 изображений на категорию/стиль (если требуется дообучение).
- Обучение модели: Transfer Learning на TensorFlow/Keras или Create ML.
- Интеграция в приложение: подключение TFLite/Core ML, настройка векторного хранилища.
- Тестирование: A/B тест точности распознавания и скорости поиска.
- Деплой: релиз через App Store/Google Play, мониторинг.
Минимально жизнеспособный продукт (MVP) можно запустить за 1 неделю, используя готовое API распознавания и облачное векторное хранилище. Полное решение с собственной моделью, CLIP и AR-размерами занимает 1–2 месяца. Например, для одного из клиентов с каталогом 10 000 товаров мы дообучили MobileNetV3 на 500 изображениях на категорию. Точность классификации выросла с 72% до 94%.
Объем работ
- MVP: интеграция с готовым API (Google Cloud Vision + векторный поиск) — срок от 1 недели.
- Полное решение: дообученная TFLite/CoreML модель, CLIP-классификатор стиля, векторное хранилище с фильтрами, AR-размеры (LiDAR) — срок 1–2 месяца.
- Документация по модели и API.
- Обучение команды заказчика.
- Пост-релизная поддержка 2 недели.
Наша команда имеет 7+ лет опыта в мобильной разработке и машинном обучении. Мы выполнили 30+ проектов по распознаванию изображений. Гарантируем качество: модель будет работать офлайн, без задержек. Если вы хотите реализовать аналогичную функцию, свяжитесь с нами — мы подберём оптимальное решение. Получите консультацию по интеграции — оценим ваш проект бесплатно.







