Vision est un framework de vision par ordinateur d’Apple, présenté pour la première fois dans iOS 11 en 2017. Vision fournit des algorithmes prêts à l’emploi pour la détection des visages, la reconnaissance de texte (OCR), la détection de codes-barres, le suivi d’objets, la classification d’images et l’analyse de contours — le tout exécuté sur l’appareil à l’aide du Neural Engine. Selon Apple WWDC 2023, Vision est utilisé dans l’application Photos standard pour la reconnaissance des visages et dans l’appareil photo pour la détection de texte en temps réel sur iPhone et iPad.
Points clés
Vision est un framework de vision par ordinateur de haut niveau qui abstrait les algorithmes complexes d’apprentissage automatique derrière une API de requête simple (VNRequest). Le développeur n’a pas besoin de comprendre les réseaux de neurones convolutifs — il suffit de créer le type de requête approprié, de passer une image et d’obtenir le résultat.
L’architecture de Vision suit le principe Requête → Gestionnaire → Résultat : VNImageRequestHandler accepte une image, exécute VNRequest et renvoie un tableau d’VNObservation avec les résultats. Cela permet de combiner plusieurs requêtes sur une seule image — par exemple, détecter simultanément des visages et du texte dans une photo.
Vision prend en charge iOS 11+ et macOS 10.13+. L’accélération matérielle via Neural Engine nécessite une puce A12 Bionic ou plus récente. Sur les appareils avec A17 Pro et série M, Vision traite jusqu’à 60 images par seconde pour la vidéo en streaming.
Avantage clé de Vision : la confidentialité totale : tous les calculs sont effectués sur l’appareil, les images ne sont jamais envoyées à un serveur. Cela permet d’utiliser le framework dans des applications traitant des données sensibles, comme des applications médicales ou bancaires.
VNDetectFaceRectanglesRequest est la requête de base de Vision pour détecter les visages dans une image. Elle renvoie les coordonnées des rectangles englobant chaque visage, sans identifier une personne spécifique.
Pour une analyse plus détaillée, utilisez VNDetectFaceLandmarksRequest, qui identifie les points clés du visage : yeux, sourcils, nez, bouche, contour de la mâchoire. Ces données sont utilisées pour superposer des masques, animer des émojis et des filtres en temps réel (comme dans FaceTime et 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 contient non seulement boundingBox, mais aussi confidence (confiance de 0 à 1) et landmarks — un tableau de points du visage si la requête était VNDetectFaceLandmarksRequest. Une confiance inférieure à 0,5 indique généralement un faux positif — ces résultats doivent être rejetés.
Vision prend également en charge VNDetectFaceCaptureQualityRequest, qui évalue la qualité de l’image du visage : éclairage, netteté, angle de rotation. C’est utile pour sélectionner la meilleure image lors de l’inscription d’un utilisateur ou pour créer un avatar.
VNRecognizeTextRequest est le moteur OCR intégré d’Apple, présenté dans iOS 13. Il reconnaît le texte imprimé dans les images avec la prise en charge de 13 langues : anglais, russe, chinois, japonais, coréen, italien, allemand, espagnol, portugais, français, arabe, vietnamien et thaï.
VNRecognizeTextRequest prend en charge deux niveaux de précision : .fast (rapide, pour du texte simple sur fond contrasté) et .accurate (précis, pour des scènes complexes avec différentes polices et angles). .fast est 3 à 5 fois plus rapide, mais traite moins efficacement le texte manuscrit et les polices non standard.
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 propriété usesLanguageCorrection active la correction du texte reconnu à l’aide d’un modèle de langue. Cela améliore la précision de l’anglais de 10 à 15% mais augmente le temps de traitement. La correction pour le russe est également disponible lorsque la reconnaissance appropriée est spécifiée.
Selon Apple ML Research 2022, VNRecognizeTextRequest au niveau .accurate atteint une précision de 96% pour les photos nettes de documents en anglais et d’environ 88% pour le russe. Pour le texte sur les emballages, les enseignes et les écrans, la précision tombe à 75–85%.
| Niveau de reconnaissance | Vitesse | Précision (anglais) | Support russe |
|---|---|---|---|
| .fast | 0,1–0,3 s | ~85% | Oui |
| .accurate | 0,3–1,0 s | ~96% | Oui |
VNDetectBarcodesRequest — une requête Vision pour détecter et décoder les codes-barres et QR codes dans les images. Tous les formats principaux sont pris en charge : EAN-8, EAN-13, UPC-A, UPC-E, Code 39, Code 93, Code 128, PDF417, Aztec et QR.
Contrairement à AVFoundation (AVCaptureMetadataOutput), Vision fonctionne non seulement avec les flux vidéo mais aussi avec les images statiques — permettant de scanner des codes à partir de photos existantes ou de captures d’écran. Vision détermine également le boundingBox du code avec une précision au pixel près, ce qui est pratique pour animer un cadre autour du code détecté.
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 contient payloadStringValue (contenu décodé), symbology (type de code) et confidence. Pour les QR codes, le contenu peut être une URL, du texte ou du JSON. Pour EAN/UPC, un code produit numérique est renvoyé, qui peut être utilisé pour rechercher l’article dans une base de données.
Vision peut traiter plusieurs codes-barres sur une seule image — le tableau observations contient un objet pour chaque code détecté. Ceci est utile pour scanner des lots de produits ou des documents avec plusieurs codes-barres.
VNDetectObjectAtPointRequest et VNSequenceRequestHandler sont des outils Vision pour suivre des objets dans un flux vidéo. Le premier identifie un objet par le point de toucher de l’utilisateur, le second suit un objet entre les images vidéo.
VNSequenceRequestHandler accepte une séquence d’images (images vidéo) et renvoie la position mise à jour de l’objet suivi pour chaque image. Ceci est utilisé dans les applications de réalité augmentée, les éditeurs vidéo et les systèmes de surveillance.
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
// Mettre à jour la position de l’objet à l’écran
}
VNTrackObjectRequest utilise un algorithme de suivi basé sur le flux optique — il ne réentraîne pas le détecteur sur chaque image mais calcule le déplacement de l’objet par rapport à sa position précédente. Cela permet un fonctionnement en temps réel même sur les appareils sans Neural Engine.
Limitation : le suivi peut perdre l’objet lors de mouvements rapides, d’occlusion ou de changements brusques d’éclairage. Apple recommande de redémarrer la détection (VNDetectObjectAtPointRequest) toutes les 10 à 15 images pour corriger le suivi.
VNClassifyImageRequest est le modèle intégré de Vision pour la classification d’images en 1 000 catégories (modèle ResNet-50 entraîné sur ImageNet). La requête renvoie un tableau de VNClassificationObservation avec le nom de la catégorie et la confiance.
VNDetectContoursRequest effectue une analyse des contours de l’image — extrait les limites des objets, utile pour la segmentation, le contouring et le prétraitement avant reconnaissance. La requête renvoie un tableau de points décrivant chaque contour dans l’image.
import Vision
// Classification d’images
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 fonctionne bien pour les catégories générales (chat, chien, voiture, nourriture) mais n’est pas adapté aux objets spécifiques — pour ceux-ci, vous devez entraîner un modèle Core ML personnalisé et utiliser VNCoreMLRequest. Le modèle d’Apple est optimisé pour les appareils mobiles et ne prend que 5 Mo.
VNDetectContoursRequest renvoie les contours sous forme de tableau de points avec le type de contour (externe, interne, trou). Cette requête est utilisée pour le prétraitement d’images avant OCR (amélioration du contraste du texte), pour dessiner des effets (contourage d’objets) et pour l’analyse de formes.
| Requête Vision | Objectif | Version iOS |
|---|---|---|
| VNDetectFaceRectanglesRequest | Détection de visages dans les images | iOS 11 |
| VNRecognizeTextRequest | Reconnaissance de texte (OCR) | iOS 13 |
| VNDetectBarcodesRequest | Détection de codes-barres et QR | iOS 11 |
| VNClassifyImageRequest | Classification d’images | iOS 13 |
| VNDetectContoursRequest | Analyse de contours | iOS 14 |
| VNTrackObjectRequest | Suivi d’objets | iOS 11 |
Questions fréquentes
Vision fournit des algorithmes prêts à l’emploi (détection de visages, OCR, codes-barres) sans entraînement de modèle. Core ML est le moteur d’exécution de modèles personnalisés. Vision + VNCoreMLRequest permettent d’exécuter des modèles Core ML dans le pipeline Vision, obtenant le meilleur des deux mondes : les détecteurs prêts de Vision + la classification personnalisée de Core ML.
Oui, Vision prend en charge le traitement de flux vidéo en temps réel via VNSequenceRequestHandler pour le suivi et AVCaptureVideoDataOutput pour le traitement image par image. Sur les appareils avec A12+ et Neural Engine, Vision traite jusqu’à 60 ips pour la détection des visages. Pour les tâches lourdes (OCR, classification), il est recommandé de traiter une image toutes les 5 à 10 images.
VNRecognizeTextRequest prend en charge 13 langues : anglais, russe, chinois (simplifié et traditionnel), japonais, coréen, italien, allemand, espagnol, portugais, français, arabe, vietnamien et thaï. Pour reconnaître plusieurs langues dans une seule image, spécifiez un tableau dans la propriété recognitionLanguages.
Oui, via VNCoreMLRequest. Vous créez un modèle Core ML encapsulé dans VNCoreMLModel et le transmettez à VNCoreMLRequest. Vision gère automatiquement le prétraitement de l’image (mise à l’échelle, recadrage) et l’alimente dans le modèle Core ML. Le résultat est renvoyé sous forme de VNCoreMLFeatureValueObservation avec les données de sortie du modèle.
Non, Vision effectue toute l’analyse entièrement sur l’appareil. Les images ne quittent jamais l’appareil de l’utilisateur. C’est l’architecture fondamentale d’Apple : tous les frameworks ML (Vision, NaturalLanguage, Core ML, Speech) fonctionnent sur l’appareil pour garantir la confidentialité. Aucune donnée n’est envoyée aux serveurs d’Apple.
Résumé
Nous développerons une application mobile clé en main
IT Sectr crée des applications iOS et Android pour les startups et les entreprises depuis 2017. Nous vous conseillerons et vous proposerons la meilleure solution.
Lisez aussi