Vision è un framework di visione artificiale di Apple, presentato per la prima volta in iOS 11 nel 2017. Vision fornisce algoritmi pronti per il rilevamento dei volti, il riconoscimento del testo (OCR), il rilevamento di codici a barre, il tracciamento di oggetti, la classificazione delle immagini e l'analisi dei contorni — tutto eseguito sul dispositivo utilizzando il Neural Engine. Secondo Apple WWDC 2023, Vision viene utilizzato nell'app Foto standard per il riconoscimento facciale e nell'app Fotocamera per il rilevamento del testo in tempo reale su iPhone e iPad.
Punti chiave
Vision è un framework di visione artificiale di alto livello che astrae algoritmi complessi di apprendimento automatico dietro una semplice API di richieste (VNRequest). Lo sviluppatore non ha bisogno di capire le reti neurali convolutive — basta creare il tipo di richiesta appropriato, passare un'immagine e ottenere il risultato.
L'architettura di Vision segue il principio Richiesta → Gestore → Risultato: VNImageRequestHandler accetta un'immagine, esegue VNRequest e restituisce un array di VNObservation con i risultati. Ciò consente di combinare più richieste su una singola immagine — ad esempio, rilevare simultaneamente volti e testo in una foto.
Vision supporta iOS 11+ e macOS 10.13+. L'accelerazione hardware tramite Neural Engine richiede un chip A12 Bionic o successivo. Su dispositivi con A17 Pro e serie M, Vision elabora fino a 60 fotogrammi al secondo per video in streaming.
Vantaggio principale di Vision è la privacy completa: tutti i calcoli vengono eseguiti sul dispositivo, le immagini non vengono mai inviate a un server. Ciò consente di utilizzare il framework in applicazioni che gestiscono dati sensibili, come app mediche o bancarie.
VNDetectFaceRectanglesRequest è la richiesta base di Vision per rilevare volti in un'immagine. Restituisce le coordinate dei rettangoli che delimitano ogni volto, senza identificare una persona specifica.
Per un'analisi più dettagliata, utilizzare VNDetectFaceLandmarksRequest, che identifica i punti chiave del volto: occhi, sopracciglia, naso, bocca, contorno della mascella. Questi dati vengono utilizzati per applicare maschere, animare emoji e filtri in tempo reale (come in FaceTime e Snapchat).
import Vision
import UIKit
guard let image = UIImage(named: "photo") else { return }
let request = VNDetectFaceRectanglesRequest()
let handler = VNImageRequestHandler(cgImage: image.cgImage!, options: [:])
try handler.perform([request])
for observation in request.results ?? [] {
let bbox = observation.boundingBox
print("Face at x=\\(bbox.origin.x), y=\\(bbox.origin.y)")
}
VNFaceObservation contiene non solo boundingBox, ma anche confidence (fiducia da 0 a 1) e landmarks — un array di punti del volto se la richiesta era VNDetectFaceLandmarksRequest. Una confidence inferiore a 0,5 indica generalmente un falso positivo — tali risultati dovrebbero essere scartati.
Vision supporta anche VNDetectFaceCaptureQualityRequest, che valuta la qualità dell'immagine del volto: illuminazione, nitidezza, angolo di rotazione. Ciò è utile per selezionare il fotogramma migliore durante la registrazione dell'utente o per creare un avatar.
VNRecognizeTextRequest è il motore OCR integrato di Apple, introdotto in iOS 13. Riconosce il testo stampato nelle immagini con supporto per 13 lingue: inglese, russo, cinese, giapponese, coreano, italiano, tedesco, spagnolo, portoghese, francese, arabo, vietnamita e tailandese.
VNRecognizeTextRequest supporta due livelli di precisione: .fast (veloce, per testo semplice su sfondo contrastante) e .accurate (preciso, per scene complesse con caratteri e angoli diversi). .fast è 3–5 volte più veloce, ma gestisce il testo scritto a mano e i caratteri non standard in modo meno efficace.
import Vision
let textRequest = VNRecognizeTextRequest { request, _ in
guard let observations = request.results as? [VNRecognizedTextObservation]
else { return }
for observation in observations {
let topCandidate = observation.topCandidates(1).first
print(topCandidate?.string ?? "")
}
}
textRequest.recognitionLevel = .accurate
textRequest.usesLanguageCorrection = true
La proprietà usesLanguageCorrection attiva la correzione del testo riconosciuto utilizzando un modello linguistico. Ciò migliora la precisione per l'inglese del 10–15% ma aumenta il tempo di elaborazione. La correzione per il russo è disponibile anche quando viene specificato il riconoscimento appropriato.
Secondo Apple ML Research 2022, VNRecognizeTextRequest al livello .accurate raggiunge una precisione del 96% per foto nitide di documenti in inglese e circa l'88% per il russo. Per il testo su imballaggi, insegne e schermi, la precisione scende al 75–85%.
| Livello di riconoscimento | Velocità | Precisione (inglese) | Supporto russo |
|---|---|---|---|
| .fast | 0,1–0,3 s | ~85% | Sì |
| .accurate | 0,3–1,0 s | ~96% | Sì |
VNDetectBarcodesRequest — una richiesta Vision per rilevare e decodificare codici a barre e QR code nelle immagini. Tutti i formati principali sono supportati: EAN-8, EAN-13, UPC-A, UPC-E, Code 39, Code 93, Code 128, PDF417, Aztec e QR.
A differenza di AVFoundation (AVCaptureMetadataOutput), Vision funziona non solo con flussi video ma anche con immagini statiche — consentendo di scansionare codici da foto esistenti o screenshot. Vision determina anche il boundingBox del codice con precisione al pixel, comodo per animare una cornice attorno al codice rilevato.
import Vision
let barcodeRequest = VNDetectBarcodesRequest { request, _ in
guard let observations = request.results as? [VNBarcodeObservation]
else { return }
for observation in observations {
let payload = observation.payloadStringValue ?? ""
print("Barcode: \\(payload), Symbology: \\(observation.symbology.rawValue)"
}
}
VNBarcodeObservation contiene payloadStringValue (contenuto decodificato), symbology (tipo di codice) e confidence. Per i QR code, il payload può essere un URL, testo o JSON. Per EAN/UPC, viene restituito un codice prodotto numerico che può essere utilizzato per cercare l'articolo in un database.
Vision può elaborare più codici a barre in una singola immagine — l'array observations contiene un oggetto per ogni codice rilevato. Ciò è utile per scansionare lotti di prodotti o documenti con più codici a barre.
VNDetectObjectAtPointRequest e VNSequenceRequestHandler — strumenti di Vision per tracciare oggetti in un flusso video. Il primo identifica un oggetto dal punto di tocco dell'utente, il secondo traccia un oggetto tra i fotogrammi video.
VNSequenceRequestHandler accetta una sequenza di immagini (fotogrammi video) e restituisce la posizione aggiornata dell'oggetto tracciato per ogni fotogramma. Ciò viene utilizzato in app di realtà aumentata, editor video e sistemi di sorveglianza.
import Vision
let trackingRequest = VNTrackObjectRequest(detectedObjectObservation: initialObservation)
let sequenceHandler = VNSequenceRequestHandler()
for frame in videoFrames {
try sequenceHandler.perform([trackingRequest],
on: frame.cgImage!)
let newBBox = trackingRequest.results?.first?.boundingBox
// Aggiorna posizione oggetto sullo schermo
}
VNTrackObjectRequest utilizza un algoritmo di tracciamento basato su flusso ottico — non riaddestra il rilevatore su ogni fotogramma ma calcola lo spostamento dell'oggetto rispetto alla sua posizione precedente. Ciò consente prestazioni in tempo reale anche su dispositivi senza Neural Engine.
Limitazione: il tracciamento può perdere l'oggetto durante movimenti rapidi, occlusioni o cambiamenti improvvisi di illuminazione. Apple consiglia di riavviare il rilevamento (VNDetectObjectAtPointRequest) ogni 10–15 fotogrammi per la correzione del tracciamento.
VNClassifyImageRequest è il modello integrato di Vision per la classificazione delle immagini in 1.000 categorie (modello ResNet-50 addestrato su ImageNet). La richiesta restituisce un array di VNClassificationObservation con il nome della categoria e la confidenza.
VNDetectContoursRequest esegue l'analisi dei contorni dell'immagine — estrae i confini degli oggetti, utile per segmentazione, delineamento e pre-elaborazione prima del riconoscimento. La richiesta restituisce un array di punti che descrivono ogni contorno nell'immagine.
import Vision
// Classificazione immagini
let classificationRequest = VNClassifyImageRequest { request, _ in
guard let results = request.results as? [VNClassificationObservation]
else { return }
let topMatch = results.prefix(3).filter { $0.confidence > 0.3 }
for match in topMatch {
print("\\(match.identifier): \\(match.confidence)"
}
}
VNClassifyImageRequest funziona bene per categorie generali (gatto, cane, macchina, cibo) ma non è adatto per oggetti specifici — per questi, è necessario addestrare un modello Core ML personalizzato e utilizzare VNCoreMLRequest. Il modello di Apple è ottimizzato per dispositivi mobili e occupa solo 5 MB.
VNDetectContoursRequest restituisce i contorni come array di punti con il tipo di contorno (esterno, interno, foro). Questa richiesta viene utilizzata per la pre-elaborazione delle immagini prima dell'OCR (miglioramento del contrasto del testo), per disegnare effetti (delineamento di oggetti) e per l'analisi delle forme.
| Richiesta Vision | Scopo | Versione iOS |
|---|---|---|
| VNDetectFaceRectanglesRequest | Ricerca volti nelle immagini | iOS 11 |
| VNRecognizeTextRequest | Riconoscimento testo (OCR) | iOS 13 |
| VNDetectBarcodesRequest | Rilevamento codici a barre e QR | iOS 11 |
| VNClassifyImageRequest | Classificazione immagini | iOS 13 |
| VNDetectContoursRequest | Analisi contorni | iOS 14 |
| VNTrackObjectRequest | Tracciamento oggetti | iOS 11 |
Domande frequenti
Vision fornisce algoritmi pronti (rilevamento volti, OCR, codici a barre) senza addestramento del modello. Core ML è il motore per eseguire modelli personalizzati. Vision + VNCoreMLRequest consentono di eseguire modelli Core ML nella pipeline di Vision, ottenendo il meglio di entrambi i mondi: rilevatori pronti di Vision + classificazione personalizzata di Core ML.
Sì, Vision supporta l'elaborazione del flusso video in tempo reale tramite VNSequenceRequestHandler per il tracciamento e AVCaptureVideoDataOutput per l'elaborazione fotogramma per fotogramma. Su dispositivi con A12+ e Neural Engine, Vision elabora fino a 60 fps per il rilevamento dei volti. Per attività pesanti (OCR, classificazione), si consiglia di elaborare ogni 5–10 fotogramma.
VNRecognizeTextRequest supporta 13 lingue: inglese, russo, cinese (semplificato e tradizionale), giapponese, coreano, italiano, tedesco, spagnolo, portoghese, francese, arabo, vietnamita e tailandese. Per riconoscere più lingue in una singola immagine, specificare un array nella proprietà recognitionLanguages.
Sì, tramite VNCoreMLRequest. Si crea un modello Core ML avvolto in VNCoreMLModel e lo si passa a VNCoreMLRequest. Vision gestisce automaticamente la pre-elaborazione dell'immagine (ridimensionamento, ritaglio) e la inserisce nel modello Core ML. Il risultato viene restituito come VNCoreMLFeatureValueObservation con i dati di output del modello.
No, Vision esegue tutta l'analisi interamente sul dispositivo. Le immagini non lasciano mai il dispositivo dell'utente. Questa è l'architettura fondamentale di Apple: tutti i framework ML (Vision, NaturalLanguage, Core ML, Speech) funzionano on-device per garantire la privacy. Nessun dato viene inviato ai server Apple.
Riepilogo
Svilupperemo un'applicazione mobile chiavi in mano
IT Sectr crea applicazioni iOS e Android per startup e aziende dal 2017. Ti consulteremo e ti proporremo la soluzione migliore.
Leggi anche