זיהוי סצנות בינה מלאכותית לאוטומציה של בית חכם באפליקציה ניידת
תרחיש טיפוסי: אתה מפעיל בית חכם עם מצלמה, והאוטומציה מופעלת רק כשמשתמש נכנס לחדר, אך אינה מגיבה לסצנות עדינות יותר—כמו עמעום אורות במהלך סרט. הבעיה היא ששירותי ML בענן מוסיפים השהיה של 200–500ms ומסכנים את הפרטיות. סיווג מקומי במכשיר הוא הדרך היחידה לתרחישים בזמן אמת. זה מפחית עלויות תפעול למחשוב ענן, במיוחד כשעובדים עם מספר מצלמות. יישמנו למעלה מ-10 אינטגרציות כאלה ואנחנו מכירים את כל המלכודות: מהפעלות שווא בתאורה חלשה ועד התנגשויות עם הנחיות בדיקת App Store. הניסיון מראה שארכיטקטורה נכונה חוסכת משאבים וזמן.
למה עיבוד מקומי הוא קריטי לבית חכם?
שליחת פריימים מהמצלמה לשרת לצורך סיווג היא רעיון רע לאוטומציה ביתית. השהיה אינה מקובלת, והמשתמש מאבד שליטה על הנתונים. הכל חייב לעבוד מקומית. לדוגמה, ב-iOS אנו משתמשים ב-Apple Vision ו-CoreML, שמבצעים סיווג על שבב A14+ ב-<30ms.
iOS: CoreML + Vision Framework
סיווג סצנות של Apple Vision—מודל מובנה VNClassifyImageRequest. עובד במצב לא מקוון, מחזיר VNClassificationObservation עם ציון ביטחון. לבית חכם, כ-20 קטגוריות מתוך 3000+ מובנות מספיקות. התיעוד של Apple (Apple Vision Scene Classification) ממליץ על גישה זו.
import Vision
import CoreML
class SceneClassifier {
private lazy var request: VNClassifyImageRequest = {
let r = VNClassifyImageRequest { [weak self] request, error in
self?.handleResults(request.results as? [VNClassificationObservation])
}
return r
}()
func classify(pixelBuffer: CVPixelBuffer) {
let handler = VNImageRequestHandler(cvPixelBuffer: pixelBuffer, options: [:])
try? handler.perform([request])
}
private func handleResults(_ results: [VNClassificationObservation]?) {
guard let top = results?.filter({ $0.confidence > 0.6 }).first else { return }
// top.identifier: "bedroom", "kitchen", "living_room", "bathroom"
SmartHomeAutomation.shared.triggerScene(top.identifier)
}
}סנן לפי import Vision import CoreML class SceneClassifier { private lazy var request: VNClassifyImageRequest = { let r = VNClassifyImageRequest { [weak self] request, error in self?.handleResults(request.results as? [VNClassificationObservation]) } return r }() func classify(pixelBuffer: CVPixelBuffer) { let handler = VNImageRequestHandler(cvPixelBuffer: pixelBuffer, options: [:]) try? handler.perform([request]) } private func handleResults(_ results: [VNClassificationObservation]?) { guard let top = results?.filter({ $0.confidence > 0.6 }).first else { return } // top.identifier: "bedroom", "kitchen", "living_room", "bathroom" SmartHomeAutomation.shared.triggerScene(top.identifier) } } ולפי רשימה של מזהים רלוונטיים. אל תעבד פריימים בתדירות גבוהה יותר מכל 2–3 שניות—זה חוסך סוללה ומעבד. לתרחישים מותאמים אישית, אנו משתמשים ב-Create ML עם MobileNetV3, מייצאים ל-confidence > 0.6, גודל ~4 MB.
Android: זיהוי סצנות ML Kit + TFLite
ML Kit פילוח נושא וזיהוי סצנות עובדים במצב לא מקוון במכשיר:
val image = InputImage.fromMediaImage(mediaImage, rotation)
val labeler = ImageLabeling.getClient(
ImageLabelerOptions.Builder()
.setConfidenceThreshold(0.65f)
.build()
)
labeler.process(image)
.addOnSuccessListener { labels ->
val sceneLabel = labels.firstOrNull { it.text in SMART_HOME_SCENES }
sceneLabel?.let { automationEngine.trigger(it.text, it.confidence) }
}.mlpackage הוא קבוצה של "חדר שינה", "מטבח", "סלון", "אמבטיה", "משרד". למודלים מותאמים אישית—TFLite Interpreter עם קובץ val image = InputImage.fromMediaImage(mediaImage, rotation) val labeler = ImageLabeling.getClient( ImageLabelerOptions.Builder() .setConfidenceThreshold(0.65f) .build() ) labeler.process(image) .addOnSuccessListener { labels -> val sceneLabel = labels.firstOrNull { it.text in SMART_HOME_SCENES } sceneLabel?.let { automationEngine.trigger(it.text, it.confidence) } } , מותאם באמצעות TensorFlow Model Maker. מודל מותאם אישית על 500–1000 תמונות לכל קטגוריה, כוונון עדין של MobileNetV2, ייצוא ל-INT8 quantized—גודל מודל ~2 MB, זמן חיזוי <50ms על Snapdragon 778G.
איך ליישם Debounce לשינוי סצנה?
זיהוי סצנות הוא רק טריגר. לאחר מכן, יש צורך בלוגיקת אוטומציה ללא הפעלות שווא. דפוס: שינוי סצנה נספר רק אם קטגוריה אחת שולטת במשך 3 שניות עם ביטחון > 0.7.
class SceneDebouncer(private val windowMs: Long = 3000) {
private var currentScene: String? = null
private var firstSeenAt: Long = 0
fun process(scene: String, confidence: Float): String? {
if (confidence < 0.7f) return null
val now = System.currentTimeMillis()
if (scene != currentScene) {
currentScene = scene
firstSeenAt = now
return null
}
return if (now - firstSeenAt >= windowMs) scene else null
}
} איך לשלוט ב-IoT דרך MQTT או Matter?
לאחר אישור הסצנה, אנו מפרסמים פקודה ל-broker של MQTT או שולחים דרך בקר Matter:
// MQTT
mqttClient.publish(
"home/automation/scene",
MqttMessage(
"""{\"scene\":\"bedroom\",\"timestamp\":${System.currentTimeMillis()}}""".toByteArray()
),
qos = 1,
retained = false
)
// Matter SDK (через Google Home Mobile SDK)
val deviceController = ChipDeviceController()
deviceController.sendCommand(
nodeId = lightbulbNodeId,
endpointId = 1,
clusterId = OnOffCluster.CLUSTER_ID,
commandId = OnOffCluster.Commands.On.ID,
tlvData = byteArrayOf()
) לוח זמנים והקשר
אוטומציה מבוססת סצנות צריכה להתחשב בשעה ביום: "חדר שינה" ב-23:00 → עמעום אורות, "חדר שינה" ב-7:00 → פתיחת וילונות. הקשר מתווסף באמצעות מסנן SMART_HOME_SCENES בכללים ברמת האפליקציה.
השוואת CoreML לעומת TFLite
| פרמטר | CoreML (iOS) | TFLite (Android) |
|---|---|---|
| מודל מובנה | VNClassifyImageRequest (3000+ קטגוריות) | זיהוי סצנות ML Kit (5+ קטגוריות) |
| כוונון עדין | Create ML (MobileNetV3) | TensorFlow Model Maker (MobileNetV2) |
| גודל מודל מותאם אישית | ~4 MB | ~2 MB (INT8 quantized) |
| זמן חיזוי | <30 ms (Apple A14+) | <50 ms (Snapdragon 778G) |
| פרטיות | מקומי לחלוטין | מקומי לחלוטין |
CoreML מהיר ב-40% במכשירים דומים, אך TFLite מציע גמישות רבה יותר לפיתוח חוצה פלטפורמות.
מדריך שלב-אחר-שלב לשילוב זיהוי סצנות
- הגדר סצנות יעד (לדוגמה, "חדר שינה", "מטבח") ומכשירי IoT.
- בחר פלטפורמה: CoreML ל-iOS, TFLite ל-Android, או Flutter/RN חוצה פלטפורמות.
- שלב את מודל ה-ML והגדר את המסווג המקומי.
- יישם לוגיקת debounce כדי למנוע הפעלות שווא.
- חבר MQTT או Matter לשליחת פקודות.
- בדוק בתנאי תאורה שונים וזוויות מצלמה שונות.
מידע נוסף על מודלים מותאמים אישית
לכוונון עדין של המודל, השתמש ב-Transfer Learning: הקפא את השכבות הראשונות של MobileNetV2/V3, הוסף ראש לקטגוריות שלך. כל סצנה דורשת 200–500 פריימים מתויגים. אופטימיזציה באמצעות Quantization Aware Training מפחיתה את גודל המודל בחצי ללא אובדן דיוק.
למה פרטיות חשובה בשימוש במצלמת בית חכם?
אפליקציה עם גישה מתמדת למצלמה היא דגל אדום למשתמשים ולמודרי App Store/Google Play. כללים:
- סיווג רק כשהמשתמש הפעיל במפורש מצב "זיהוי סצנות".
- אף פריים לא נשמר או יוצא מהמכשיר.
- ב-iOS—
.tfliteעם הסבר מפורש על עיבוד מקומי. - מניפסט פרטיות ב-iOS 17+ עם הצהרה על
class SceneDebouncer(private val windowMs: Long = 3000) { private var currentScene: String? = null private var firstSeenAt: Long = 0 fun process(scene: String, confidence: Float): String? { if (confidence < 0.7f) return null val now = System.currentTimeMillis() if (scene != currentScene) { currentScene = scene firstSeenAt = now return null } return if (now - firstSeenAt >= windowMs) scene else null } }.
דחיות מ-App Store בגין ספאם 4.3 או הפרות פרטיות הן סיכון אמיתי. התיאור ב-App Privacy Report חייב להיות כן.
מה כלול בפיתוח
- סקירת דרישות: מכשירי יעד, פרוטוקולי IoT (MQTT, Matter, Zigbee דרך hub, HomeKit), קבוצת סצנות טריגר.
- פיתוח מודל סיווג: מובנה או מותאם אישית עם כוונון עדין.
- אינטגרציה עם MQTT broker או Matter SDK.
- יישום לוגיקת debounce ואוטומציה.
- בדיקות בתנאים אמיתיים—תאורה שונה, זוויות מצלמה, סצנות מעורבות.
- מסירת תיעוד וקוד מקור.
- תמיכה לאחר השקה.
אנו מבטיחים אמינות ויציבות של הפתרון, בהתבסס על שנים של ניסיון. העלות מחושבת באופן אישי, אך אנו מבטיחים תקציב שקוף ללא עמלות נסתרות.
שלבים ולוחות זמנים
| שלב | לוח זמנים |
|---|---|
| סקירה והסכמה על דרישות | 3–5 ימים |
| פיתוח מודל (מובנה) | 1–2 שבועות |
| אינטגרציית פרוטוקול IoT | 1–3 שבועות |
| לוגיקת אוטומציה ובדיקות | 1–2 שבועות |
| מחזור מלא עם מודל ML מותאם אישית | 2–3 חודשים |
זיהוי בסיסי עם 5–10 סצנות ופקודות MQTT: 2–4 שבועות. מודל ML מותאם אישית עם כוונון עדין + אינטגרציה מלאה של Matter/HomeKit: 2–3 חודשים. העלות מחושבת באופן אישי, בהתאם למספר פרוטוקולי ה-IoT הנתמכים ומורכבות לוגיקת האוטומציה.
הזמן פיתוח סוהר—נעריך את הפרויקט שלך תוך יום אחד ונציע את הפתרון האופטימלי. צור קשר כדי לדון בפרטים.







