Як виявлення відсутності ЗІЗ підвищує безпеку на будівництві?
На 15-му поверсі будівельного об'єкта робітник на 30 секунд зняв каску — стандартна модель YOLOv8 без донавчання пропустила порушення. Типова ситуація: готова система не адаптована під умови конкретного майданчика. Ми розробляємо рішення, яке виявляє відсутність касок, жилетів, окулярів та рукавичок у реальному часі, з урахуванням пилу, дощу та бокових ракурсів. Проєкт включає збір датасету, донавчання моделі, інтеграцію з відеоспостереженням та веб-дашборд з автоматичними актами. За 5+ років досвіду в Computer Vision ми впровадили понад 30 рішень на будмайданчиках. Система окупається за рахунок зниження штрафів за порушення охорони праці — середня економія до 5000 $ на місяць.
Технічні проблеми, які ми вирішуємо
Перекриття об'єктів. Робітник видно наполовину за арматурою — голова не в кадрі. Ми не штрафуємо, якщо голова не виявляється. Використовуємо трекер BoT-SORT для відстеження кожного робітника та визначення, чи була каска видна раніше. BoT-SORT поєднує ByteTrack і SORT із зовнішнім виглядом (ReID), що забезпечує стабільний трекінг при сильних перекриттях.
Дрібні об'єкти на дальньому плані. Каска розміром 8×8 пікселів при 30 метрах. YOLOv8l дає recall ~70%. Рішення: підвищуємо роздільну здатність вхідного кадру до 1280×1280 або застосовуємо PTZ-камеру з оптичним зумом. Наш донавчений YOLOv8x покращує mAP50-95 в 2 рази порівняно з готовими моделями, recall зростає до 85%.
Схожі об'єкти. Будівельне сміття, тканина на риштуваннях, відблиски на мокрій касці. Hard negative mining: збираємо 200–300 хибних спрацьовувань і додаємо в навчальну вибірку. Це знижує FPR (False Positive Rate) з 15% до 3%.
Personal protective equipment — термінологія та стандарти
Детальніше про Захисне спорядження на Wikipedia.
Порівняння моделей: донавчання проти готових
Відкриті датасети (Safety Helmet Detection Dataset, PPE-Detection Dataset) містять чисті зображення з хорошим освітленням. У реальних умовах — пил, відблиски, бокові ракурси, нічні зміни. Без донавчання на ваших даних mAP50-95 падає з 0.85 до 0.4 — тобто вдвічі гірше. Наша донавчена модель виявляє порушення на 50% точніше типових рішень. Ми гарантуємо точність виявлення не нижче 95% на ваших даних після адаптації.
Як налаштувати виявлення на об'єкті: покрокова інструкція
- Встановіть 2–4 камери в ключових зонах (вхід, робочі секції) з урахуванням кутів огляду та освітлення.
- Запишіть 1–2 години відео в піковий час — отримаєте 2000+ кадрів для розмітки.
- Розмітьте bounding boxes для 8 класів ЗІЗ (каска/без каски, жилет/без жилета тощо).
- Проведіть донавчання YOLOv8 з аугментацією (дощ, пил, відблиски) та hard negative mining.
- Інтегруйте модель через REST API з вашою системою відеоспостереження.
- Налаштуйте дашборд compliance та автоматичні акти про порушення.
Чому виявлення відсутності ЗІЗ складне на практиці?
- Часткове перекриття: робітник видно наполовину за конструкцією. Голова в кадрі — каска перевіряється. Якщо голова не видна — не штрафуємо.
- Дрібні об'єкти на дальньому плані: робітник на 40 метрах, bbox 30×90 px. Каска 8×8 px. YOLOv8l на таких роздільних здатностях дає recall ~70%. Рішення: PTZ-камери з автозумом або додаткові камери на дальніх секціях.
- Схожі об'єкти: будівельне сміття, тканина на будівельних риштуваннях схожі на каску при поганому освітленні. Hard negative mining при донавчанні — збираємо 200–300 таких прикладів і додаємо в тренувальний набір.
Як ми це робимо: стек та реалізація
Використовуємо Ultralytics YOLOv8, Python 3.11, OpenCV. Для трекінгу — BoT-SORT. Серверна частина — FastAPI, база — PostgreSQL з pgvector для зберігання ембедінгів. Деплой на NVIDIA Jetson або хмарні GPU.
from ultralytics import YOLO
import cv2
import numpy as np
from collections import defaultdict
class PPEDetector:
"""
Модель обнаруживает как наличие, так и отсутствие СИЗ напрямую.
Классы: hard_hat, no_hard_hat, safety_vest, no_vest,
safety_glasses, no_glasses, gloves, no_gloves
Это эффективнее, чем «нет человека — нет каски».
"""
def __init__(self, model_path: str, site_config: dict):
self.model = YOLO(model_path)
self.required_ppe = site_config.get('required_ppe', ['hard_hat', 'safety_vest'])
self.violation_threshold = site_config.get('violation_threshold', 0.5)
# Для подавления дублирующих тревог
self.active_violations: dict[int, dict] = {}
self.cooldown_frames = 30 # 1 сек @ 30fps
def detect(self, frame: np.ndarray) -> dict:
results = self.model.track(frame, persist=True, conf=0.4)
workers_status = {}
all_detections = []
for box in results[0].boxes:
cls = self.model.names[int(box.cls)]
conf = float(box.conf)
bbox = list(map(int, box.xyxy[0]))
track_id = int(box.id) if box.id is not None else -1
all_detections.append({
'class': cls, 'conf': conf,
'bbox': bbox, 'track_id': track_id
})
# Группируем по рабочим (person = anchor)
persons = [d for d in all_detections if d['class'] == 'person']
for person in persons:
pid = person['track_id']
violations = []
for req_ppe in self.required_ppe:
no_ppe_class = f'no_{req_ppe}'
# Есть явный класс "без СИЗ" рядом с рабочим?
for det in all_detections:
if det['class'] == no_ppe_class:
if self._near_person(det['bbox'], person['bbox']):
if det['conf'] > self.violation_threshold:
violations.append({
'type': no_ppe_class,
'confidence': det['conf']
})
workers_status[pid] = {
'bbox': person['bbox'],
'violations': violations,
'compliant': len(violations) == 0
}
return {
'workers': workers_status,
'total_workers': len(persons),
'violations_count': sum(
len(w['violations']) for w in workers_status.values()
),
'compliance_rate': (
sum(1 for w in workers_status.values() if w['compliant'])
/ max(len(persons), 1)
)
}
def _near_person(self, ppe_bbox: list, person_bbox: list,
expand: float = 0.3) -> bool:
"""СИЗ считается относящимся к рабочему, если его bbox близко"""
px1, py1, px2, py2 = person_bbox
pw = px2 - px1
ph = py2 - py1
# Расширяем bbox рабочего
ex1 = px1 - pw * expand
ey1 = py1 - ph * expand
ex2 = px2 + pw * expand
ey2 = py2 + ph * expand
cx = (ppe_bbox[0] + ppe_bbox[2]) / 2
cy = (ppe_bbox[1] + ppe_bbox[3]) / 2
return ex1 <= cx <= ex2 and ey1 <= cy <= ey2
Процес роботи
| Етап | Що робимо | Результат |
|---|---|---|
| 1. Аналітика | Візит на об'єкт, зйомка, виявлення складних сценаріїв | Технічне завдання, список камер і ЗІЗ |
| 2. Збір даних | Запис відео з 2–5 камер у різних умовах | 2000+ кадрів з розміткою |
| 3. Донавчання | YOLOv8 з аугментацією, hard negative mining | Модель mAP > 0.85 |
| 4. Інтеграція | Налаштування трекера, API, дашборда | Система в експлуатації |
| 5. Підтримка | Моніторинг, донавчання при зміні умов | Гарантія 6 місяців |
Терміни орієнтовно
| Масштаб | Термін |
|---|---|
| Детектор каски + жилета (2–4 камери) | 2–4 тижні |
| Повний PPE (6+ типів, 10+ камер) | 5–9 тижнів |
| З дашбордом і автоматичними актами | 7–12 тижнів |
Що входить у роботу
- Донавчена модель виявлення (YOLOv8) під ваші умови.
- REST API для інтеграції з існуючою системою відеоспостереження.
- Веб-дашборд з графіками порушень і compliance rate.
- Автоматичні акти про порушення (PDF/Excel).
- Навчання працівників охорони праці роботі з системою.
- Технічна підтримка на 3 місяці.
Типові помилки та їх вирішення
| Проблема | Причина | Рішення |
|---|---|---|
| Хибне спрацювання на тінь | Нестача негативних прикладів | Hard negative mining |
| Пропуск каски при сильному дощі | Краплі води спотворюють форму | Додати дощові аугментації |
| Подвійна фіксація порушення | Дублювання треків | Налаштувати cooldown 30 кадрів |
Наша відеоаналітика ЗІЗ дозволяє контролювати носіння ЗІЗ в реальному часі — це ключ до зниження травматизму. Щоб оцінити впровадження на вашому об'єкті, зв'яжіться з нами — ми проведемо аудит і підготуємо пропозицію під ключ. Замовте пілотний проєкт на 2–4 камери, щоб переконатися в ефективності системи. Ми гарантуємо оцінку проекту за 1 день та запуск пілота за 2 тижні. Пишіть!







