Розробка системи виявлення аномалій на зображеннях

Виявлення аномалій на зображеннях без учителя

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

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

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

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

Виявлення аномалій на зображеннях без учителя

Промисловий контроль якості часто впирається у відсутність розмічених даних про дефекти. Навчити модель тільки на нормальних зразках звучить складно, але сучасні unsupervised методи справляються з цим без жодної розмітки. Ми впроваджуємо такі системи на виробництвах вже багато років — понад 20 проєктів з комп'ютерного зору. Наш досвід включає автоматичне виявлення подряпин, тріщин, забруднень та інших аномалій. Згідно з дослідженням MVTec-AD, сучасні методи unsupervised детекції досягають AUROC 99%.

Чому unsupervised підхід кращий за supervised для аномалій?

Supervised детекція потребує тисяч прикладів кожного дефекту. У реальності дефекти рідкісні та різноманітні — зібрати репрезентативну вибірку практично неможливо. Unsupervised навчання вирішує цю проблему: модель запам'ятовує лише норму та сигналізує про всі відхилення. На бенчмарку MVTec-AD сучасні методи досягають AUROC 99.1% (PatchCore) і 98.9% (EfficientAD) — впритул до supervised підходів, але без витрат на розмітку.

Як обрати метод під своє завдання?

Вибір архітектури залежить від обсягу даних та вимог до швидкості. PatchCore будує memory bank з нормальних патчів — не навчається градієнтно, тому стартує за хвилини. EfficientAD потребує більше даних (від 200 зображень), але видає стабільно високу якість при інференсі до 10 мс на GPU. Якщо потрібно детектувати аномалії без переучування (zero-shot), підійде WinCLIP на базі CLIP.

PatchCore: оптимальний алгоритм для малих даних

PatchCore підходить для сценаріїв, де доступно 50–200 нормальних зображень.

from anomalib.models import PatchCore from anomalib.data import Folder from anomalib import TaskType from lightning.pytorch import Trainer datamodule = Folder( name='my_product', root='./dataset', normal_dir='train/good', abnormal_dir='test/defective', task=TaskType.SEGMENTATION, image_size=(256, 256), train_batch_size=32, eval_batch_size=32 ) model = PatchCore( backbone='wide_resnet50_2', pre_trained=True, layers=['layer2', 'layer3'], coreset_sampling_ratio=0.1, num_neighbors=9 ) trainer = Trainer(max_epochs=1) trainer.fit(model, datamodule) 

Як ми впроваджуємо систему за 1-2 тижні?

Процес розробки складається з п'яти етапів:

  1. Аналіз виробництва: оцінка доступних даних, умов зйомки, вимог до FP/FN.
  2. Збір еталонних зразків: зйомка 50–200 нормальних зображень продукту.
  3. Вибір архітектури та навчання: PatchCore для малих даних, EfficientAD для високих навантажень.
  4. Калібрування порогів та тестування: налаштування порогу за квантилем із заданим FPR.
  5. Деплой та інтеграція: контейнеризація, REST API, інтеграція з SCADA.
Типова помилка при калібруванні порогуБагато інженерів встановлюють поріг за максимальним score на нормальній вибірці. Це призводить до великої кількості false positives. Рекомендується використовувати квантиль із заданим FPR.

Порівняння методів виявлення аномалій

Метод AUROC MVTec-AD Швидкість Особливість
PatchCore 99.1% Середня Memory bank
SimpleNet 98.7% Швидка Простий
WinCLIP 91.8% Повільна Zero-shot
STFPM 97.9% Швидка Teacher-Student
FastFlow 97.5% Дуже швидка Normalizing Flow
EfficientAD 98.9% Дуже швидка Рекомендується для prod

EfficientAD — найкращий вибір для production через швидкість інференсу при збереженні високого AUROC. Ми використовуємо його в проєктах з високими вимогами до latency.

Як налаштовується поріг виявлення?

Поріг визначає, з якого score зразок вважається аномальним. Ми калібруємо його за квантилем на валідаційних нормальних даних:

class AnomalyDetector: def __init__(self, model_path: str, threshold: float = None): self.model = load_model(model_path) self.threshold = threshold or self._calibrate_threshold() def _calibrate_threshold(self, fp_rate: float = 0.01) -> float: """Порог при заданном False Positive Rate""" val_scores = self._predict_normal_samples() threshold = np.quantile(val_scores, 1 - fp_rate) return float(threshold) def predict(self, image: np.ndarray) -> dict: result = self.model(image) score = float(result.anomaly_score) return { 'anomaly_score': score, 'is_anomaly': score > self.threshold, 'severity': self._classify_severity(score), 'heatmap': result.anomaly_map, 'threshold': self.threshold } def _classify_severity(self, score: float) -> str: if score < self.threshold: return 'normal' elif score < self.threshold * 1.5: return 'minor' elif score < self.threshold * 2.5: return 'moderate' return 'severe' 

Локалізація аномалій через теплові карти

Теплова карта (anomaly map) дозволяє точно показати оператору місце дефекту:

import matplotlib.pyplot as plt import matplotlib.cm as cm def visualize_anomaly(original: np.ndarray, anomaly_map: np.ndarray, threshold: float) -> np.ndarray: heatmap_norm = (anomaly_map - anomaly_map.min()) / \ (anomaly_map.max() - anomaly_map.min() + 1e-8) heatmap_colored = cv2.applyColorMap( (heatmap_norm * 255).astype(np.uint8), cv2.COLORMAP_JET ) _, mask = cv2.threshold( (heatmap_norm * 255).astype(np.uint8), int(threshold * 255), 255, cv2.THRESH_BINARY ) contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) overlay = cv2.addWeighted(original, 0.6, heatmap_colored, 0.4, 0) cv2.drawContours(overlay, contours, -1, (0, 255, 0), 2) return overlay 

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

Ми беремо на себе весь цикл: від збору еталонних зразків до деплою на лінію. У deliverables входять:

  • Аналіз виробництва: оцінка доступних даних, умов зйомки, вимог до FP/FN.
  • Вибір архітектури: PatchCore для малих даних, EfficientAD для високих навантажень.
  • Калібрування порогів та метрик: під ваші бізнес-критерії.
  • Деплой та інтеграція: контейнеризація, REST API, інтеграція з SCADA.
  • Документація та навчання операторів: інструкції з експлуатації та інтерпретації результатів.
  • Гарантійна підтримка 6 місяців: супровід та доналаштування.

Терміни та наш досвід

Сценарій Орієнтовний термін
1 продукт, PatchCore з коробки 1–2 тижні
5–10 продуктів, калібрування порогів 3–5 тижнів
Промислова система з онлайн-навчанням 6–10 тижнів

Ми — сертифіковані інженери з багаторічним досвідом у MLOps. За нашими плечима 20+ проєктів з комп'ютерного зору на виробництвах. Виявлення аномалій — наша профільна компетенція. Зв'яжіться з нами для оцінки вашого завдання — ми підберемо оптимальне рішення та розрахуємо бюджет протягом 2 днів. Замовте пілотний проєкт на одному продукті — вже через тиждень у вас буде працюючий прототип.