אנו מיישמים זיהוי עצמים באפליקציות מובייל—לא רק איתור עצמים, אלא גם מעקב בין פריימים, הקרנת תיבות חוסמות על שכבת התצוגה המקדימה, טיפול בחפיפות, ושמירה על 30 FPS. זמן אמת במכשיר נייד הוא פשרה קשה: המודל חייב להפיק זיהוי תוך 20–30 אלפיות השנייה כדי למנוע נפילת פריימים, אך גם לא לחמם את המעבד או לרוקן את הסוללה. אנו מתחשבים בגרסת מערכת ההפעלה, ב-delegates הזמינים (GPU, NNAPI, Core ML), ובספי ביטחון. אנו פותרים זאת החל מבחירת ארכיטקטורה (YOLO, SSD, NanoDet) ועד אינטגרציה סופית עם מעקב, הקרנה ופרסום בחנות. להלן טכניקות ספציפיות שאנו מיישמים בפרויקטים.
כיצד לבחור מודל לזיהוי מובייל?
בחירת המודל תלויה ב-FPS המבוקש, בחומרה הנתמכת ובדרישות הדיוק. נבחן שלוש ארכיטקטורות פופולריות: MobileNet SSD, YOLOv8n ו-NanoDet. MobileNet SSD מאזן בין מהירות לדיוק, מותאם היטב ל-TFLite, ותומך בקוונטיזציה של int8. YOLOv8n נותן איכות טובה יותר (mAP 37+) עם ארכיטקטורה עמוקה יותר אך דורש GPU delegate לשימוש נוח. NanoDet קל משקל למכשירים חלשים ללא GPU, אך הדיוק מוגבל.
| מודל | מהירות (ms) במכשיר דגל | mAP על COCO | מקרה שימוש מומלץ |
|---|---|---|---|
| MobileNet SSD (TFLite) | 18–25 (320×320) | 23–27 | תמונות לא מקוונות, מגוון רחב של מכשירים |
| YOLOv8n (TFLite/Core ML) | 22–40 (קלט 320×320) | 37+ | וידאו בזמן אמת, דיוק גבוה |
| NanoDet | <10 (Snapdragon 665) | ~20 | מכשירים חלשים שבהם המהירות היא החשובה ביותר |
ה-מערך הנתונים COCO מראה ש-YOLOv8n מספק mAP גבוה ב-30% מ-MobileNet SSD בזמן השהיה דומה. YOLO נותר הסטנדרט לזמן אמת. NanoDet, לעומת זאת, מאבד דיוק אך מהיר פי 2 במכשירים חלשים.
מדוע מעקב הוא קריטי לזיהוי עצמים?
זיהוי בכל פריים הוא יקר. הגישה הנכונה: לזהות פעם בכל N פריימים (בדרך כלל כל 5–10), ובינתיים להשתמש במעקב באמצעות SORT או ByteTrack, או ב-VNDetectRectanglesRequest המובנה עם ObjectTrackerObservation ב-iOS. ML Kit Object Detection & Tracking תומך במעקב ישירות מהקופסה עם .enableMultipleObjects() ו-.enableClassification(). כל עצם במעקב מקבל trackingID יציב—זה מאפשר הצגת מידע על העצם ללא הבהובים בעת אובדן/הופעה מחדש.
NMS (Non-Maximum Suppression) הוא פרמטר מפתח. ברירת המחדל היא iouThreshold = 0.5. אם עצמים חופפים (לדוגמה, פריטים ארוזים על מסוע), יש להוריד את הסף ל-0.3–0.35. אחרת, הגלאי מאחד עצמים שכנים לאחד. ספים מומלצים:
| סף NMS (iouThreshold) | השפעה | תרחיש לדוגמה |
|---|---|---|
| 0.5 (ברירת מחדל) | טוב לעצמים שאינם חופפים | פריטים בודדים על שולחן |
| 0.3–0.35 | מפחית איחוד בחפיפה | תור של אנשים, אריזות |
| 0.7 | מאפשר מספר תיבות לכל עצם (נדיר) | פילוח חלקים מדויק |
דוגמה לכיוונון NMS בצפיפות עצמים גבוהה
בניסיון שלנו, היה לנו מקרה: אפליקציה שסופרת אנשים בתור באמצעות מצלמה סטטית (טאבלט על מעמד). מודל YOLOv8n, TFLite, GPU delegate על Android 11+. בעיה: בתור צפוף (>8 אנשים), הגלאי פספס אנשים במרכז—חפיפה >60%. פתרון: הורדנו את `nmsThreshold` ל-0.3, הוספנו `minDetectionConfidence = 0.4` (במקום 0.5). שיעור הפספוס השגוי ירד מ-31% ל-9%. בנוסף, אימנו מחדש את המודל על פריימים חופפים באמצעות מערך נתונים של Roboflow.כיצד להגדיר הקרנת תיבות חוסמות ל-iOS ו-Android?
השגיאה החזותית הנפוצה ביותר היא תיבה חוסמת שאינה מיושרת עם העצם בתצוגה המקדימה. סיבה: המודל מקבל תמונה בגודל שונה (לדוגמה, 320×320), בעוד שתצוגת המצלמה היא 1920×1080 עם AspectFill או AspectFit. יש לחשב מחדש את הקואורדינטות עם קנה מידה והזזות.
ב-iOS עם AVCaptureVideoPreviewLayer:
let converted = previewLayer.layerRectConverted(fromMetadataOutputRect: normalizedRect) let converted = previewLayer.layerRectConverted(fromMetadataOutputRect: normalizedRect) מחזיר VNDetectedObjectObservation בקואורדינטות מנורמלות (0..1, y מלמטה). לפני הקרנה לקואורדינטות UIKit, יש להפוך את ציר ה-Y: boundingBox. התיעוד של Apple עבור AVCaptureVideoPreviewLayer מסביר זאת.
ב-Android עם CameraX + CGRect(x: box.minX, y: 1 - box.maxY, width: box.width, height: box.height): תוצאות הזיהוי הן בקואורדינטות תמונת הקלט, והתצוגה המקדימה היא בקואורדינטות ImageAnalysis. השתמש ב-PreviewView של ML Kit או חשב טרנספורמציה ידנית באמצעות מטריצה.
כיצד להשיג 30 FPS?
מעבר לבחירת המודל, גורמים מרכזיים הם קוונטיזציה (int8 לעומת float), בחירת delegate (GPU, NNAPI, Core ML), ותדירות הזיהוי. ב-iOS עם Core ML, השתמש ב-MappingUtils. ב-Android, .computUnit = .gpuAndNeuralEngine עם GPUDelegate. למכשירים חלשים, השתמש ב-PrecisionLossAllowed. אנו בודקים על מכשירים אמיתיים, מודדים FPS וטמפרטורת מעבד. אנו מבטיחים 30 FPS יציב במכשירי דגל ו-15–20 FPS במכשירים בינוניים.
הניסיון וההבטחות שלנו
עם 5+ שנות ניסיון, יישמנו זיהוי עצמים ביותר מ-50 פרויקטים—מקמעונאות (ספירת פריטים על מדפים) ועד אבטחה (זיהוי אנשים ורכבים). המהנדסים שלנו מכירים את הנחיות סקירת ה-App Store (סעיפים 4.2, 5.1) ואת דרישות Google Play לאפליקציות מצלמה, מה שמקל על הפרסום. אנו גם מבטיחים תמיכה לאחר האינטגרציה: מענה על שאלות, תיקון באגים, וסיוע באימון מחדש של המודל.
מה כלול בעבודה
- בחירת מודל והתאמתו למכשיר שלך (iOS/Android)
- אינטגרציית מצלמה (CameraX, AVCaptureSession)
- הקרנה נכונה של תיבות חוסמות על התצוגה המקדימה
- הגדרת מעקב ו-NMS
- בדיקות על מכשירים אמיתיים ואופטימיזציה עד 30 FPS
- תיעוד והמלצות לפרסום בחנות
תהליך העבודה
- ניתוח: סקירת מקרי השימוש שלך ומכשירי היעד.
- עיצוב: בחירת ארכיטקטורת מודל, delegate ופרמטרי עיבוד לאחר.
- יישום: אינטגרציית המודל עם המצלמה, הגדרת הקרנה ומעקב.
- בדיקות: מדידת FPS, דיוק וצריכת חשמל על 5+ מכשירים.
- פריסה: הכנת build, תיעוד וסיוע בהגשה ל-App Store / Google Play.
לוחות זמנים וכיצד להתחיל
אינטגרציה של מודל מוכן עם הקרנה וכיוונון אורכת 1–2 שבועות. אימון מחדש על מחלקות מותאמות אישית מוסיף 1–2 שבועות. נבחן את הפרויקט שלך—צור קשר. קבל ייעוץ על זיהוי עצמים באפליקציה שלך. פנה אלינו כדי לדון בתרחיש שלך.







