Разработка AI для детекции дефектов ткани и текстиля
Текстильное производство теряет до 5% выручки из-за брака, который пропускает ручная инспекция. Один оператор проверяет 20–30% рулонов на скорости 20–40 м/мин и пропускает 15–25% дефектов из-за усталости. При этом каждый рулон длиной 50–100 м стоит около $9–13, а пропущенный брак уходит клиенту. Пропуск дефектного рулона — значительная потеря. Мы предлагаем альтернативу: AI-систему компьютерного зрения, которая инспектирует 100% поверхности ткани на скорости до 100 м/мин, стабильно обнаруживая даже микроскопические дефекты. Система базируется на методах компьютерного зрения и машинного обучения. Она работает под ключ: от сбора датасета до интеграции в производственную линию.
Какие проблемы решаем
Наши клиенты сталкиваются с типичными сложностями:
- Высокая скорость линии — при 60 м/мин оператор физически не успевает заметить дыру размером 1 мм. Наш детектор обрабатывает каждый тайл за 10 мс на GPU, обеспечивая пропускную способность до 80+ м/мин на RTX-карте.
- Многообразие дефектов — дыры, пятна, разрывы нитей, ошибки переплетения, царапины, складки. Мы используем двухуровневую архитектуру: PatchCore для anomaly detection и YOLOv8 для классификации. Это даёт recall > 0.95 по всем классам.
- Изменчивость тканей — гладкие, ворсистые, с рисунком. Anomaly detection на PatchCore не требует разметки дефектов — только хорошие образцы. Переобучение на новый тип ткани занимает одну неделю.
Как работает двухуровневая детекция?
Стек: PyTorch, PatchCore, EfficientAD, YOLOv8, OpenCV, TensorRT для инференса. Основной компонент — адаптация модели PatchCore под линейные камеры с тайловой обработкой.
import numpy as np import cv2 import torch from anomalib.models import Patchcore, EfficientAD from ultralytics import YOLO from dataclasses import dataclass from typing import Optional @dataclass class FabricDefect: defect_type: str # hole / stain / broken_thread / weaving_error / scratch / fold severity: str # minor / major / critical bbox: list area_px2: int confidence: float location_pct: tuple # (x%, y%) - относительное положение class FabricDefectDetector: """ Двухуровневая детекция дефектов ткани: Level 1: Anomaly detection (PatchCore) — обучается только на хорошей ткани Level 2: Defect classification (YOLO) — если нужна классификация по типу AITEX Fabric Dataset: 7 типов дефектов, 12 видов тканей. TILDA: производственные дефекты, 8 классов. """ DEFECT_CLASSES = { 0: ('hole', 'critical'), 1: ('stain', 'major'), 2: ('broken_thread', 'major'), 3: ('weaving_error', 'major'), 4: ('scratch', 'minor'), 5: ('fold', 'minor'), 6: ('cut', 'critical'), 7: ('knotting', 'minor') } def __init__(self, anomaly_model_path: str, defect_model_path: Optional[str] = None, anomaly_threshold: float = 0.5, device: str = 'cuda'): self.anomaly_model = Patchcore.load_from_checkpoint(anomaly_model_path) self.anomaly_model.eval() self.anomaly_threshold = anomaly_threshold self.defect_model = YOLO(defect_model_path) if defect_model_path else None self.device = device # Трансформация для tile-based инспекции from torchvision import transforms self.transform = transforms.Compose([ transforms.Resize((256, 256)), transforms.ToTensor(), transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) ]) def inspect_fabric_strip(self, strip: np.ndarray, tile_size: int = 256, overlap: int = 32) -> dict: """ Инспекция полосы ткани (горизонтальный кадр с линейной камеры). Тайл-based обработка для скоростных линий. """ h, w = strip.shape[:2] from PIL import Image anomaly_map = np.zeros((h, w), dtype=np.float32) count_map = np.zeros((h, w), dtype=np.float32) stride = tile_size - overlap # Tile extraction tiles = [] tile_positions = [] for y in range(0, h - tile_size + 1, stride): for x in range(0, w - tile_size + 1, stride): tile = strip[y:y+tile_size, x:x+tile_size] pil_tile = Image.fromarray(cv2.cvtColor(tile, cv2.COLOR_BGR2RGB)) tensor = self.transform(pil_tile) tiles.append(tensor) tile_positions.append((x, y)) if not tiles: return {'defects': [], 'anomaly_score': 0, 'pass': True} # Batch inference batch = torch.stack(tiles) with torch.no_grad(): outputs = self.anomaly_model({'image': batch}) scores = outputs['pred_score'].cpu().numpy() anomaly_maps = outputs.get('anomaly_map') # Сборка общей карты аномалий for i, (x, y) in enumerate(tile_positions): if anomaly_maps is not None: am = anomaly_maps[i].cpu().numpy() am_resized = cv2.resize(am, (tile_size, tile_size)) anomaly_map[y:y+tile_size, x:x+tile_size] += am_resized count_map[y:y+tile_size, x:x+tile_size] += 1 # Нормализация count_map = np.maximum(count_map, 1) anomaly_map /= count_map # Обнаружение дефектных зон defects = self._extract_defects(anomaly_map, strip, w, h) overall_score = float(np.max(scores)) return { 'defects': [d.__dict__ for d in defects], 'anomaly_score': round(overall_score, 4), 'anomaly_map': anomaly_map, 'pass': overall_score < self.anomaly_threshold and len(defects) == 0 } def _extract_defects(self, anomaly_map: np.ndarray, original: np.ndarray, w: int, h: int) -> list[FabricDefect]: """Извлечение bbox дефектов из карты аномалий""" defects = [] if anomaly_map.max() < 0.3: return defects # Бинаризация карты аномалий norm_map = ((anomaly_map / anomaly_map.max()) * 255).astype(np.uint8) _, thresh = cv2.threshold(norm_map, int(self.anomaly_threshold * 255), 255, cv2.THRESH_BINARY) # Морфологическая чистка kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5)) cleaned = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel) cleaned = cv2.morphologyEx(cleaned, cv2.MORPH_OPEN, kernel) contours, _ = cv2.findContours(cleaned, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) for cnt in contours: area = cv2.contourArea(cnt) if area < 100: # слишком мелкие continue x, y, bw, bh = cv2.boundingRect(cnt) max_anomaly = float(anomaly_map[y:y+bh, x:x+bw].max()) severity = ('critical' if max_anomaly > 0.85 else 'major' if max_anomaly > 0.65 else 'minor') # Попытка классификации дефекта defect_type = 'unknown' if self.defect_model: crop = original[y:y+bh, x:x+bw] if crop.size > 0: results = self.defect_model(crop, conf=0.35, verbose=False) if results[0].boxes and len(results[0].boxes): cls_id = int(results[0].boxes.cls[0].item()) defect_type, severity = self.DEFECT_CLASSES.get( cls_id, ('unknown', severity) ) defects.append(FabricDefect( defect_type=defect_type, severity=severity, bbox=[x, y, x+bw, y+bh], area_px2=int(area), confidence=max_anomaly, location_pct=(round(x/w*100, 1), round(y/h*100, 1)) )) return defects Почему PatchCore лучше supervised подходов?
Supervised модели требуют тысячи размеченных дефектов — это дорого и долго. PatchCore использует anomaly detection: обучается только на хороших образцах, а аномалии находит как отклонения от эталона. На практике это означает:
- Сбор 500–1000 качественных изображений ткани (просто прокатить рулон под камерой).
- Дообучение на 100–200 кадров с дефектами, если нужна классификация.
- Экономия времени на разметку в 5–10 раз.
Сравните: ручная инспекция пропускает 15–25% дефектов и работает в 3–5 раз медленнее. AI-система стабильно держит recall > 95% на скоростях до 100 м/мин. Это в 2 раза быстрее человека и в 4 раза точнее. Экономия на рекламациях достигает $14k–20k в год.
Сбор датасетов для обучения
Для базового решения используем публичные датасеты AITEX и TILDA. Под каждый тип ткани клиента дообучаем модель на собранных образцах: 500–1000 изображений качественной ткани и 100–200 кадров с дефектами. Применяем аугментации (поворот, масштабирование, изменение яркости) для устойчивости к реальным условиям. Если дефектов мало — используем генерацию синтетических данных.Процесс внедрения
- Аудит производства — изучаем скорость линии, тип камер, освещение, доступные PLC.
- Сбор и разметка данных — снимаем 10–20 рулонов, размечаем все дефекты.
- Обучение модели — настраиваем PatchCore + YOLO на ваших данных.
- Интеграция — подключаем камеры, устанавливаем edge-сервер с GPU, пишем модуль для PLC.
- Тестирование — прогоняем 100 рулонов, замеряем recall и precision.
- Ввод в эксплуатацию — обучаем операторов, предоставляем документацию и поддержку.
| Задача | Срок |
|---|---|
| PatchCore инспектор одного типа ткани | 4–6 недель |
| Мульти-тип + классификация дефектов | 8–12 недель |
| Производственная линия + PLC интеграция | 12–20 недель |
Что входит в работу
- Готовая модель с весами и конфигурацией
- Исходный код кастомного детектора с комментариями
- Дашборд для мониторинга в реальном времени
- API для интеграции в вашу MES/ERP
- Обучение команды заказчика (3 дня)
- Гарантия 12 месяцев на работу модели при неизменных условиях
AI против ручной инспекции: сравнение
| Критерий | Ручная инспекция | AI-система |
|---|---|---|
| Процент проверки | 20–30% рулонов | 100% рулонов |
| Скорость | 20–40 м/мин | до 100 м/мин |
| Точность обнаружения | 75–85% | 95–97% |
| Пропуск дефектов | 15–25% | <5% |
| Усталость оператора | значительная через 2 часа | отсутствует |
| Стоимость эксплуатации | высокая (зарплаты, смены) | на 40% ниже |
Наши инженеры имеют 10+ лет опыта в компьютерном зрении и реализовали 50+ проектов в текстильной промышленности. Экономия на зарплатах и рекламациях окупает внедрение за 8–12 месяцев. Пропуск одного дефектного рулона — значительная потеря, которую система предотвращает в 95% случаев. Закажите внедрение и получите первые результаты через 6 недель. Свяжитесь с нами для оценки вашего производства — мы приедем на объект и рассчитаем окупаемость за две недели. Получите консультацию для старта проекта.







