ניתוח יציבה מבוסס בינה מלאכותית באמצעות מצלמה
משתמשים רבים נוטים להתכופף מול מסכים, ומצלמת החזית של הסמארטפון יכולה לזהות בעיות בזמן אמת. מודלים של הערכת תנוחה מפיקים 17–33 נקודות שלד מרכזיות, והגיאומטריה—זוויות מפרקים והזזת מרכז הכובד—נותנת תמונה מדויקת של היציבה. מעל 60% מעובדי המשרד סובלים מיציבת ראש קדמית עם זווית >20°, הניתנת לזיהוי ב-30 שניות של סריקה. אנו משתמשים בטכנולוגיות מוכחות: Apple Vision ל-iOS בלבד או MediaPipe לפרויקטים חוצי-פלטפורמות. הניסיון שלנו מאפשר לנו לבחור את המודל האופטימלי לצרכי האפליקציה שלך. אוטומציה של הניתוח חוסכת למשתמשים עד 90% מהזמן בהשוואה להערכה ידנית.
Apple Vision לעומת MediaPipe: איך לבחור?
שתי דרכים עיקריות ב-iOS—מסגרת Apple Vision עם VNDetectHumanBodyPoseRequest, ו-MediaPipe Pose (BlazePose). באנדרואיד—ML Kit Pose Detection או MediaPipe. המפרטים מסוכמים להלן:
| פרמטר | Apple Vision | MediaPipe |
|---|---|---|
| פלטפורמה | iOS בלבד | iOS, אנדרואיד, Web |
| נקודות מפתח | 19 | 33 (כולל פנים וידיים) |
| דיוק כתפיים | בינוני | גבוה |
| ביצועים | קל (<50ms לפריים) | כבד (Lite/Full/Heavy, 30–80ms) |
| אינטגרציה | טבעית | דרך SDK |
Apple Vision (מסגרת Vision) עדיף לפרויקטים של iOS בלבד—הוא טבעי וחוסך בסוללה. MediaPipe (MediaPipe Pose) מדויק יותר (במיוחד בכתפיים ובירכיים) אך דורש יותר משאבים. אנו בדרך כלל ממליצים על Vision לתכונות מינימליות ועל MediaPipe לניתוח מעמיק עם המלצות מתקנות.
דוגמת Swift עבור Apple Vision
import Vision
import AVFoundation
class PostureAnalyzer: NSObject {
private var poseRequest = VNDetectHumanBodyPoseRequest()
func analyze(sampleBuffer: CMSampleBuffer) {
let handler = VNImageRequestHandler(cmSampleBuffer: sampleBuffer, orientation: .up)
do {
try handler.perform([poseRequest])
guard let observation = poseRequest.results?.first else { return }
processBodyPose(observation)
} catch {
print("Pose detection failed: \(error)")
}
}
private func processBodyPose(_ observation: VNHumanBodyPoseObservation) {
guard let leftShoulder = try? observation.recognizedPoint(.leftShoulder),
let rightShoulder = try? observation.recognizedPoint(.rightShoulder),
let nose = try? observation.recognizedPoint(.nose),
leftShoulder.confidence > 0.6,
rightShoulder.confidence > 0.6 else { return }
// Угол наклона плечевой линии
let shoulderDelta = leftShoulder.location.y - rightShoulder.location.y
let shoulderWidth = abs(leftShoulder.location.x - rightShoulder.location.x)
let shoulderTiltAngle = atan2(shoulderDelta, shoulderWidth) * 180 / .pi
// Смещение головы от центра плеч
let shoulderMidX = (leftShoulder.location.x + rightShoulder.location.x) / 2
let headOffset = (nose.location.x - shoulderMidX) / shoulderWidth
postureObserver?(PostureMetrics(
shoulderTilt: shoulderTiltAngle,
headOffset: headOffset
))
}
}import Vision import AVFoundation class PostureAnalyzer: NSObject { private var poseRequest = VNDetectHumanBodyPoseRequest() func analyze(sampleBuffer: CMSampleBuffer) { let handler = VNImageRequestHandler(cmSampleBuffer: sampleBuffer, orientation: .up) do { try handler.perform([poseRequest]) guard let observation = poseRequest.results?.first else { return } processBodyPose(observation) } catch { print("Pose detection failed: \(error)") } } private func processBodyPose(_ observation: VNHumanBodyPoseObservation) { guard let leftShoulder = try? observation.recognizedPoint(.leftShoulder), let rightShoulder = try? observation.recognizedPoint(.rightShoulder), let nose = try? observation.recognizedPoint(.nose), leftShoulder.confidence > 0.6, rightShoulder.confidence > 0.6 else { return } // Угол наклона плечевой линии let shoulderDelta = leftShoulder.location.y - rightShoulder.location.y let shoulderWidth = abs(leftShoulder.location.x - rightShoulder.location.x) let shoulderTiltAngle = atan2(shoulderDelta, shoulderWidth) * 180 / .pi // Смещение головы от центра плеч let shoulderMidX = (leftShoulder.location.x + rightShoulder.location.x) / 2 let headOffset = (nose.location.x - shoulderMidX) / shoulderWidth postureObserver?(PostureMetrics( shoulderTilt: shoulderTiltAngle, headOffset: headOffset )) } } הוא הסף שמתחתיו נקודות מפתח נחשבות לא אמינות. הקואורדינטות ב-Vision הפוכות בציר Y; יש להפוך בעת רינדור.
אילו מדדי יציבה אנו מודדים?
יציבה טובה היא גיאומטריה. ניסחנו זאת כך:
| מדד | תקין | חישוב |
|---|---|---|
| הטיית כתפיים | <5° | confidence > 0.6 |
| יציבת ראש קדמית | <15° | זווית צוואר–אוזן–כתף (מקור: מחקרים ארגונומיים) |
| הטיית גו | ±3° | קו אנכי דרך כתפיים וירכיים |
| סימטריות כתפיים (Y) | <3% מהגובה | הפרש בקואורדינטות Y של הכתפיים |
יציבת ראש קדמית היא הבעיה הנפוצה ביותר. אנו מודדים אותה באמצעות הזווית בין הווקטור אוזן→כתף לאנך. ב-Vision: וקטור atan2(Δy плеч, Δx плеч), זווית לציר Y של המסך. באמצעות MediaPipe (33 נקודות), אנו מוסיפים: זווית מרפק, מיקום אגן, הטיית ראש צידית, עקמומיות עמוד השדרה. מדדים אלה שימושיים לאפליקציות ספורט ושיקום.
איך להבטיח ביצועים בזמן אמת?
הערכת תנוחה על כל פריים של AVCaptureSession (30 fps) יקרה מדי למכשירים ישנים. אנו משתמשים בדילול: הרצת ניתוח לא בכל פריים אלא כל 100ms (10 fps). leftEar → leftShoulder רץ על תור רקע—VNDetectHumanBodyPoseRequest הוא סינכרוני וחוסם את התור.
private let analysisQueue = DispatchQueue(label: "posture.analysis", qos: .userInitiated)
private var lastAnalysisTime: CFTimeInterval = 0
func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {
let now = CACurrentMediaTime()
guard now - lastAnalysisTime > 0.1 else { return } // 10 fps
lastAnalysisTime = now
analysisQueue.async {
self.analyze(sampleBuffer: sampleBuffer)
}
}בנוסף, סינון לפי אמון נקודות מפתח (VNImageRequestHandler.perform()) כדי להימנע מבזבוז משאבים על פריימים מטושטשים. במכשירים מתחת ל-iPhone 8, הפחתה ל-5 fps. בתאורה חלשה, הדיוק יורד ב-10–12%, אך ספי האמון משליכים פריימים גרועים. קבל ייעוץ מומחה לכיוונון ביצועים למכשיר היעד שלך.
משוב משתמש
שני מצבים:
- שכבת-על בזמן אמת—קווים (CAShapeLayer) מעל תצוגת המצלמה מראים סטיות. לדוגמה, קווים אדומים על הכתפיים אם הן לא מאוזנות.
- ניתוח סשן—המשתמש מחזיק את הטלפון למשך 30 שניות ומקבל דוח סופי.
משוב הפטי על סטייה חזקה, גימיפיקציה (רצפים של "יציבה טובה"). ההמלצות מקשרות מדדים לתרגילים: אם ראש קדמי >20°, הצע מתיחת חזה וחיזוק צוואר עם וידאו.
התהליך שלנו
- ניתוח דרישות ובחירת טכנולוגיה (Vision/MediaPipe, iOS/אנדרואיד/Flutter).
- אינטגרציית מודל ויישום מדדי יציבה.
- ממשק משתמש: מצלמה + שכבת-על + מסך דוח.
- אופטימיזציית ביצועים על מכשירים אמיתיים (בדיקות A/B על 5+ דגמים).
- בדיקת דיוק (A/B על תנוחות שונות, 10+ תרחישים).
- פרסום ב-App Store/Google Play עם חתימת קוד והגדרת פרופיל provisioning.
תוצרים: מודול קוד מקור עם הערות (Swift/Kotlin/Flutter), תיעוד ארכיטקטורה, מדריך אינטגרציית API, סיוע בפרסום (App Store Connect, TestFlight, Google Play Console), אחריות ל-30 יום ותמיכה חינם. עלות הפיתוח נקבעת באופן אישי לאחר ניתוח דרישות. צור קשר כדי להזמין מודול ניתוח יציבה מבוסס AI במפתח.
למה לבחור בנו?
לצוות שלנו יש 5+ שנות ניסיון בפיתוח AI למובייל. סיפקנו 20+ פרויקטים עם הערכת תנוחה, כולל אפליקציות ספורט ושיקום. אנו מבטיחים איכות קוד גבוהה, דיוק ניתוח ועמידה בלוחות זמנים. תקשורת שקופה לאורך כל הפרויקט. צור קשר להערכת פרויקט וייעוץ עוד היום.







