Реализация AI-распознавания сцен для автоматизации умного дома в мобильном приложении
Типичная ситуация: вы запускаете умный дом с камерой, и автоматизация срабатывает только когда пользователь заходит в комнату, но не реагирует на более тонкие сцены — например, приглушение света при просмотре кино. Ошибка в том, что облачные ML-сервисы добавляют латентность 200–500ms и рискуют приватностью. Локальная классификация на устройстве — единственный путь для сценариев реального времени. Это снижает операционные затраты на облачные вычисления, особенно при работе с несколькими камерами. Мы реализовали более 10 таких интеграций и знаем все грабли: от ложных срабатываний при плохом освещении до конфликтов с App Store Review Guidelines. Опыт показывает, что правильная архитектура экономит ресурсы и время.
Почему локальная обработка критична для умного дома?
Отправлять кадры с камеры на сервер для классификации — плохая идея для домашней автоматизации. Латентность неприемлема, плюс пользователь теряет контроль над данными. Всё должно работать локально. Например, на iOS мы используем Apple Vision и CoreML, которые выполняют классификацию на чипе A14+ за <30ms.
iOS: CoreML + Vision framework
Apple Vision Scene Classification — встроенная модель VNClassifyImageRequest. Работает офлайн, выдаёт VNClassificationObservation с confidence score. Для умного дома достаточно ~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)
}
}
Фильтруем по confidence > 0.6 и по списку релевантных идентификаторов. Не трогать кадры чаще чем раз в 2–3 секунды — так экономим батарею и процессор. Для кастомных сценариев используем Create ML с MobileNetV3, экспорт в .mlpackage, размер ~4 МБ.
Android: ML Kit Scene Detection + TFLite
ML Kit Subject Segmentation и Scene Detection работают офлайн на устройстве:
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) }
}
SMART_HOME_SCENES — множество из "bedroom", "kitchen", "living room", "bathroom", "office". Для кастомных моделей — TFLite Interpreter с .tflite файлом, оптимизированным через TensorFlow Model Maker. Персонализированная модель на 500–1000 фото на класс, Fine-tuning MobileNetV2, Export в INT8 quantized — размер модели ~2 МБ, inference <50ms на Snapdragon 778G.
Как реализовать debounce для смены сцены?
Распознавание сцены — это только триггер. Дальше нужна логика автоматизации без ложных срабатываний. Паттерн: изменение сцены засчитывается только если одна категория доминирует 3 секунды подряд с confidence > 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?
После подтверждения сцены публикуем команду в MQTT-брокер или отправляем через Matter controller:
// 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()
)
Расписание и контекст
Автоматизация по сцене должна учитывать время суток: "bedroom" в 23:00 → приглушить свет, "bedroom" в 7:00 → разбудить шторы. Контекст добавляется через TimeOfDay фильтр в правилах на уровне приложения.
Сравнение CoreML vs TFLite
| Параметр | CoreML (iOS) | TFLite (Android) |
|---|---|---|
| Встроенная модель | VNClassifyImageRequest (3000+ классов) | ML Kit Scene Detection (5+ классов) |
| Дообучение | Create ML (MobileNetV3) | TensorFlow Model Maker (MobileNetV2) |
| Размер кастомной модели | ~4 MB | ~2 MB (INT8 quantized) |
| Inference time | <30 ms (Apple A14+) | <50 ms (Snapdragon 778G) |
| Приватность | Полностью локально | Полностью локально |
CoreML на 40% быстрее на сопоставимых устройствах, но TFLite даёт большую гибкость при кросс-платформенной разработке.
Пошаговая инструкция по интеграции распознавания сцен
- Определите целевые сцены (например, "bedroom", "kitchen") и IoT-устройства.
- Выберите платформу: CoreML для iOS, TFLite для Android или общий Flutter/RN.
- Интегрируйте ML-модель и настройте локальный классификатор.
- Реализуйте debounce-логику для избежания ложных срабатываний.
- Подключите MQTT или Matter для отправки команд.
- Протестируйте при разных условиях освещения и углах камеры.
Подробнее о кастомных моделях
Для дообучения модели используйте Transfer Learning: заморозьте первые слои MobileNetV2/V3, добавьте голову под свои классы. На каждую сцену нужно 200–500 размеченных кадров. Оптимизация через Quantization Aware Training уменьшает модель в 2 раза без потери точности.
Почему приватность важна при использовании камеры умного дома?
Приложение с постоянным доступом к камере — красный флаг для пользователей и модераторов App Store/Google Play. Правила:
- Классификация только когда пользователь явно включил режим «Scene Detection»
- Никакие кадры не сохраняются и не покидают устройство
- На iOS —
NSCameraUsageDescriptionс явным объяснением локальной обработки - Privacy manifest в iOS 17+ с декларацией
NSPrivacyAccessedAPICategoryCamera
App Store reject по 4.3 Spam или privacy violations — реальный риск. Описание в App Privacy Report должно быть честным.
Что входит в разработку
- Аудит требований: целевые устройства, IoT-протоколы (MQTT, Matter, Zigbee через хаб, HomeKit), набор триггерных сцен.
- Разработка модели классификации: встроенная или кастомная с дообучением.
- Интеграция с MQTT-брокером или 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-протоколов и сложности логики автоматизации.
Закажите разработку под ключ — мы оценим ваш проект за 1 день и предложим оптимальное решение. Свяжитесь с нами, чтобы обсудить детали.







