Damage Detection System (Cracks, Dents, Scratches)

We design and deploy artificial intelligence systems: from prototype to production-ready solutions. Our team combines expertise in machine learning, data engineering and MLOps to make AI work not in the lab, but in real business.
Showing 1 of 1 servicesAll 1566 services
Damage Detection System (Cracks, Dents, Scratches)
Medium
~5 business days
FAQ
AI Development Areas
AI Solution Development Stages
Latest works
  • image_web-applications_feedme_466_0.webp
    Development of a web application for FEEDME
    1161
  • image_ecommerce_furnoro_435_0.webp
    Development of an online store for the company FURNORO
    1041
  • image_logo-advance_0.png
    B2B Advance company logo design
    561
  • image_crm_enviok_479_0.webp
    Development of a web application for Enviok
    823
  • image_logo-aider_0.jpg
    AIDER company logo development
    762
  • image_crm_chasseurs_493_0.webp
    CRM development for Chasseurs
    848

System Development детекции повреждений (трещины, вмятины, царапины)

Детекция физических повреждений — задача с высокими требованиями к точности локализации: страховые компании, авторизованные сервисы, производители требуют не только факт наличия повреждения, но и его тип, размер, местоположение. Точность влияет на финансовые решения, что требует высокого recall при контролируемом числе ложных срабатываний.

Типы повреждений и особенности детекции

Трещины — тонкие линейные структуры с малым соотношением ширины к длине. Стандартные детекторы плохо работают: bounding box большой, а дефект маленький. Лучше использовать сегментацию.

Вмятины — деформация поверхности без разрыва материала. Сложно детектировать в 2D; помогают нормированное освещение (рейкинговый свет) и 3D-реконструкция.

Царапины — аналогично трещинам, линейные структуры. Глубина влияет на серьёзность.

Architecture системы

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)
        }

Специализированное освещение для мелких дефектов

Для трещин и царапин стандартное фронтальное освещение недостаточно. Рейкинговый свет (raking light) — источник под малым углом к поверхности — создаёт тени от мельчайших неровностей:

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

Датасеты и метрики

Публичные датасеты:

  • 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
)

Размерный анализ повреждений

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)
Материал [email protected] Сложность
Металл (царапины, трещины) 88–94% Средняя
Стекло (трещины) 82–89% Высокая
Пластик (вмятины) 84–91% Высокая
Бетон (трещины) 90–96% Средняя
Задача Срок
2–3 типа дефектов, supervised 3–5 недель
Размерный анализ + калибровка 5–8 недель
Промышленная система с освещением 8–14 недель