Production Defect Detection System (Visual Inspection)

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
Production Defect Detection System (Visual Inspection)
Complex
~1-2 weeks
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 детекции дефектов на производстве (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 недель