Недавно к нам обратилась страховая компания: им нужно было автоматически оценивать повреждения кузова по фото с мобильного телефона. Основная боль — мелкие царапины и вмятины, которые операторы пропускали. Мы разработали модель, которая находит дефекты размером от 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)







