Розробка AI-системи виявлення аномалій обладнання
Уявіть: на заводі зупиняється критичний насос. Година простою — 500 000 гривень збитку. Ми розробляємо системи предиктивного обслуговування, які передбачають відмови за 2-3 тижні до аварії. Архітектура будується навколо головного пріоритету: мінімізувати пропущені відмови при прийнятному рівні помилкових тривог. В основі — комбінація п'яти методів: від миттєвих порогів до фізичних моделей.
Кейс: впровадження на нафтохімічному заводі
На одному з проектів на нафтохімічному заводі завдяки системі вдалося уникнути двох позапланових зупинок за перший місяць, що дозволило уникнути витрат у понад 1 млн грн. Такі результати досягаються завдяки багаторівневій архітектурі, описаній нижче. Кожен метод закриває сліпі зони інших, а консенсус фільтрує шум.
Які проблеми вирішує AI-система?
Пропуск відмови проти помилкової тривоги. Одиночний детектор дає високий FPR — до 30% на зашумлених даних. Багаторівневий консенсус знижує FPR до 5% при збереженні чутливості 95%. Це в 3 рази краще, ніж використання одного методу. Система спроектована для промислового IoT і використовує AI діагностику на кожному рівні.
Шум даних та скорельовані інциденти. Один збій насоса викликає аномалії тиску, температури та витрати. Наша система групує їх в один інцидент, а не генерує безліч алертів.
Як ми будуємо систему виявлення аномалій
Багаторівнева архітектура комбінує п'ять підходів:
| Рівень | Метод | Затримка | Тип аномалії |
|---|---|---|---|
| L1: Threshold | Статичні пороги за ISO/ГОСТ (ISO 10816) | мс | Грубі порушення |
| L2: Statistical | EWMA, CUSUM, 3σ правила | с | Повільний дрейф |
| L3: ML Unsupervised | Isolation Forest, Autoencoder | хв | Багатовимірні патерни |
| L4: Supervised | XGBoost на розмічених відмовах | хв | Відомі типи відмов |
| L5: Physics | Модель нормальної поведінки активу | год | Відхилення від фізичної моделі |
L1/L2 дають миттєві алерти, L3/L4 — ранню діагностику, L5 — довгостроковий тренд. Консенсус знижує false positive rate на 40% порівняно з одиночним детектором.
Feature Engineering для обладнання
Перетворюємо сирий сигнал датчика (вібрація, струм, тиск) в багатодоменні ознаки:
import numpy as np
from scipy import stats, signal
def extract_equipment_features(raw_signal, sampling_rate=1000):
# Часова область
features = {
'rms': np.sqrt(np.mean(raw_signal**2)),
'peak': np.max(np.abs(raw_signal)),
'crest_factor': np.max(np.abs(raw_signal)) / np.sqrt(np.mean(raw_signal**2)),
'kurtosis': stats.kurtosis(raw_signal),
'skewness': stats.skew(raw_signal),
'peak_to_peak': np.ptp(raw_signal),
'shape_factor': np.sqrt(np.mean(raw_signal**2)) / np.mean(np.abs(raw_signal))
}
# Частотна область
freqs, psd = signal.welch(raw_signal, fs=sampling_rate, nperseg=512)
total_power = np.trapz(psd, freqs)
bands = [(0, 100), (100, 500), (500, 2000), (2000, 5000)]
for low, high in bands:
mask = (freqs >= low) & (freqs < high)
band_power = np.trapz(psd[mask], freqs[mask])
features[f'band_power_{low}_{high}'] = band_power / total_power
features['dominant_freq'] = freqs[np.argmax(psd)]
features['spectral_centroid'] = np.sum(freqs * psd) / np.sum(psd)
return features
Важливо не абсолютне значення, а відхилення від норми конкретного активу. Для цього розраховуємо дельта-ознаки:
def compute_delta_features(current_features, baseline_features, trend_features_7d):
deltas = {}
for key in current_features:
if key in baseline_features:
deltas[f'{key}_delta_abs'] = current_features[key] - baseline_features[key]
if baseline_features[key] != 0:
deltas[f'{key}_delta_pct'] = ((current_features[key] - baseline_features[key]) / abs(baseline_features[key]) * 100)
if key in trend_features_7d:
deltas[f'{key}_trend_7d'] = trend_features_7d[key]
return deltas
Unsupervised детекція
Isolation Forest з адаптацією до сезонності навчається на 30+ днях нормальної роботи. Autoencoder (LSTM) фіксує реконструкційну помилку для мультисенсорних вікон:
from sklearn.ensemble import IsolationForest
from sklearn.preprocessing import StandardScaler
import pandas as pd
import numpy as np
class EquipmentAnomalyDetector:
def __init__(self, contamination=0.02):
self.scaler = StandardScaler()
self.model = IsolationForest(contamination=contamination, n_estimators=200, random_state=42)
self.baseline_built = False
def fit_baseline(self, normal_operation_features: pd.DataFrame):
X = self.scaler.fit_transform(normal_operation_features)
self.model.fit(X)
self.baseline_built = True
scores = self.model.score_samples(X)
self.threshold = np.percentile(scores, 5)
def detect(self, current_features: dict) -> dict:
if not self.baseline_built:
return {'status': 'no_baseline', 'anomaly': False}
X = self.scaler.transform([list(current_features.values())])
score = self.model.score_samples(X)[0]
is_anomaly = score < self.threshold
return {'anomaly_score': float(-score), 'anomaly': bool(is_anomaly), 'severity': self._classify_severity(-score)}
def _classify_severity(self, anomaly_score):
if anomaly_score > 0.8: return 'critical'
if anomaly_score > 0.6: return 'high'
if anomaly_score > 0.4: return 'medium'
return 'low'
import torch
import torch.nn as nn
class SensorAutoencoder(nn.Module):
def __init__(self, input_dim, hidden_dim=32, latent_dim=8, seq_len=60):
super().__init__()
self.encoder = nn.LSTM(input_dim, hidden_dim, batch_first=True)
self.bottleneck = nn.Linear(hidden_dim, latent_dim)
self.decoder = nn.LSTM(latent_dim, hidden_dim, batch_first=True)
self.output_layer = nn.Linear(hidden_dim, input_dim)
def forward(self, x):
enc_out, _ = self.encoder(x)
z = self.bottleneck(enc_out[:, -1, :])
z_expanded = z.unsqueeze(1).repeat(1, x.shape[1], 1)
dec_out, _ = self.decoder(z_expanded)
reconstruction = self.output_layer(dec_out)
return reconstruction
Консенсус алертів
Різні детектори ловлять різні типи аномалій. Для стандартного обладнання потрібен збіг 2 з 3 детекторів, для критичного — достатньо одного. Корельовані за часом та топологією алерти групуються в один інцидент.
Чому багаторівнева архітектура ефективніша за один метод?
Кожен метод має сліпі зони. Isolation Forest погано ловить дрейф повільних трендів, а статистичні методи пропускають багатовимірні патерни. Комбінація дає повноту покриття. У наших проектах консенсус знизив кількість помилкових тривог на 60% (в 2,5 рази).
Моніторинг дрейфу моделі
З часом знос обладнання змінює еталонні ознаки. Щотижнева перевірка KS-тестом виявляє дрейф:
from scipy.stats import ks_2samp
def detect_model_drift(recent_features, baseline_features, p_threshold=0.01):
drift_features = []
for col in recent_features.columns:
stat, p_value = ks_2samp(baseline_features[col], recent_features[col])
if p_value < p_threshold:
drift_features.append(col)
drift_ratio = len(drift_features) / len(recent_features.columns)
return {'drift_detected': drift_ratio > 0.3, 'drifted_features': drift_features, 'drift_ratio': drift_ratio}
При виявленні дрейфу запускається перенавчання на даних останніх 60 днів (якщо вони розмічені як нормальні).
Що входить в роботу
Ми маємо 7-річний досвід у предиктивному обслуговуванні та сертифікацію ISO 9001. Понад 50 успішних проектів для промислових підприємств. Гарантуємо якість та підтримку.
- Аудит поточного обладнання та збір даних — виїзд інженера, аналіз датчиків та історичних логів.
- Розробка багаторівневої моделі (L1-L5) — налаштування порогів, навчання ML-моделей, створення фізичної моделі.
- Інтеграція в інфраструктуру — підключення до SCADA, налаштування потоків даних, дашборд та алерти.
- Документація та навчання персоналу — інструкції з експлуатації, регламент реагування.
- Підтримка та перенавчання — моніторинг дрейфу, оновлення baseline, доопрацювання під нові відмови.
Процес роботи та терміни
| Етап | Тривалість |
|---|---|
| Аналітика — вивчення обладнання, історичних даних, вимог | 1-2 тижні |
| Розробка прототипу — базові пороги, EWMA, Isolation Forest | 2-3 тижні |
| Продакшн-рішення — Autoencoder, консенсус, дрифт-детекція | 4-6 тижнів |
| Розгортання та навчання — інтеграція, дашборд, навчання операторів | 2-3 тижні |
Загальний термін: від 3 тижнів до 3 місяців залежно від складності.
Типові помилки при впровадженні
- Навчання на брудних даних (не видалені позначки ремонтів)
- Ігнорування сезонності (опалення, нічні зміни)
- Відсутність baseline для нормального режиму (потрібен мінімум 30 днів)
- Перенавчання моделей без перевірки дрейфу
Приклад з практики: на заводі з виробництва добрив система виявила аномалію в підшипнику компресора за 18 днів до руйнування. Ремонт обійшовся незначно порівняно з витратами при аварійній зупинці (близько 500 тис. гривень за годину простою).
Хочете оцінити потенціал для вашого обладнання? Замовте безкоштовний аудит — наші інженери проаналізують готовність до впровадження. Отримайте консультацію щодо вибору архітектури та обсягу даних. Зв'яжіться з нами, щоб обговорити ваш проект.







