AI Furniture Recognition and Analogs Search in Mobile Applications
Unlike clothing, furniture has rigid geometry and recognizable forms—simplifying classification. Finding "similar for less" requires visual match and understanding style (Scandinavian minimalism, loft, classic) and scale. Sofa in photo without context—can't tell if three-seat or two-seat.
Recognition Stack
For furniture classification, general models work well—Google Cloud Vision, AWS Rekognition—trained on broad ImageNet datasets where furniture is adequate. Additionally: IKEA datasets (academically available) and ADE20K for segmentation.
More precise option for specific retailer—fine-tune EfficientNet or MobileNetV3 on store catalog. 50,000 images (200–300 per category) give confident classification of main categories: sofa, armchair, table, chair, cabinet, bed, nightstand.
// Android: TFLite furniture classification
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 }
}
}
Style Determination
Category ("sofa") is only step one. For analog search, style matters. Train separate classifier on style categories or use CLIP—it understands text style descriptions:
// iOS: CLIP-based style detection via Core ML
// CLIP model converted to .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 compares image embedding with text embeddings of styles
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 }
}
Searching Analogs in Catalog
Architecture same as clothing: embedding → vector search. But for furniture, additional attribute filtering: material (wood, metal, upholstered), color, size class.
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
}
Size class without AR determined approximately—by aspect ratio and typical proportions for category. Precise sizes via ARKit LiDAR (iPhone 12 Pro+) but that's separate page.
Timeline Estimates
Integrating ready API (Google Vision + external catalog like IKEA API, Amazon Product API)—1 week. Full implementation with custom TFLite/CoreML model on retailer catalog, CLIP-based style detection, vector search with filtering, and AR dimensions—1–2 months.







