AI-забезпечена детекція дефектів на виробництві через мобільну камеру
Візуальний контроль якості на виробничих цехах — це область, де мобільні пристрої конкурують безпосередньо зі стаціонарними системами машинного зору (Cognex, Keyence). Мобільна інспекція пропонує нижчу вартість, більшу гнучкість і виключає необхідність інтеграції у виробничу лінію, але створює відмінні технічні виклики: нестабільне освітлення, змінна відстань до об'єктів і вібрація від ручного утримання.
Виклик: специфіка промислового контролю якості
Виробничі дефекти різко відрізняються залежно від галузі та типу продукції:
| Галузь | Типові дефекти | Критичний розмір |
|---|---|---|
| Друковані плати (PCB) | Відсутність компонента, неправильна орієнтація, дефекти припою | 0.5–2 мм |
| Текстиль | Затяжки, мікротори, розрив нитки | 1–5 мм |
| Сталь та металопродукція | Подряпини, пористість, включення | 0.1–3 мм |
| Скло/керамік | Сколи, тріщини, бульбашки | 0.5–10 мм |
| Упаковка | Відсутня етикетка, дефекти друку | >5 мм |
Кожна галузь потребує власної спеціалізованої моделі. Універсальні моделі дефектів не працюють: те, що є дефектом на PCB, може бути прийнятним на металі.
Архітектура on-device інференцу
Для виробничого розгортання on-device обробка є найважливішою. Залежність від інтернету неприйнятна на цеху. Розмір моделі обмежений RAM пристрою, а швидкість інференцу має відповідати вимогам виробничої пропускної здатності.
// iOS: промислова детекція дефектів через CoreML
class DefectDetectionEngine {
private let model: VNCoreMLModel
private var confidenceThreshold: Float = 0.5 // налаштовується на місцях
private var iouThreshold: Float = 0.45
// Окрема черга для стабільного FPS
private let inferenceQueue = DispatchQueue(
label: "defect.inference",
qos: .userInteractive
)
func analyze(sampleBuffer: CMSampleBuffer) async throws -> [DefectDetection] {
guard let pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) else {
throw DefectError.invalidFrame
}
return try await withCheckedThrowingContinuation { continuation in
inferenceQueue.async {
let request = VNCoreMLRequest(model: self.model) { req, error in
if let error = error {
continuation.resume(throwing: error)
return
}
let detections = (req.results as? [VNRecognizedObjectObservation])?
.filter { $0.confidence >= self.confidenceThreshold }
.map { obs in
DefectDetection(
type: DefectType(rawValue: obs.labels.first?.identifier ?? "") ?? .unknown,
confidence: obs.confidence,
boundingBox: obs.boundingBox, // нормалізований [0,1]
severity: self.classifySeverity(obs)
)
} ?? []
continuation.resume(returning: detections)
}
request.imageCropAndScaleOption = .scaleFill
let handler = VNImageRequestHandler(cvPixelBuffer: pixelBuffer)
try? handler.perform([request])
}
}
}
}
Показники продуктивності. YOLOv8n у CoreML на iPhone 14 досягає приблизно 15 мс на інференц (66 FPS потенціалу). YOLOv8s: ~25 мс. Для виробничих ліній, що вимагають >30 кадрів/сек при ручному утриманні, рекомендується нано-варіант.
Стабілізація зображення для ручного сканування
Тремор рук шкодить виявленню дрібних дефектів. Кілька методик цього уникають:
// Буферизація кадрів + вибір найчіткішого кадру
class StabilizedFrameSelector {
private var frameBuffer: RingBuffer<CMSampleBuffer> = RingBuffer(capacity: 8)
private var sharpnessScores: [Float] = []
func addFrame(_ buffer: CMSampleBuffer) {
let sharpness = computeLaplacianVariance(buffer)
frameBuffer.push(buffer)
sharpnessScores.append(sharpness)
}
// Для аналізу вибираємо кадр з піковою чіткістю з останніх N кадрів
var bestFrame: CMSampleBuffer? {
guard let maxIdx = sharpnessScores.indices.max(by: { sharpnessScores[$0] < sharpnessScores[$1] }) else { return nil }
return frameBuffer[maxIdx]
}
}
Крім того: налаштуйте AVCaptureDevice.activeVideoMinFrameDuration, встановіть exposureMode = .continuousAutoExposure та увімкніть стабілізацію відео через videoStabilizationMode = .cinematic.
Навчання та дообучення моделі на виробничих даних
Не існує готових датасетів для галузево-специфічних виробничих дефектів. Потрібна користувацька анотація.
Робочий процес:
- Захопіть 200–500 зразків на цеху (нормальні + дефектні зразки)
- Анотуйте у Label Studio або CVAT (обмежуючі прямокутники + класи дефектів)
- Застосуйте аугментацію: яскравість ±30%, поворот ±15°, горизонтальне відображення, гаусівський шум для імітації реальних умов захоплення
- Навчіть YOLOv8s/m залежно від вимог швидкості
- Конвертуйте в CoreML (.mlpackage) або TFLite формат
- Виконайте ітеративне дообучення на виробничих помилках — зазвичай кожні 2–4 тижні
# Дообучення на нових виробничих даних
from ultralytics import YOLO
model = YOLO("defect_detection_v2.pt") # попередня версія як база
results = model.train(
data="production_defects.yaml",
epochs=50,
imgsz=640,
batch=16,
lr0=0.001, # нижчий коефіцієнт навчання для дообучення
freeze=10, # заморозити перші 10 шарів backbone
augment=True,
hsv_h=0.015,
hsv_s=0.7,
degrees=10.0,
translate=0.1,
scale=0.5,
mosaic=1.0
)
Інтеграція з виробничими системами
Мобільний інспектор повинен записувати результати у MES/ERP систему об'єкта:
// Android: надсилання результатів інспекції
data class InspectionResult(
val productId: String,
val batchId: String,
val inspectorId: String,
val timestamp: Instant,
val detections: List<DefectDetection>,
val verdict: InspectionVerdict, // PASS, FAIL, REVIEW
val imageUrl: String, // збережене фото з анотаціями
val deviceId: String
)
suspend fun submitInspection(result: InspectionResult) {
// Спочатку локальна черга (цех може не мати Wi-Fi)
localQueue.enqueue(result)
// Синхронізація при появі мережі
syncManager.triggerSync()
}
Архітектура offline-first критично важлива: цехове Wi-Fi часто ненадійне, а втрата результатів інспекції неприйнятна.
Кошторис за часом
MVP з базовою моделлю (200–300 анотованих зразків), on-device інференцем та локальною історією інспекцій займає 3–4 тижні. Повна система з дообученою моделлю для конкретного виробничого процесу, стабілізацією зображення, offline-first синхронізацією MES/ERP, дашбордом статистики дефектів та підтримкою iOS + Android вимагає 2–3 місяців.







