Камеры есть на каждой стройке, но они пишут архивы, которые никто не смотрит. Инспектор приходит раз в неделю — и то не всегда. Результат: нарушения фиксируются только после инцидента. Наша система компьютерного зрения работает 24/7: детектирует отсутствие каски, жилета, нахождение в опасной зоне и отправляет алерт за секунды. В отличие от человека, AI не устаёт и не отвлекается. Мы измеряли: на объекте с 12 камерами система выявляет в 5 раз больше нарушений, чем ручной обход. По данным Ростехнадзора, 80% нарушений ТБ на стройках связаны с отсутствием СИЗ. Наша технология закрывает этот разрыв между периодическими проверками и непрерывным контролем.
Какие нарушения обнаруживает система?
Система детектирует до 7 типов нарушений в реальном времени:
| Нарушение | Метод | Точность |
|---|---|---|
| Нет каски | Детекция головного убора | 92–96% |
| Нет жилета | Детекция/сегментация жилета | 88–93% |
| Нет перчаток | Детекция рук + атрибутов | 78–85% |
| Нет очков/маски | Детекция лица + аксессуаров | 82–90% |
| Нахождение в зоне запрета | Геозона + трекинг | 94–98% |
| Работа на высоте без страховки | Поза + харнесс детекция | 75–83% |
| Несанкционированный доступ | Геозона + time-of-day | 95–99% |
Как мы строим детектор СИЗ?
import cv2
import numpy as np
from ultralytics import YOLO
from dataclasses import dataclass
@dataclass
class SafetyViolation:
violation_type: str
worker_id: int
bbox: list
confidence: float
zone: str
severity: str # 'warning', 'critical'
class ConstructionSafetyMonitor:
def __init__(self, model_path: str, config: dict):
# YOLOv8l дообученный на Safety Helmet Dataset + custom PPE data
# Классы: person, hard_hat, safety_vest, no_hard_hat, no_vest,
# safety_glasses, gloves, harness
self.model = YOLO(model_path)
self.danger_zones = config['danger_zones']
self.required_ppe = config.get('required_ppe',
['hard_hat', 'safety_vest'])
self.violation_history = {} # worker_track_id -> violations
# Дополнительный pose estimator для проверки страховки на высоте
self.pose_estimator = YOLO('yolov8l-pose.pt')
def _worker_has_ppe(self, worker_bbox: list,
ppe_detections: list,
ppe_class: str) -> tuple[bool, float]:
"""Проверяем, есть ли у конкретного рабочего нужный СИЗ"""
wx1, wy1, wx2, wy2 = worker_bbox
worker_upper_half = [wx1, wy1, wx2, wy1 + (wy2 - wy1) * 0.6]
best_iou = 0.0
for ppe in ppe_detections:
if ppe['class'] == ppe_class:
iou = self._iou(worker_upper_half, ppe['bbox'])
best_iou = max(best_iou, iou)
# IoU > 0.1 = СИЗ находится в области тела рабочего
return best_iou > 0.1, best_iou
def detect_violations(self, frame: np.ndarray) -> list[SafetyViolation]:
results = self.model.track(frame, persist=True, conf=0.4)
violations = []
persons = []
ppe_items = []
for box in results[0].boxes:
cls = self.model.names[int(box.cls)]
bbox = list(map(int, box.xyxy[0]))
conf = float(box.conf)
track_id = int(box.id) if box.id is not None else -1
if cls == 'person':
persons.append({'bbox': bbox, 'track_id': track_id})
elif cls in ['hard_hat', 'safety_vest', 'safety_glasses',
'gloves', 'harness']:
ppe_items.append({'class': cls, 'bbox': bbox, 'conf': conf})
# Для каждого рабочего проверяем наличие СИЗ
for worker in persons:
zone = self._get_zone(worker['bbox'])
for required in self.required_ppe:
has_ppe, iou_score = self._worker_has_ppe(
worker['bbox'], ppe_items, required
)
if not has_ppe:
vtype = f'no_{required}'
violations.append(SafetyViolation(
violation_type=vtype,
worker_id=worker['track_id'],
bbox=worker['bbox'],
confidence=1.0 - iou_score,
zone=zone,
severity='critical' if required == 'hard_hat' else 'warning'
))
# Проверка нахождения в запретной зоне
if zone in self.danger_zones:
cx = (worker['bbox'][0] + worker['bbox'][2]) // 2
cy = (worker['bbox'][1] + worker['bbox'][3]) // 2
if self._in_polygon(cx, cy,
self.danger_zones[zone]['polygon']):
violations.append(SafetyViolation(
violation_type='unauthorized_zone_entry',
worker_id=worker['track_id'],
bbox=worker['bbox'],
confidence=0.95,
zone=zone,
severity='critical'
))
return violations
def _iou(self, box1: list, box2: list) -> float:
x1 = max(box1[0], box2[0])
y1 = max(box1[1], box2[1])
x2 = min(box1[2], box2[2])
y2 = min(box1[3], box2[3])
inter = max(0, x2-x1) * max(0, y2-y1)
area1 = (box1[2]-box1[0]) * (box1[3]-box1[1])
area2 = (box2[2]-box2[0]) * (box2[3]-box2[1])
union = area1 + area2 - inter
return inter / max(union, 1e-6)
Кейс из нашей практики: строительство ЖК на 200 рабочих
На объекте установили 12 IP-камер. До внедрения инспектор обходил площадку раз в день, фиксировал нарушения вручную. Среднее число нарушений СИЗ доходило до 30–40 в день, часть оставалась незамеченной.
После внедрения системы:
- Охват: 100% зон видимости камер в реальном времени
- Обнаружено в первую неделю: 847 нарушений (vs 40–50 вручную)
- Через месяц эксплуатации: снижение нарушений на 73%
- Предотвращено 2 критических инцидента (нахождение в зоне работы крана)
Точность на тестовом наборе: 91% для касок, 87% для жилетов (сложный случай — жилет надет, но расстёгнут).
Почему стоит выбрать нашу систему безопасности?
Мы используем дообученную YOLOv8 — модель с лучшим соотношением скорости и точности. Инференс на NVIDIA T4 занимает 8–10 мс на кадр, что позволяет обрабатывать поток 30 FPS без лагов. В системе применяются техники аугментации и hard negative mining для устойчивости к теням и погодным условиям. Гарантируем точность не ниже 85% по основным классам СИЗ в промышленной эксплуатации. Предотвращение одного критического инцидента может сэкономить до 5 млн рублей на штрафах и простое. Средняя экономия от внедрения системы на объекте с 10+ камерами составляет 2-3 млн рублей в год.
Что входит в работу под ключ
- Аудит стройплощадки и подбор камер
- Установка ПО на ваш сервер или облако
- Дообучение модели под специфику объекта
- Интеграция с NVR и системой оповещений
- Обучение охраны работе с панелью
- Техподдержка 2 месяца после запуска
Как система интегрируется с видеонаблюдением?
Система подключается к NVR или напрямую к камерам по RTSP. Поддерживаются популярные бренды: Hikvision, Dahua, Uniview. API позволяет передавать алерты в любую систему управления безопасностью (EAM, SCADA). Для пилотного проекта достаточно 2–4 камер с разрешением 1080p и сервера с GPU. Рекомендуемая конфигурация сервера: GPU NVIDIA T4 (16GB VRAM), 16 ГБ ОЗУ, SSD 500 ГБ. Для Edge-развёртывания — NVIDIA Jetson Orin NX. Возможно использование облачных инстансов с GPU.
Как происходит внедрение за 4–12 недель?
- Аналитика (1 неделя): выезд на объект, оценка зон покрытия, согласование KPI.
- Проектирование (1–2 недели): выбор камер, сервера, настройка RTSP-потоков.
- Реализация (2–4 недели): обучение модели, подготовка конвейера инференса, написание алертов.
- Тестирование (1 неделя): прогон на исторических записях, A/B-тест в пилотной зоне.
- Деплой (1 неделя): установка на продакшен, обучение персонала, передача документации.
Закажите демонстрацию на реальных данных вашей стройплощадки. Получите консультацию по подбору оборудования и метрик.
| Масштаб | Срок |
|---|---|
| Пилот (2–4 камеры, каска + жилет) | 3–5 недель |
| Полная система (10+ камер, 6+ типов нарушений) | 7–12 недель |
| Enterprise с отчётностью и интеграцией | 12–18 недель |
Уведомления и интеграция
- Оповещение охраны по Telegram-боту с фото нарушения
- Автоматическое создание акта нарушения с кадром, временем, зоной
- Экспорт статистики нарушений в Excel/Power BI для safety-менеджера
Мы гарантируем, что система будет работать стабильно в любых погодных условиях. Обратитесь за демонстрацией на реальных данных. Наши инженеры имеют сертификаты NVIDIA Jetson и опыт внедрения на объектах с 50+ камерами.







