Реализация AI-распознавания мебели и поиска аналогов в мобильном приложении
В отличие от одежды, мебель имеет жёсткую геометрию и узнаваемые формы — что упрощает классификацию. Но поиск «похожего за меньшие деньги» требует не только визуального совпадения, но и понимания стиля (скандинавский минимализм, лофт, классика) и масштаба. Диван на фото без контекста — не позволяет понять, трёхместный он или двухместный.
Стек распознавания
Для классификации мебели хорошо работают общие модели — Google Cloud Vision, AWS Rekognition — они натренированы на широких датасетах ImageNet, где мебели достаточно. Дополнительно: специализированные датасеты IKEA (публично доступен в академическом виде) и ADE20K для сегментации.
Более точный вариант для конкретного ритейлера — дообучение EfficientNet или MobileNetV3 на каталоге магазина. 50 000 изображений (по 200–300 на категорию) дают уверенную классификацию основных категорий: диван, кресло, стол, стул, шкаф, кровать, тумба.
// 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 }
}
}
Определение стиля
Категория («диван») — только первый шаг. Для поиска аналогов важен стиль. Можно натренировать отдельный классификатор на стилевые категории или использовать 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 }
}
Поиск аналогов по каталогу
Архитектура та же, что и для одежды: embedding → vector search. Но для мебели важна дополнительная фильтрация по атрибутам: материал (дерево, металл, ткань), цвет, размерная группа.
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
}
Размерный класс без AR определяется приблизительно — по соотношению сторон и типичным пропорциям для категории. Точные размеры через ARKit LiDAR (доступен с iPhone 12 Pro) — но это feature для отдельной страницы.
Ориентиры по срокам
Интеграция с готовым API классификации и поиском по внешнему каталогу (IKEA API, Amazon Product API) — 1 неделя. Реализация с собственной TFLite/CoreML моделью на каталоге ритейлера, CLIP-based определением стиля, vector search по каталогу с фильтрацией и AR-размерами — 1–2 месяца.







