Система виявлення диму та вогню по відео на основі AI

Система детекції диму та вогню по відео на основі AI

Напрямки AI-розробки

Часті запитання

Останні роботи

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1441
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1302
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    998
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1267
  • image_logo-advance_0.webp
    Розробка логотипу компанії B2B Advance
    714
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    1006

Система детекції диму та вогню по відео на основі AI

Традиційні димові датчики реагують на задимлення в радіусі 5–7 метрів. На відкритих територіях — складах без стельових сенсорів, лісових масивах, промислових майданчиках — вони некорисні. Відеоаналітика виявляє дим і полум'я на відстані до 300+ метрів, часто раніше, ніж концентрація досягає порогу спрацьовування іонізаційного датчика. Хибні спрацьовування — головний біль: без temporal-фільтрації FAR досягає 15–30%, що дискредитує систему. Ми розробляємо такі системи понад 5 років і вирішили цю проблему.

Чому temporal-аналіз критично важливий?

Дим — аморфний об'єкт без чітких меж, змінює форму кожні 2–3 кадри. Артефакти на кшталт пари, туману, пилу або відблисків від фар схожі на дим/вогонь для покадрового класифікатора. Temporal-аналіз обробляє послідовність кадрів і відрізняє дим від туману за характером руху. Це знижує FAR у 10–15 разів порівняно з покадровим детектором.

Як влаштована архітектура з temporal-фільтрацією?

