Object Classification in Mobile Apps
We integrate object classification into mobile apps turnkey. Unlike detection, the model outputs a single probability vector per class. It seems simpler, but this is where developers most often make mistakes: choosing the wrong confidence threshold, ignoring post-processing, and forgetting about UX. In this article, we break down how to avoid these pitfalls and make classification reliable and user-friendly. Experience with Core ML, ML Kit, EfficientNet—over 5 years in mobile development.
How to Choose a Classification Model?
For top-1000 classes (products, animals, household items), MobileNetV3-Large or EfficientNetB0/B1 work well. They run out-of-the-box via ML Kit Image Labeling or Core ML with models from the Apple Model Gallery. For a narrow domain (specific product types, manufacturing defects), a fine-tuned model is required.
Comparison of popular options:
| Model | Size | Accuracy (top-1) | Applicability |
|---|---|---|---|
| MobileNetV3-Large | ~5 MB | 75.6% | General, fast |
| EfficientNetB0 | ~8 MB | 77.1% | Balance of speed and accuracy |
| Custom (fine-tuned) | 5-10 MB | 80-90% (dataset dependent) | Narrow domain |
| Solution type | When to choose | Example |
|---|---|---|
| Pre-built model | Top-1000 classes, quick start | ML Kit Image Labeling |
| Fine-tuning | 10–50 classes, 200–500 examples per class | Custom EfficientNet |
| Few-shot learning | Fewer than 50 examples per class | Prototypical Networks |
Fine-tuning on a custom dataset: take a pre-trained backbone (MobileNetV2, EfficientNetB0), freeze the lower layers, train only the top layers on your data. For 10–50 classes, 200–500 examples per class with proper augmentation suffice. Fewer—requires a few-shot approach (Prototypical Networks). After training, convert to .mlmodel (iOS) or .tflite (Android), adding metadata with class names and normalization parameters. EfficientNet is a good balance of speed and accuracy.
How to Choose the Confidence Threshold?
The most frequent UX mistake is showing classification results without considering confidence. The model always returns a probability distribution; argmax always picks a 'winner'—even when the model is unsure. If the top-1 class scores 0.23 with the next at 0.21, that's not classification—it's randomness.
The right approach: set a threshold (typically 0.5–0.7 depending on the task). If top-1 falls below the threshold, show 'unable to determine' or ask for a retake. For critical tasks (medical, legal documents)—also check the entropy of the distribution. According to Core ML documentation, the threshold is set via the confidenceThreshold parameter in VNCoreMLRequest.
On iOS via VNCoreMLRequest:
request.imageCropAndScaleOption = .centerCrop let observations = results as? [VNClassificationObservation] let confident = observations?.filter { $0.confidence > 0.65 } On Android via ML Kit ImageLabeling:
val options = ImageLabelerOptions.Builder() .setConfidenceThreshold(0.65f) .build() Why Is Post-Processing Important?
Showing top-3 classes with percentages is appropriate for educational and consumer apps. For business apps (automation, warehouse), you need one confident result or nothing. Post-processing includes not only the threshold but also checking the gap between top-1 and top-2: if the difference is small, ask for user confirmation.
Case study: an inventory app for a warehouse, classifying 87 SKUs via a custom EfficientNetB0 model. The initial threshold of 0.5 gave 12% false positives. After analyzing the confusion matrix, we found that 80% of errors occurred between SKUs with similar packaging. We added a second level: if top-2 and top-3 together exceed 0.4, the operator is prompted to confirm. False positives dropped to 2.1%.
UI for results: don't overwhelm users with numbers. A progress bar or color indicator (green/yellow/red) is perceived better than '73.4%'. Animating the result appearance via withAnimation (SwiftUI) or ObjectAnimator (Android) reduces the feeling of a 'cold' model response.
What Is Included
When you order object classification implementation, you get:
- Task analysis and model architecture selection
- Fine-tuning on your dataset (if needed)
- Conversion to
.mlmodel(iOS) /.tflite(Android) - Integration into the app with data flow setup
- Confidence threshold tuning and post-processing
- UI development for result display
- Testing on real data and error correction
- Documentation and team support
Work Process
- Analysis — understand the task, collect dataset, choose metrics
- Design — determine architecture, processing pipeline
- Implementation — fine-tuning, conversion, integration
- Testing — unit tests, UI tests, A/B tests on confidence
- Deployment — release to App Store / Google Play, monitoring
Timelines and Pricing
Integration of a ready-made model into an existing app: 3–5 days. Fine-tuning a custom model plus integration: 1–2 weeks. Pricing is determined individually—we evaluate your project after an initial consultation. We guarantee quality and deadlines, backed by over 5 years of mobile development experience.
Want to implement object classification? Contact us for a free consultation and preliminary estimate. Order classification integration into your app today.







