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 недель |







