Підрахунок об'єктів через камеру: від детекції до трекінгу
Підрахунок об'єктів у реальному часі через камеру — задача з підводним камінням. Об'єкти, що перекриваються, різний масштаб, а головна пастка — double counting при русі камери. Промисловий склад, стадо тварин, монети на столі — кожен сценарій вимагає своєї стратегії. Ми займаємося mobile AI комп'ютерним зором більше 5 років і реалізували 30+ проєктів. Пропонуємо готові рішення під ключ для iOS та Android з використанням останніх версій фреймворків.
Коли потрібен автоматичний підрахунок об'єктів?
Типові кейси: облік товару на складі (складська логістика), моніторинг поголів'я в аграрному секторі, підрахунок відвідувачів у магазині. Скрізь, де потрібно швидко та точно дізнатися кількість без ручного перерахунку. Автоматизація скорочує витрати до 15% та виключає людську помилку.
Два підходи: детекція vs density map
Detection-based counting — YOLOv8 mobile або RT-DETR виявляє кожен об'єкт, їх кількість = count. Працює при низькій щільності (до 50–100 об'єктів у кадрі), об'єкти не перекриваються сильно.
Density map estimation — CNN передбачає карту щільності, інтеграл карти = count. Використовується при високій щільності: натовп людей, зерно в бункері, клітини під мікроскопом. CSRNet, DMCount, BL-model — актуальні архітектури.
| Критерій | Detection-based | Density map |
|---|---|---|
| Макс. щільність | до 100 об'єктів | необмежено |
| Точність при перекриттях | низька | висока |
| Швидкість (FPS) | 30+ (iPhone 15) | 15-20 |
| Необхідність трекінгу | так (при русі) | ні (інтеграл стабільний) |
| Порівняння точності підрахунку | Detection-based (YOLOv8) | Density map (CSRNet) |
|---|---|---|
| Низька щільність (<50 об'єктів) | 95-99% | 97-99% |
| Середня щільність (50-200) | 80-90% | 95-98% |
| Висока щільність (200+) | 50-70% | 90-95% |
// iOS: вибір методу залежно від очікуваної щільності
enum CountingStrategy {
case detection(model: VNCoreMLModel) // < 100 об'єктів
case densityMap(model: VNCoreMLModel) // > 100 об'єктів у кадрі
case hybrid // змішаний, визначається адаптивно
}
class AdaptiveObjectCounter {
func selectStrategy(for objectClass: CountableObject) -> CountingStrategy {
switch objectClass {
case .vehicle, .person_sparse:
return .detection(model: vehicleDetector)
case .crowd, .grain, .cell:
return .densityMap(model: densityEstimator)
case .product_shelf:
return .hybrid
}
}
}
Як уникнути повторного підрахунку при русі камери?
Якщо користувач плавно веде камерою (склад, аудиторія), потрібен трекінг, щоб не рахувати одні об'єкти двічі. ByteTracker — один з найкращих алгоритмів для цього завдання, стійкий до оклюзій. Ми реалізували інтеграцію на iOS та Android з використанням non-maximum suppression для фільтрації дублікатів.
class TrackingObjectCounter {
private var tracker = ByteTracker() // BYTE алгоритм трекінгу
private var countedIds: Set<Int> = [] // унікальні ID за сесію
func processFrame(_ detections: [Detection]) -> TrackingCountResult {
let tracks = tracker.update(detections: detections)
// Нові ID — нові об'єкти, які увійшли в кадр
let newIds = tracks.map { $0.trackId }.filter { !countedIds.contains($0) }
countedIds.formUnion(newIds)
return TrackingCountResult(
currentFrameCount: tracks.count, // в кадрі зараз
totalUniqueCount: countedIds.count // всього за сесію
)
}
}
Чому density map точніше detection при високій щільності?
Detection-based методи перестають працювати, коли об'єкти перекривають один одного: один bounding box накриває кілька об'єктів, або один об'єкт дробиться на частини. Density map вирішує цю проблему — нейромережа передбачає карту розподілу, і сума значень дає точну кількість. Наприклад, при підрахунку зерен у бункері (1000+ об'єктів) density map помиляється на 2-5%, тоді як detection дає похибку 20-30%. Density map estimation точніше detection в 4-10 разів при сильних перекриттях.
// Android: density map estimation через TFLite
class DensityMapCounter(context: Context) {
private val interpreter: Interpreter by lazy {
val model = FileUtil.loadMappedFile(context, "csrnet_lite.tflite")
Interpreter(model, Interpreter.Options().apply {
addDelegate(GpuDelegate())
numThreads = 4
})
}
fun estimate(bitmap: Bitmap): Int {
// Вхідний розмір моделі — зазвичай 512×512 або кратний 16
val resized = Bitmap.createScaledBitmap(bitmap, 512, 512, true)
val inputBuffer = TensorImage.fromBitmap(resized).buffer
// Вихідний тензор — density map того ж розміру
val outputBuffer = TensorBuffer.createFixedSize(
intArrayOf(1, 512, 512, 1), DataType.FLOAT32
)
interpreter.run(inputBuffer, outputBuffer.buffer)
// Сума по всіх пікселях density map = estimated count
val densitySum = outputBuffer.floatArray.sum()
// Масштабування: сума відповідає кількості об'єктів
return densitySum.roundToInt()
}
}
Що входить в реалізацію підрахунку об'єктів
- Аналіз сценарію — оцінка щільності, типів об'єктів, умов зйомки (освітлення, статика/рух).
- Вибір моделі — навчання/донавчання YOLOv8, CSRNet або кастомної архітектури.
- Інтеграція — підключення Vision (iOS) / TFLite (Android), реалізація пайплайну детекції → NMS → трекінг.
- UI лічильника — відображення поточної та загальної кількості, анімація, звукове оповіщення.
- Оптимізація — квантизація, GPU delegate, кешування дескрипторів.
- Документація та підтримка — передача вихідних кодів, опис API, навчання команди.
Гарантуємо точність підрахунку 90-97% залежно від умов (перевірено на 10+ проєктах для складів та аграрного моніторингу). Зв'яжіться з нами для оцінки вашого сценарію — визначимо стратегію та терміни за 1-2 дні.
Процес впровадження підрахунку об'єктів
- Аналітика — ви надсилаєте відео або опис завдання. Ми підбираємо архітектуру.
- Прототип — за 3-5 днів робимо працюючий демо-збірки під iOS та Android.
- Інтеграція — вбудовуємо модуль у ваш додаток, налаштовуємо пайплайн.
- Тест — проводимо заміри точності на ваших даних, при необхідності донавчаємо модель.
- Деплой — публікація в App Store / Google Play, моніторинг у production.
Терміни: від 5 днів до 2 тижнів залежно від складності. Точну вартість розраховуємо індивідуально після аналізу завдання. Замовте консультацію — ми проаналізуємо вашу задачу та запропонуємо оптимальну стратегію.
Типові помилки при впровадженні AI-підрахунку
- Використання detection-based методів при високій щільності без адаптації — точність падає до 50%.
- Ігнорування трекінгу при русі камери — double counting до 40% надлишкового підрахунку.
- Нехтування освітленням: моделі, навчені на рівномірному світлі, дають збій на відблисках та тінях.
- Відсутність квантизації моделі — FPS нижче 5 на пристроях без GPU.