Використовуємо YOLOv8m/l з донавчанням на змішаному датасеті (загальнодоступні + наші власні з об'єкта). Temporal-вікно 8 кадрів + optical flow перевірка для диму. Код інференсу:

import torch import torch.nn as nn from ultralytics import YOLO import numpy as np from collections import deque class SmokeFireDetector: def __init__(self, model_path: str, temporal_window: int = 8): self.detector = YOLO(model_path) # донавчений на smoke/fire self.temporal_window = temporal_window # Буфер кадрів для temporal аналізу self.frame_buffer: deque = deque(maxlen=temporal_window) self.detection_history: dict = {} # track_id -> history # Мінімальна кількість кадрів з детекцією для тривоги self.confirm_frames = 5 # з 8 кадрів вікна def _optical_flow_check(self, prev_frame, curr_frame, bbox: list) -> float: """Дим рухається хаотично — перевіряємо нерегулярність потоку""" x1, y1, x2, y2 = bbox prev_roi = cv2.cvtColor(prev_frame[y1:y2, x1:x2], cv2.COLOR_BGR2GRAY) curr_roi = cv2.cvtColor(curr_frame[y1:y2, x1:x2], cv2.COLOR_BGR2GRAY) flow = cv2.calcOpticalFlowFarneback( prev_roi, curr_roi, None, pyr_scale=0.5, levels=3, winsize=15, iterations=3, poly_n=5, poly_sigma=1.1, flags=0 ) magnitude = np.sqrt(flow[..., 0]**2 + flow[..., 1]**2) # Дим: нерівномірний потік, висока std return float(magnitude.std()) def detect(self, frame: np.ndarray) -> list[dict]: self.frame_buffer.append(frame.copy()) results = self.detector(frame, conf=0.35, iou=0.4) confirmed_events = [] for box in results[0].boxes: cls_id = int(box.cls) cls_name = self.detector.model.names[cls_id] if cls_name not in ['smoke', 'fire']: continue bbox = list(map(int, box.xyxy[0])) conf = float(box.conf) # Temporal підтвердження det_key = f"{cls_name}_{bbox[0]//50}_{bbox[1]//50}" # grid cell if det_key not in self.detection_history: self.detection_history[det_key] = deque(maxlen=self.temporal_window) self.detection_history[det_key].append(conf) confirmed_count = sum(1 for c in self.detection_history[det_key] if c > 0.3) if confirmed_count >= self.confirm_frames: # Додаткова перевірка optical flow для диму flow_score = 0.0 if cls_name == 'smoke' and len(self.frame_buffer) >= 2: flow_score = self._optical_flow_check( self.frame_buffer[-2], frame, bbox ) confirmed_events.append({ 'class': cls_name, 'confidence': conf, 'temporal_score': confirmed_count / self.temporal_window, 'flow_irregularity': flow_score, 'bbox': bbox, 'alert': True }) return confirmed_events 

Метод optical flow описано в документації OpenCV.

Метрики та пороги

Показник Цільове значення Типовий baseline (без temporal)
Recall (реальні загоряння) > 95% 87–91%
FAR на відкритих майданчиках < 1 за зміну 8–15 за зміну
Час до тривоги < 10 сек < 5 сек (вище FAR)
Дистанція виявлення (дим) 50–300м

Наші тести показують: temporal-фільтрація з вікном 8 кадрів підвищує Recall на 8–10% і знижує FAR у 10–15 разів порівняно з покадровим детектором.

Model card (приклад змісту)Архітектура: YOLOv8m, temporal window 8, підтвердження 5/8 кадрів. Датасет: FireNet, MIVIA Fire, VisiFire, D-Fire + власні 1200 зображень. Конфігурація аугментації: HSV, геометрія. Метрики на валідації: Recall 96%, FAR 0.8/зміну. Обмеження: при сильному тумані можливе зниження дистанції.

Як донавчання на об'єкті покращує детекцію?

Публічні датасети (FireNet, MIVIA Fire, VisiFire, D-Fire) містять 11k+ зображень, але в продакшені завжди потрібне донавчання на локальних даних. Типова процедура: зібрати 500–800 зображень з об'єкта (200 smoke/fire + 300–600 hard negatives — пара, туман, захід сонця), донавчити YOLO v8m з learning_rate=0.001, 50 епох, аугментація HSV + геометрія. Це дає зниження FAR у 3–5 разів на конкретному об'єкті.

Кейс: нафтохімічний завод (наш клієнт)

Об'єкт — відкритий майданчик 4 га, 18 PTZ-камер з ІЧ. Задача: раннє виявлення загоряння резервуарів.

  • Базова модель: YOLOv8l, донавчена на 1200 зображеннях об'єкта
  • Temporal window: 10 кадрів @ 10fps = 1 секунда
  • Confirm threshold: 6 з 10 кадрів

Результати тестування (15 інсценованих загорянь):

  • Recall: 100% (всі 15 виявлені)
  • Середній час виявлення: 4.2 секунди від початку горіння
  • FAR за 2 тижні роботи: 1 хибна тривога (захід сонця + паровий котел)

До впровадження нашої системи на об'єкті було 10–15 хибних викликів пожежної охорони на місяць, кожен обходився підприємству в середньому $5 000–10 000. Після впровадження FAR знизився до 1 за зміну, що зекономило замовнику понад $300 000 на рік. Інфраструктура: сервер з RTX 3090, 18 потоків @ 10fps, latency 180ms. Інтеграція з пожежною панеллю Notifier через Modbus TCP.

Інтеграція з пожежними системами

  • Протоколи: Modbus TCP/RTU, BACnet, OPC-UA — для прямої інтеграції з пожежними панелями
  • VMS: запис відеодоказів за 60 сек до і після події
  • Геолокація події: прив'язка bbox до карти об'єкта через калібрування камери

Отримайте консультацію щодо інтеграції з вашим обладнанням.

Що входить в розробку під ключ?

Ми надаємо:

  • Навчену модель з model card (архітектура, метрики на валідації, обмеження)
  • Вихідний код інференсу (Python, документація)
  • REST API для інтеграції з вашими системами
  • Готовий модуль для VMS (Milestone, Genetec, або будь-яка з RTSP)
  • Інструкцію для операторів та навчання персоналу
  • Гарантію 6 місяців на адаптацію моделі до змін сцени (сезонні коливання, нові джерела диму)

Терміни розробки

Масштаб Термін
1–6 камер, закрите приміщення 3–5 тижнів
10–30 камер, відкритий майданчик 6–10 тижнів
30+ камер, enterprise 12–18 тижнів

Вартість розраховується індивідуально за обсягом даних та складністю інтеграції. Щоб оцінити ваш проект, напишіть нам — ми проаналізуємо ваші камери та умови за 1 робочий день.