Система детекції диму та вогню по відео на основі 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 робочий день.
Як distribution shift вбиває метрики CV-моделі в промисловості
На виробництві ставлять камеру, контролюють якість продукції. Модель навчена на 10 000 розмічених зображень — точність на тесті mAP 0.84. Запускають у продакшен — і в перший же тиждень пропускають 30% дефектів. Освітлення на лінії змінюється по змінах, distribution shift обнуляє метрики. Це класична історія з Computer Vision у промисловості, де розпізнавання образів дає збій без правильної обробки дрейфу.
Наші інженери з досвідом 60+ проектів з комп'ютерного зору знають, як виключити такі сценарії. Гарантуємо стабільну роботу моделі в реальних умовах.
Які архітектури детекції об'єктів обрати: YOLO, RT‑DETR чи інші?
YOLO — стандарт для real‑time детекції. YOLOv8 та YOLOv11 від Ultralytics — найбільш використовувані версії у виробництві: простий API, активна спільнота, вбудована валідація та експорт в ONNX/TensorRT. Для задач з високими вимогами до точності та коли latency менш критична — RT‑DETR, transformer‑based архітектура без NMS, дає кращий mAP на COCO при порівнянній швидкості з YOLOv8l.
| Архітектура |
mAP на COCO (val2017) |
FPS (A10G, FP16) |
Складність деплою |
| YOLOv8n |
37.3 |
700+ |
Низька (ONNX/TensorRT) |
| YOLOv8m |
50.2 |
250 |
Низька |
| RT‑DETR-L |
53.0 |
140 |
Середня (вимагає PyTorch) |
| Mask R‑CNN |
38.2 (bbox) |
30 |
Висока |
Типова помилка при навчанні детектора: датасет 8000 зображень, 3 класи, fine‑tune YOLOv8m — F1 0.73 на валідації. Дивимося confusion matrix — один клас майже ніколи не детектується. Причина: дисбаланс 1:23. Рішення: oversampling рідкісного класу, focal loss для objectness, аугментації (Mosaic, MixUp вимкнути для рідкісного класу — вони його «розмивають»). Transfer learning обов'язковий: передтреновані на COCO ваги скорочують потребу в даних у 10 разів. Fine‑tune на 500–2000 доменних зображеннях дає робочу модель за 1–2 дні на одній GPU.
Для edge deployment: експорт в ONNX → TensorRT engine. YOLOv8n в TensorRT FP16 на Jetson AGX Orin дає 150+ FPS при P99 latency < 8 ms — це в 3 рази швидше, ніж ONNX Runtime без TensorRT. На сервері A10G: 700+ FPS для YOLOv8n в TensorRT INT8.
Як fine‑tuning YOLO допомагає в розпізнаванні образів?
Припустимо, потрібно знаходити мікродефекти на поверхні металу — задача з високою роздільною здатністю та перекосом класів. Використовуємо YOLOv8m, передтренований на COCO (документація Ultralytics), і донавчаємо на 2000 власних зображень. Застосовуємо аугментації Mosaic, MixUp, random perspective. Після 200 епох mAP 0.5 досягає 0.93. Ключові прийоми:
-
focal loss для objectness голови — зменшує внесок легко класифікованих прикладів.
-
class‑balanced sampling — вирівнює представництво рідкісних класів.
-
Test Time Augmentation (TTA) — підвищує recall на 5–7% за рахунок усереднення по фліпах та масштабах.
Отримайте консультацію з підбору архітектури для вашого завдання — зв'яжіться з нами.
Які архітектури сегментації обрати: SAM, Mask R‑CNN чи інші?
SAM (Segment Anything Model) від Meta змінив підхід до сегментації. SAM 2 працює з відео, підтримує трекінг об'єктів через кадри — для інтерактивного виділення об'єкта по точці або bbox це найкращий вибір з коробки. Для production instance segmentation без інтерактивного промпту — Mask R‑CNN або YOLOv8‑seg. YOLOv8‑seg навчається як звичайний детектор з додатковими масками, зручний у тих же пайплайнах. Семантична сегментація (кожен піксель — клас) — SegFormer, DeepLabV3+. SegFormer‑B5 дає хороший баланс точності та швидкості для аналізу супутникових знімків або медичної сегментації.
Кейс: сегментація клітин на мікроскопічних зображеннях. Датасет 400 зображень з ручною розміткою. Навчання Mask R‑CNN на ResNet‑50 backbone дало IoU 0.61 — погано. Проблема: об'єкти (клітини) перекриваються, стандартний NMS вбиває перекриваючі передбачення. Рішення: перехід на cellpose (спеціалізована архітектура для біомедичних задач) + soft‑NMS. IoU зріс до 0.79.
Коли Tesseract не справляється з OCR?
Tesseract — відправна точка для простих задач: друкований текст, хороше освітлення, рівне розташування. Як тільки з'являються рукописні елементи, нестандартні шрифти, перспективні спотворення або багатоколоночний макет — Tesseract деградує швидко.
PaddleOCR — production‑grade рішення: виявлення текстових блоків + розпізнавання + структурний аналіз. Працює з коробки для 80+ мов, включаючи українську. Підтримує таблиці та документи зі складною структурою. Wikipedia: Оптичне розпізнавання символів. TrOCR (Microsoft) — трансформерний OCR з сильними результатами на рукописному тексті. Для українського рукописного тексту потрібен fine‑tuning: базова модель навчена переважно на латиниці.
Що робити, якщо Tesseract не справляється з розпізнаванням образів на документах?
Для задач «витягни дані з рахунку / договору / паспорта» використовуємо LayoutLMv3 або Donut — ці моделі розуміють layout документа, а не тільки текст. Інтеграція через Hugging Face Transformers, fine‑tuning на 200–500 розмічених документах. Типовий pipeline:
- Preprocessing: deskew, denoising, binarization через OpenCV.
- Виявлення текстових блоків: PaddleOCR detection або CRAFT.
- Розпізнавання: PaddleOCR recognition або TrOCR.
- Post‑processing: нормалізація, валідація через regex або LLM для структурованих полів.
Для документів з фіксованою структурою template matching + OCR точково по координатах часто надійніше за end‑to‑end рішення.
Face Recognition: ідентифікація та верифікація
Face recognition = detection + alignment + embedding + matching. Кожен етап важливий.
Detection: RetinaFace або InsightFace для точної локалізації обличчя та ключових точок. MTCNN — старіше, але надійне рішення. Embedding: ArcFace (InsightFace) — state‑of‑the‑art для face recognition embeddings. Моделі iresnet50/iresnet100 передтреновані на MS1MV3 (5M ідентичностей). Ембеддинг‑вектор 512 float32, порівняння за cosine similarity. Threshold tuning: поріг рішення — критичний параметр. При threshold 0.6 типовий FPR на LFW benchmark — 0.001, TPR — 0.985. У production threshold потрібно калібрувати під реальний distribution: люди в масках, зі зміненою зовнішністю, в різних умовах освітлення. Liveness detection обов'язковий: MiniFASNet — lightweight модель на CPU, FaceX‑Zoo містить кілька передтренованих liveness‑детекторів.
Відеоаналітика
Відео — послідовність кадрів плюс часовий вимір. Наївний підхід — детектувати на кожному кадрі — дорого.
Трекінг: ByteTrack та BoT‑SORT — стандарт для multi‑object tracking. Працюють поверх будь-якого детектора, додають persistent ID об'єктам між кадрами — це дає підрахунок об'єктів, трекі руху, velocity.
Оптимізація: не потрібно обробляти кожен кадр. Для статичних сцен детекція на кожному 5–10 кадрі, між ними — трекер. Для детекції подій (людина увійшла в зону) background subtraction (OpenCV MOG2) як lightweight pre‑filter перед нейромережевою детекцією. Action Recognition: SlowFast, VideoMAE для класифікації дій. Важкі моделі — для production використовуємо ONNX export + TensorRT або офлайн обробку.
Як виміряти якість моделі розпізнавання образів у продакшені?
Моніторинг якості — ключовий елемент MLOps. Відстежуємо:
- розподіл prediction confidence;
- частку low‑confidence передбачень (індикатор OOD‑даних);
- дрейф вхідних зображень через feature distribution (embeddings з backbone).
Падіння середньої confidence з 0.87 до 0.71 за тиждень — ранній сигнал про distribution shift. NVIDIA Triton Inference Server рекомендує відстежувати ці метрики через Prometheus. Наші сертифіковані інженери налаштовують моніторинг і гарантують SLA по якості інференсу.
Деплой CV‑моделей
Для онлайн інференсу використовуємо Triton Inference Server (NVIDIA) — production‑стандарт для serving CV‑моделей. Підтримує TensorRT, ONNX, PyTorch, dynamic batching, multiple instances. REST та gRPC API. Гарантуємо стабільну роботу під навантаженням.
Edge deployment: ONNX Runtime на ARM/x86 CPU. TensorFlow Lite для мобільних пристроїв. OpenVINO для Intel CPU/GPU/VPU — дає 2–3× приріст швидкості на Intel залізі порівняно з ONNX Runtime. Після деплою передаємо модель з документацією та навчаємо персонал.
Що входить в роботу
| Етап |
Зміст |
Орієнтовний термін |
| Аналіз |
Технічне завдання, підбір архітектури, оцінка даних |
3–5 днів |
| Розмітка |
Збір зображень, анотування (до 5000 об'єктів) |
1–3 тижні |
| Навчання |
Fine‑tuning моделі, валідація на тестовій вибірці |
1–2 тижні |
| Оптимізація |
Експорт в ONNX/TensorRT/OpenVINO, тестування на цільовому залізі |
1–2 тижні |
| Інтеграція |
REST/gRPC API, інтеграція з існуючою інфраструктурою |
1–2 тижні |
| Деплой |
Розгортання на сервері або edge‑пристрої, навантажувальне тестування |
1 тиждень |
| Документація та навчання |
Інструкції, навчання персоналу, передача коду та моделі |
3–5 днів |
| Підтримка |
Технічна підтримка на 3 місяці після запуску |
— |
Терміни та вартість
Прототип детектора на існуючих даних — 1–2 тижні. Production‑система з оптимізацією під цільове залізо — 4–8 тижнів. Повний цикл включаючи розмітку даних (1000–5000 зображень) — 2–4 місяці. Вартість розраховується індивідуально під кожну задачу. Ми на ринку більше 5 років, реалізували 60+ проектів з комп'ютерного зору. Оцінимо ваш проект під ключ — замовте консультацію, щоб отримати розрахунок та технічну пропозицію.