System Development детекции дефектов на производстве (Visual Inspection)
Автоматизированный визуальный контроль — замена ручной инспекции качества на конвейере CV-системой. Человек-контролёр устаёт, субъективен, пропускает дефекты при монотонной работе. Машинное зрение работает 24/7, стабильно, и при правильной настройке превосходит человека по recall на конкретных типах дефектов.
Типы дефектов и методы их детекции
| Тип дефекта | Примеры | Метод |
|---|---|---|
| Поверхностные | Царапины, трещины, вмятины | Anomaly Detection / Детекция |
| Размерные | Неправильный размер, форма | Измерение через CV |
| Сборочные | Отсутствие компонента, неправильное положение | Детекция + верификация |
| Цветовые | Пятна, неравномерная окраска | Classification / Anomaly |
| Текстурные | Пористость, расслоение | Anomaly Detection |
Anomaly Detection: метод без разметки дефектов
Разметка дефектных примеров дорога и трудоёмка. Методы anomaly detection обучаются только на бездефектных изображениях:
import torch
from anomalib.models import PatchCore
from anomalib.data import MVTec
from anomalib import TaskType
class ProductionAnomalyDetector:
def __init__(self, model_type: str = 'patchcore'):
# PatchCore — best performer на MVTec-AD benchmark
self.model = PatchCore(
backbone='wide_resnet50_2',
pre_trained=True,
coreset_sampling_ratio=0.1,
num_neighbors=9
)
def train(self, normal_images_dir: str):
"""Training только на нормальных изображениях"""
self.model.fit(normal_images_dir)
def predict(self, image_path: str) -> dict:
result = self.model.predict(image_path)
return {
'anomaly_score': float(result.pred_score),
'is_defective': result.pred_label == 1,
'anomaly_map': result.anomaly_map, # тепловая карта дефектов
'defect_regions': self._extract_regions(result.anomaly_map)
}
PatchCore — state-of-the-art на MVTec-AD:
- Image-level AUROC: 99.1%
- Pixel-level AUROC: 98.1%
- Training: 10 минут на 200 нормальных изображениях
Supervised Detection для известных дефектов
Когда типы дефектов известны и размечены — YOLOv8:
from ultralytics import YOLO
import cv2
import numpy as np
class DefectDetector:
def __init__(self, model_path: str, confidence: float = 0.5):
self.model = YOLO(model_path) # дообученный на дефектах
self.confidence = confidence
# Категории тяжести для routing
self.critical_defects = ['crack', 'deep_scratch', 'hole']
self.minor_defects = ['surface_scratch', 'small_dent', 'discoloration']
def inspect(self, image: np.ndarray) -> dict:
results = self.model(image, conf=self.confidence)
defects = []
for box in results[0].boxes:
defect_type = self.model.names[int(box.cls)]
defects.append({
'type': defect_type,
'severity': 'critical' if defect_type in self.critical_defects else 'minor',
'bbox': box.xyxy[0].tolist(),
'confidence': float(box.conf),
'area_px': self._bbox_area(box.xyxy[0])
})
verdict = 'REJECT' if any(d['severity'] == 'critical' for d in defects) else \
'QUARANTINE' if defects else 'PASS'
return {
'verdict': verdict,
'defects': defects,
'defect_count': len(defects)
}
Integration с конвейером
Для встраивания в производственную линию критична синхронизация:
- Trigger: датчик (фотобарьер) фиксирует деталь в зоне съёмки → сигнал камере
- Exposure control: стробоскоп синхронизирован с камерой (freeze motion)
- Latency: от триггера до решения < 100ms для большинства линий
- Rejection mechanism: пневматический толкатель или дивертер срабатывает по сигналу
class ConveyorInspectionSystem:
def __init__(self, camera, detector, plc_client):
self.camera = camera # промышленная камера (Basler, Cognex)
self.detector = detector
self.plc = plc_client # PLC для управления rejection
def on_trigger(self, trigger_signal):
"""Callback при сигнале от датчика"""
image = self.camera.capture()
result = self.detector.inspect(image)
if result['verdict'] in ['REJECT', 'QUARANTINE']:
# Задержка под время транспортировки до ejector
delay_ms = self.calculate_transport_delay()
self.plc.schedule_rejection(delay_ms, result['verdict'])
self.log_result(result)
Типичные производственные результаты
На металлических деталях (царапины, трещины):
- Recall дефектов (PatchCore): 96–99%
- Precision: 91–97%
- Throughput: до 1200 деталей/час при latency 80ms
| Масштаб проекта | Срок |
|---|---|
| Пилот: 1 тип детали, аномалия | 4–6 недель |
| 3–5 типов деталей, известные дефекты | 8–12 недель |
| Многопозиционная линия, реалтайм | 12–20 недель |







