ספירת עצמים באמצעות מצלמה: מבינה מלאכותית ניידת ל-iOS ואנדרואיד
ספירת עצמים בזמן אמת באמצעות מצלמה היא משימה מורכבת. עצמים חופפים, קנה מידה משתנה, והמלכודת העיקרית — ספירה כפולה כאשר המצלמה נעה. מחסן תעשייתי, עדר חיות, מטבעות על שולחן — כל תרחיש דורש אסטרטגיה משלו. אנו עוסקים בראייה ממוחשבת מבוססת בינה מלאכותית לנייד כבר למעלה מ-5 שנים והעברנו למעלה מ-30 פרויקטים. אנו מציעים פתרונות סוהר ל-iOS ואנדרואיד באמצעות הגרסאות העדכניות ביותר של frameworks.
מתי יש צורך בספירת עצמים אוטומטית?
מקרי שימוש אופייניים: מלאי במחסן (לוגיסטיקת מחסנים), ניטור בעלי חיים בחקלאות, ספירת מבקרים בחנות. בכל מקום שבו יש צורך בספירות מהירות ומדויקות ללא ספירה ידנית חוזרת. אוטומציה מפחיתה עלויות בעד 15% ומבטלת טעויות אנוש.
שתי גישות: זיהוי לעומת מפת צפיפות
ספירה מבוססת זיהוי — YOLOv8 mobile או RT-DETR מזהה כל עצם; ספירה = מספר הזיהויים. עובד היטב בצפיפות נמוכה (עד 50–100 עצמים לפריים) עם חפיפה מינימלית.
הערכת מפת צפיפות — CNN מנבא מפת צפיפות; אינטגרציה של המפה נותנת את הספירה. משמש לצפיפות גבוהה: קהל, תבואה במיכל, תאים תחת מיקרוסקופ. CSRNet, DMCount, BL-model הם ארכיטקטורות עדכניות.
| קריטריון | מבוסס זיהוי | מפת צפיפות |
|---|---|---|
| צפיפות מקסימלית | עד 100 עצמים | ללא הגבלה |
| דיוק תחת חסימה | נמוך | גבוה |
| מהירות (FPS) | 30+ (iPhone 15) | 15-20 |
| נדרש מעקב | כן (בעת תנועה) | לא (יציב אינטגרלית) |
| השוואת דיוק ספירה | מבוסס זיהוי (YOLOv8) | מפת צפיפות (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 ואנדרואיד באמצעות 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 // всего за сессию
)
}
} מדוע מפת צפיפות מדויקת יותר מזיהוי בצפיפות גבוהה?
שיטות מבוססות זיהוי נכשלות כאשר עצמים חופפים: תיבה אחת מכסה מספר עצמים, או עצם אחד מחולק לחלקים. מפת צפיפות פותרת זאת — הרשת הנוירונית מנבאת מפת התפלגות, והסכום נותן את הספירה המדויקת. לדוגמה, בספירת תבואה במיכל (1000+ עצמים), מפת צפיפות חורגת ב-2-5%, בעוד שזיהוי שגוי ב-20-30%. הערכת מפת צפיפות מדויקת פי 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 (אנדרואיד), יישום pipeline: זיהוי → NMS → מעקב.
- ממשק ספירה — הצגת ספירה נוכחית וסופית, אנימציות, התראות קול.
- אופטימיזציה — קוונטיזציה, GPU delegate, שמירת descriptors במטמון.
- תיעוד ותמיכה — מסירת קוד מקור, תיאור API, הדרכת צוות.
אנו מבטיחים דיוק ספירה של 90-97% בהתאם לתנאים (אומת על 10+ פרויקטים למחסנים וניטור חקלאי). צרו קשר להערכת התרחיש שלכם — נקבע את האסטרטגיה ולוח הזמנים תוך 1-2 ימים.
תהליך יישום ספירת עצמים
- ניתוח — אתם שולחים וידאו או תיאור המשימה. אנו בוחרים את הארכיטקטורה.
- אב טיפוס — תוך 3-5 ימים אנו בונים build דמו עובד ל-iOS ואנדרואיד.
- אינטגרציה — הטמעת המודול באפליקציה שלכם, הגדרת ה-pipeline.
- בדיקה — מדידת דיוק על הנתונים שלכם, כוונון עדין של המודל במידת הצורך.
- השקה — פרסום ל-App Store / Google Play, ניטור בסביבת ייצור.
לוח זמנים: מ-5 ימים עד שבועיים בהתאם למורכבות. עלות מדויקת מחושבת באופן אישי לאחר ניתוח המשימה. בקשו ייעוץ — ננתח את המשימה שלכם ונציע את האסטרטגיה האופטימלית.
טעויות נפוצות ביישום ספירת AI
- שימוש בשיטות מבוססות זיהוי בצפיפות גבוהה ללא התאמה — הדיוק יורד ל-50%.
- התעלמות ממעקב כאשר המצלמה נעה — ספירה כפולה עד 40% עודף.
- אי התחשבות בתאורה: מודלים שאומנו על תאורה אחידה נכשלים עם הבהרות וצללים.
- חוסר קוונטיזציה של המודל — FPS מתחת ל-5 במכשירים ללא GPU.







