Нещодавно до нас звернулася страхова компанія: їм потрібно було автоматично оцінювати пошкодження кузова по фото з мобільного телефону. Основний біль — дрібні подряпини та вм'ятини, які оператори пропускали. Ми розробили модель, яка знаходить дефекти розміром від 0.5 мм і класифікує їх за ступенем серйозності. Помилка в локалізації може коштувати мільйонів, тому ми досягаємо recall >95% при контрольованому рівні хибних спрацьовувань. За 5 років на ринку ми виконали понад 50 проєктів у галузі комп'ютерного зору, включаючи детекцію дефектів для автомобільної та металургійної промисловості. Економія ручної праці сягає 80%, а рекламації знижуються на 30%. Оцінимо ваш проєкт — зв'яжіться з нами для консультації.
Типи пошкоджень та особливості детекції
Тріщини — тонкі лінійні структури з малим співвідношенням ширини до довжини. Стандартні детектори погано працюють: bounding box великий, а дефект маленький. Краще використовувати сегментацію.
Вм'ятини — деформація поверхні без розриву матеріалу. Складно детектувати в 2D; допомагають нормоване освітлення (рейкінгове світло) та 3D-реконструкція.
Подряпини — аналогічно тріщинам, лінійні структури. Глибина впливає на серйозність.
Як ми детектуємо дрібні тріщини та подряпини?
Використовуємо комбінацію YOLOv8 для instance segmentation та спеціалізованої передобробки. Рейкінгове світло під малим кутом створює тіні від найменших нерівностей, що дозволяє виявляти дефекти товщиною в декілька пікселів. У пайплайн додано топ-хат трансформації та посилення контрасту.
Архітектура системи
from ultralytics import YOLO import numpy as np import cv2 class DamageDetectionSystem: def __init__(self, config: dict): # Детектор пошкоджень (YOLOv8 instance segmentation) self.detector = YOLO(config['detection_model']) # Класифікатор тяжкості self.severity_classifier = load_severity_model(config['severity_model']) # Вимірювач розмірів (потребує калібрування) self.pixels_per_mm = config.get('pixels_per_mm') def analyze(self, image: np.ndarray) -> dict: # Детекція та сегментація пошкоджень results = self.detector(image, conf=0.4, iou=0.5) damages = [] for i, (box, mask) in enumerate(zip( results[0].boxes, results[0].masks.data if results[0].masks else [] )): damage_type = self.detector.model.names[int(box.cls)] bbox = box.xyxy[0].tolist() area_px = int(mask.sum().item()) # Вирізаємо регіон для класифікації тяжкості x1, y1, x2, y2 = map(int, bbox) crop = image[y1:y2, x1:x2] severity = self.severity_classifier.predict(crop) # Реальні розміри якщо є калібрування size_info = {} if self.pixels_per_mm: size_info['area_mm2'] = round(area_px / self.pixels_per_mm**2, 2) size_info['length_mm'] = self._estimate_length(mask) damages.append({ 'id': i, 'type': damage_type, 'severity': severity, 'bbox': bbox, 'area_pixels': area_px, 'confidence': float(box.conf), **size_info }) return { 'damages': damages, 'total_count': len(damages), 'has_critical': any(d['severity'] == 'critical' for d in damages), 'summary': self._generate_summary(damages) } Чому рейкінгове світло ефективне?
Для тріщин і подряпин стандартне фронтальне освітлення недостатнє. Рейкінгове світло — джерело під малим кутом до поверхні — створює тіні від найменших нерівностей. Ми використовуємо топ-хат трансформацію для виділення дрібних деталей та вирівнювання гістограми для посилення контрасту. Це підвищує recall дрібних дефектів на 15–20%.
def process_raking_light_image(image_path: str) -> np.ndarray: """Нормалізоване зображення з рейкінговим світлом""" # При правильному освітленні на стенді — додаткова обробка: img = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE) # Топ-hat трансформація для виділення дрібних деталей kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (25, 25)) tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel) # Посилення контрасту enhanced = cv2.equalizeHist(tophat) return enhanced Як вимірювати розміри дефектів?
Після детекції потрібно оцінити реальні розміри — довжину тріщини або площу вм'ятини. Для цього калібруємо камеру за еталонним об'єктом. Параметр pixels_per_mm заноситься в конфіг системи. Потім за маскою дефекту обчислюємо фізичні розміри. Для тріщин використовуємо скелетизацію маски — так точніше.
def measure_crack_length(mask: np.ndarray, pixels_per_mm: float) -> float: """Вимірювання довжини тріщини за скелетом маски""" from skimage.morphology import skeletonize skeleton = skeletonize(mask > 0) # Довжина скелета = приблизна довжина тріщини length_px = skeleton.sum() return round(length_px / pixels_per_mm, 2) Для точного вимірювання розмірів потрібне калібрування за еталоном. Ми використовуємо шахову дошку з відомим кроком, визначаємо матрицю камери та коефіцієнт pixels_per_mm.
Датасети та метрики
Публічні датасети:
- NEU Surface Defect — 6 класів дефектів сталі, 1800 зображень
- DAGM — текстурні дефекти, 10 категорій
- AITEX Fabric — дефекти тканин
- Concrete Crack Images — тріщини в бетоні
# Приклад навчання на NEU Surface Defect from ultralytics import YOLO model = YOLO('yolov8m-seg.pt') model.train( data='neu_defect.yaml', epochs=150, imgsz=640, batch=16, workers=8, optimizer='AdamW', lr0=5e-4, augment=True, degrees=180, # дефекти можуть бути в будь-якій орієнтації fliplr=0.5, flipud=0.5, mosaic=1.0 ) Метрики на різних матеріалах
| Матеріал | [email protected] | Складність |
|---|---|---|
| Метал (подряпини, тріщини) | 88–94% | Середня |
| Скло (тріщини) | 82–89% | Висока |
| Пластик (вм'ятини) | 84–91% | Висока |
| Бетон (тріщини) | 90–96% | Середня |
Що входить у роботу?
- Аналіз вимог та збір датасету (зйомка дефектів на вашому обладнанні або використовуємо готові датасети)
- Розробка моделі детекції та сегментації, навчання з аугментацією
- Інтеграція у вашу ІТ-інфраструктуру (REST API, Docker-контейнер)
- Калібрування камери та налаштування освітлення (рейкінговий стенд при необхідності)
- Документація та навчання операторів
- Гарантійна підтримка 3 місяці
Середня вартість розробки такої системи залежить від складності та обсягу даних. Для типового проєкту з 2–3 типами дефектів бюджет становить від $15,000 до $50,000. Економія на ручному контролі може перевищувати $80,000 на рік. Отримайте попередню оцінку — зв'яжіться з нами.
Терміни впровадження
| Завдання | Термін |
|---|---|
| 2–3 типи дефектів, supervised | 3–5 тижнів |
| Розмірний аналіз + калібрування | 5–8 тижнів |
| Промислова система з освітленням | 8–14 тижнів |
Чек-лист: готовність виробництва до AI-детекції дефектів
Перед запуском проєкту перевірте за пунктами:
- Наявність контрольованого освітлення на стенді (рейкінгове або дифузне світло).
- Стабільне кріплення камери з роздільною здатністю не нижче 5 МП для дефектів від 0.5 мм.
- Історичний архів знімків: не менше 200–300 прикладів кожного типу дефекту.
- Чіткі критерії приймання: максимально допустимий відсоток хибних спрацьовувань та пропусків.
- Готовність до розмітки даних (анотація масок) або наявність попередньо розміченого датасету.
- Визначений SLA: допустимий час інспекції одного об'єкта.
Ми гарантуємо прозорий супровід на всіх етапах. Замовте консультацію інженера — обговоримо деталі вашого проєкту. Отримайте рішення, яке реально працює.
NEU Surface Defect dataset (Song et al., 2019)







