Разработка системы контроля качества продукции через компьютерное зрение
На производственных линиях, где ручной контроль не успевает за темпом конвейера (600+ изделий в час), каждый пропущенный дефект — это риск репутации и финансовых потерь. Мы сталкивались с ситуациями, когда брак выявлялся только на финальной упаковке, а переделка обходилась дороже самого контроля. Поэтому строим системы, которые находят критические дефекты на каждом этапе: от входного сырья до отгрузки.
Почему традиционный визуальный контроль неэффективен?
Человеческий глаз устаёт уже через 20 минут монотонной проверки — число пропусков растёт. При скорости конвейера 2–3 изделия в секунду оператор пропускает до 20–30% дефектных единиц. Автоматизация на базе CV снимает эту проблему: система работает стабильно, не отвлекается, не болеет. Кроме того, она измерима — вы точно знаете метрики качества.
Как построить систему контроля качества на базе компьютерного зрения?
Мы используем модульную архитектуру: этапы контроля (входной, промежуточный, финальный, упаковка) объединяются в единый пайплайн. На каждом этапе свои детекторы: дефекты поверхности, измерение геометрии, верификация маркировки, проверка комплектности. Система решает, пройдёт ли деталь дальше или отправится в карантин.
Кейс: снижение брака на 40% на производстве автокомпонентов. Завод выпускал штампованные детали: после штамповки на конвейере операторы визуально проверяли каждую. Брак по трещинам и недоштамповке составлял 6% при ручной проверке — 30% дефектов пропускалось. Мы внедрили камеру GigE Vision с подсветкой, модель YOLOv8 на Jetson AGX Orin. Recall критических трещин достиг 99.2%, ложные срабатывания — 1.8%. Итоговый брак снизился до 3.5%, окупаемость системы — 5 месяцев. Средняя экономия за счёт снижения брака составила 1,2 млн рублей в год.
Архитектура многоточечной QC системы
Этап 1: Входной контроль сырья/компонентов
↓
Этап 2: Промежуточный контроль (на конвейере)
↓
Этап 3: Финальный контроль готовой продукции
↓
Этап 4: Контроль упаковки и маркировки
from dataclasses import dataclass, field
from enum import Enum
class QCStage(Enum):
INCOMING = 'incoming'
IN_PROCESS = 'in_process'
FINAL = 'final'
PACKAGING = 'packaging'
@dataclass
class QCResult:
product_id: str
stage: QCStage
timestamp: str
verdict: str # PASS / FAIL / QUARANTINE
defects: list[dict] = field(default_factory=list)
measurements: dict = field(default_factory=dict)
label_check: dict = field(default_factory=dict)
images: list[str] = field(default_factory=list)
class ProductQCSystem:
def __init__(self, config: dict):
self.defect_detector = DefectDetector(config['defect_model'])
self.measurement_engine = MeasurementEngine(config['reference_data'])
self.label_verifier = LabelVerifier(config['label_templates'])
self.completeness_checker = CompletenessChecker(config['bom'])
def inspect(self, image: np.ndarray,
product_id: str,
stage: QCStage) -> QCResult:
result = QCResult(product_id=product_id, stage=stage,
timestamp=get_timestamp(), verdict='PASS')
if stage == QCStage.FINAL:
# Полная проверка
result.defects = self.defect_detector.inspect(image)['defects']
result.measurements = self.measurement_engine.measure(image)
result.label_check = self.label_verifier.verify(image)
completeness = self.completeness_checker.check(image)
# Определение verdict
has_critical_defect = any(d['severity'] == 'critical'
for d in result.defects)
measurement_ok = result.measurements.get('within_tolerance', True)
label_ok = result.label_check.get('verified', True)
complete = completeness.get('complete', True)
if has_critical_defect or not measurement_ok:
result.verdict = 'FAIL'
elif not label_ok or not complete:
result.verdict = 'QUARANTINE'
return result
Измерение геометрических параметров
Для поиска контуров используем алгоритм Canny (OpenCV documentation). После калибровки камеры измеряем реальные размеры.
class MeasurementEngine:
def __init__(self, calibration_data: dict):
# Калибровочные данные: pixels_per_mm при известном расстоянии
self.pixels_per_mm = calibration_data['pixels_per_mm']
self.tolerance = calibration_data['tolerance_mm']
def measure(self, image: np.ndarray) -> dict:
# Поиск контура детали
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
_, binary = cv2.threshold(gray, 0, 255,
cv2.THRESH_BINARY + cv2.THRESH_OTSU)
contours, _ = cv2.findContours(binary, cv2.RETR_EXTERNAL,
cv2.CHAIN_APPROX_SIMPLE)
if not contours:
return {'measured': False}
main_contour = max(contours, key=cv2.contourArea)
# Bounding rect для ширины/высоты
x, y, w, h = cv2.boundingRect(main_contour)
width_mm = w / self.pixels_per_mm
height_mm = h / self.pixels_per_mm
# Минимальный описывающий прямоугольник (rotated)
rect = cv2.minAreaRect(main_contour)
rect_w, rect_h = rect[1]
angle = rect[2]
return {
'width_mm': round(width_mm, 2),
'height_mm': round(height_mm, 2),
'rotation_angle': round(angle, 1),
'within_tolerance': self._check_tolerance(width_mm, height_mm),
'area_mm2': round(cv2.contourArea(main_contour) /
self.pixels_per_mm**2, 2)
}
Верификация маркировки и этикеток
class LabelVerifier:
def __init__(self, templates: dict):
self.ocr = PaddleOCR(use_angle_cls=True, lang='ru')
self.templates = templates # ожидаемые паттерны для продукта
def verify(self, image: np.ndarray, product_sku: str) -> dict:
# OCR этикетки
ocr_result = self.ocr.ocr(image, cls=True)
extracted_text = '\n'.join([line[1][0] for line in ocr_result[0]])
template = self.templates.get(product_sku, {})
checks = {}
# Проверка обязательных полей
for field_name, pattern in template.items():
match = re.search(pattern, extracted_text)
checks[field_name] = {
'found': bool(match),
'value': match.group() if match else None
}
all_found = all(v['found'] for v in checks.values())
return {
'verified': all_found,
'fields': checks,
'raw_text': extracted_text
}
SPC (Statistical Process Control) интеграция
После каждого измерения данные идут в SPC-модуль, который строит контрольные карты Шухарта (X-bar/R chart) и автоматически сигнализирует о выходе процесса за контрольные пределы. Данные передаются в реальном времени, что позволяет оперативно реагировать на сдвиги процесса.
| Метрика QC-системы | Типичное значение |
|---|---|
| Recall дефектов (критических) | 98–99.5% |
| False rejection rate | 1–3% |
| Throughput | 600–3000 шт/час |
| Latency на деталь | 50–150 ms |
Наша система на основе нейросетей обеспечивает recall в 1.3 раза выше, чем традиционные пороговые методы. Это подтверждается тестами на 50+ производствах.
Подробнее о сравнении с пороговыми методами
Пороговые методы (бинаризация по яркости, фильтрация по площади) дают recall 70–85% при FPR 5–10%. Нейросетевые детекторы (YOLOv8) достигают recall 95–99% при FPR 1–3%. Разница особенно заметна на сложных текстурах и при нестабильном освещении.Что входит в работу
Мы поставляем не просто код, а законченное решение:
- Техническое задание с протоколом испытаний.
- Настроенный пайплайн обучения и инференса.
- Адаптированное оборудование (камеры, освещение, контроллеры).
- Документацию API и инструкцию оператора.
- Обучение ваших инженеров работе с системой.
- Гарантийную поддержку на 12 месяцев и опцию продления.
Ориентировочные сроки
| Масштаб проекта | Срок |
|---|---|
| Один продукт, одна проверочная точка | 6–8 недель |
| Многопродуктовая система, несколько этапов | 12–18 недель |
| Enterprise QC с SPC и ERP-интеграцией | 18–28 недель |
Стоимость рассчитывается индивидуально — пишите, оценим ваш проект. Средняя окупаемость систем — 4–8 месяцев.
Типичные ошибки при внедрении CV-контроля
- Плохое освещение — даже лучшая модель даёт сбои, если на детали блики или тени. Уделяем внимание светотехнике.
- Игнорирование калибровки — без точной калибровки камеры измерения геометрии бессмысленны. Каждую систему калибруем по эталону.
- Слабый набор данных для обучения — 100–200 изображений дефектов недостаточно. Собираем 1000+ снимков с аугментацией.
- Отсутствие обратной связи — модель должна переобучаться на новых типах брака. Встраиваем контур active learning.
Почему выбирают нас
Наш опыт — 10+ лет в промышленном компьютерном зрении, более 50 внедрённых QC-систем. Мы используем проверенные инструменты: OpenCV, YOLOv8, PaddleOCR, PyTorch. Гарантируем точность детекции и прозрачность метрик. Свяжитесь с нами, чтобы обсудить вашу задачу — вместе найдём эффективное решение. Получите консультацию по вашей задаче уже сегодня.







