Standard machine vision systems (Cognex, Keyence) are effective but expensive and rigidly tied to the line. A mobile inspector based on AI is a flexible alternative: cheaper, more mobile, no equipment rearrangement required. However, new engineering challenges arise: unstable lighting, variable distance to the object, vibration from handheld capture. We solve them with on-device AI tailored to your process. With over 5 years of experience in industrial computer vision and 30+ implementations on production lines, savings of up to 40% compared to off-the-shelf systems are not uncommon. Contact us for a consultation — we'll help you choose the optimal solution.
AI Defect Detection via Mobile App Camera: Technical Challenges
Every millisecond counts, and internet in the workshop is a luxury. On-device inference eliminates latency and network dependency. Model size is limited by device RAM, speed by throughput requirements.
// iOS: industrial defect detection via CoreML
class DefectDetectionEngine {
private let model: VNCoreMLModel
private var confidenceThreshold: Float = 0.5 // adjustable on the test stand
private var iouThreshold: Float = 0.45
// Dedicated queue for stable 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, // normalized [0,1]
severity: self.classifySeverity(obs)
)
} ?? []
continuation.resume(returning: detections)
}
request.imageCropAndScaleOption = .scaleFill
let handler = VNImageRequestHandler(cvPixelBuffer: pixelBuffer)
try? handler.perform([request])
}
}
}
}
Performance. YOLOv8n in CoreML on iPhone 14: ~15 ms per inference (66 FPS potential). YOLOv8s: ~25 ms. For a line requiring >30 frames/sec with handheld capture — choose the n-variant.
Image Stabilization for Handheld Scanning — AI Defect Detection
Hand vibration is the enemy of small defects. Several techniques: frame buffering with sharpness selection (Laplacian), automatic exposure, optical stabilization if available.
// Frame buffering + selecting the sharpest frame
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)
}
// For analysis — take the frame with peak sharpness from the last N frames
var bestFrame: CMSampleBuffer? {
guard let maxIdx = sharpnessScores.indices.max(by: { sharpnessScores[$0] < sharpnessScores[$1] }) else { return nil }
return frameBuffer[maxIdx]
}
}
Also: AVCaptureDevice.activeVideoMinFrameDuration + exposureMode = .continuousAutoExposure + stabilization via videoStabilizationMode = .cinematic.
How to Fine-Tune the Model on Real Data?
Ready-made datasets for specific production are unavailable. You need your own labeling. The process:
- Capture 200–500 samples on the production line (normal + defective)
- Label in Label Studio or CVAT (bounding boxes + defect classes)
- Augmentation: brightness ±30%, rotation ±15°, horizontal flip, Gaussian noise — simulating real shooting conditions
- Train YOLOv8s/m (depending on speed requirements)
- Convert to CoreML (.mlpackage) or TFLite
- Iterative fine-tuning on production errors — every 2–4 weeks
# Fine-tuning on new production data
from ultralytics import YOLO
model = YOLO("defect_detection_v2.pt") # previous version as base
results = model.train(
data="production_defects.yaml",
epochs=50,
imgsz=640,
batch=16,
lr0=0.001, # lower LR for fine-tuning
freeze=10, # freeze first 10 layers of backbone
augment=True,
hsv_h=0.015,
hsv_s=0.7,
degrees=10.0,
translate=0.1,
scale=0.5,
mosaic=1.0
)
Every 2–4 weeks we fine-tune the model on new production data, increasing accuracy up to 98%. Contact us for an audit of your data — we'll estimate the required labeling volume.
How Do We Integrate the Solution with Your Systems?
The mobile inspector must record results in the MES/ERP system. We use an offline-first approach: first local storage in Room/CoreData, then synchronization via REST/GraphQL when a network connection appears. This guarantees no inspection is lost.
// Android: sending inspection result
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, // saved photo with annotations
val deviceId: String
)
suspend fun submitInspection(result: InspectionResult) {
// First — local queue (production may be without Wi-Fi)
localQueue.enqueue(result)
// Sync when network appears
syncManager.triggerSync()
}
Offline-first is critically important: workshop Wi-Fi is unstable, loss of an inspection result is unacceptable.
Challenge: Specifics of Industrial Quality Control
Defects in production vary drastically by industry. Below are examples of the most common cases.
| Industry | Typical Defects | Critical Size |
|---|---|---|
| PCBs | Missing component, wrong orientation, solder joint | 0.5–2 mm |
| Textiles | Snags, punctures, yarn break | 1–5 mm |
| Rolled metal | Scratches, pores, inclusions | 0.1–3 mm |
| Glass/ceramics | Chips, cracks, bubbles | 0.5–10 mm |
| Packaging | Missing label, incorrect printing | >5 mm |
For each industry — its own model. A universal defect model doesn't work: what is a defect on a PCB may be normal on metal.
What Does Our Work Include?
| Component | Description |
|---|---|
| Model training | 200–500 labeled samples, augmentation, fine-tuning for your defects |
| Mobile app | iOS/Android (CoreML/TFLite), on-device inference, frame stabilization |
| Offline sync | Local storage with automatic sync when network appears |
| Integration | REST/GraphQL API to send results to MES/ERP |
| Support | Model warranty, fine-tuning every 2–4 weeks, technical support |
All components are configured for your production processes.
Timeline Estimates
MVP with a baseline model (200–300 labeled samples), on-device inference, local inspection history — 3–4 weeks. Full system with a fine-tuned model for a specific production process, image stabilization, offline-first sync with MES/ERP, defect statistics dashboard, and support for iOS + Android — 2–3 months. Exact cost is calculated individually after an audit of your production.
Payback for such a solution is less than 6 months due to reduced scrap and faster inspection. Contact us for a free evaluation of your project. Order a pilot implementation today.
According to Apple's documentation, on-device inference ensures privacy and speed.







