Реалізація класифікації об'єктів у мобільних додатках
Класифікація об'єктів відрізняється від детекції одним ключовим моментом: модель відповідає на питання «що це?» а не «де це?» Один вихід: вектор ймовірностей по класах. Здається простіше за детекцію, але саме тут найчастіше виникають проблеми з threshold впевненості та UX.
Вибір моделі для завдання
Для топ-1000 класів (продукти, тварини, предмети побуту), використовуйте MobileNetV3, EfficientNetB0/B1. Працюють з коробки через ML Kit Image Labeling або Core ML з моделями з Apple Model Gallery. Для вузької предметної області (конкретний тип продукту, дефекти виробництва), вам потрібна fine-tune модель.
Fine-tuning на кастомному датасеті: візьміть pre-trained backbone (MobileNetV2, EfficientNetB0), заморозьте нижні шари, навчайте тільки верхні шари на своїх даних. Для 10–50 класів достатньо 200–500 прикладів на клас при правильній аугментації. Менше потребує few-shot підходу (Prototypical Networks).
Після навчання: конвертуйте в .mlmodel (iOS) або .tflite (Android), додайте метадані з іменами класів та параметрами нормалізації.
Порогові значення впевненості: де втрачаються продукти
Найпоширеніша помилка UX: показувати результати класифікації без врахування впевненості. Модель завжди повертає розподіл ймовірностей; argmax завжди дає «переможця»—навіть коли модель йому не вірить. Якщо топ-1 клас має оцінку 0.23 із наступним 0.21, це не класифікація, це випадковість.
Правильний підхід: встановіть порог (зазвичай 0.5–0.7 залежно від завдання). Якщо топ-1 нижче порога, покажіть «не вдалося визначити» або попросіть переснять. Для критичних завдань (медицина, юридичні документи), додатково перевіряйте entropy розподілу.
На iOS через VNCoreMLRequest:
request.imageCropAndScaleOption = .centerCrop
let observations = results as? [VNClassificationObservation]
let confident = observations?.filter { $0.confidence > 0.65 }
На Android через ML Kit ImageLabeling:
val options = ImageLabelerOptions.Builder()
.setConfidenceThreshold(0.65f)
.build()
Top-N та відображення результатів
Показування топ-3 класів з відсотками правильно для освітніх та consumer-додатків. Для бізнес-додатків (автоматизація, склад), потрібен один впевнений результат або нічого.
Кейс: додаток для інвентаризації на складі, класифікація 87 SKU через кастомну EfficientNetB0-модель. Первинний порог 0.5 дав 12% хибних спрацювань. Аналізуючи confusion matrix, виявили: 80% помилок між SKU з подібною упаковкою. Додали другий рівень: якщо топ-2 та топ-3 разом перевищують 0.4, попросимо оператора підтвердити вибір. Хибні спрацювання впали до 2.1%.
UI результату: не перевантажуйте користувачів цифрами. Прогресс-бар або кольорове кодування (зелений/жовтий/червоний) читається краще, ніж «73.4%». Анімація появи результату через withAnimation (SwiftUI) або ObjectAnimator (Android) зменшує відчуття «холодної» відповіді від моделі.
Часові рамки та процес
Інтеграція готової моделі в існуючий додаток: 3–5 днів. Fine-tune кастомної моделі + інтеграція: 1–2 тижні. Вартість розраховується індивідуально.







