VNRequest — définition, fonctionnement des requêtes Vision dans iOS

Auteur : IT Sectr Publié le : 2026-07-20 Temps de lecture : 8 min

VNRequest est une classe de base abstraite du framework Vision qui représente une unité d’analyse d’image ou de flux vidéo. Chaque type d’analyse — détection de visages, reconnaissance de texte, recherche de codes-barres, classification — est implémenté comme une sous-classe concrète de VNRequest. Selon la documentation Apple Developer (2024), un développeur crée une instance de requête, configure ses paramètres, transmet une image via VNImageRequestHandler et reçoit les résultats sous forme de tableau VNObservation.

Points Clés

  • VNRequest — la classe de base pour toutes les requêtes Vision : analyse d’images, vidéo et modèles ML.
  • Une requête est exécutée via VNImageRequestHandler (image) ou VNSequenceRequestHandler (vidéo).
  • Les résultats sont renvoyés sous forme de tableau VNObservation — chaque sous-classe contient des données spécifiques.
  • Completion handler permet de traiter les résultats de manière asynchrone après la fin de l’analyse.
  • Plusieurs requêtes peuvent être exécutées avec un seul appel de handler.perform() pour une image.

Qu’est-ce que VNRequest dans Vision ?

VNRequest est un élément fondamental de l’architecture Vision, implémentant le modèle Requête-Réponse pour l’analyse d’images et de vidéos. Chaque sous-classe de VNRequest est responsable d’une tâche spécifique de vision par ordinateur : détection de visages, reconnaissance de texte, classification de contenu.

L’architecture VNRequest sépare « ce qu’il faut analyser » (la requête) de « comment traiter » (le gestionnaire). Le développeur configure la requête (type d’analyse, paramètres supplémentaires) et la transmet au gestionnaire avec l’image. Le gestionnaire exécute la requête et renvoie les résultats sans exiger que le développeur comprenne les algorithmes ML internes.

Toutes les sous-classes de VNRequest suivent une structure unifiée : initialisation avec un completion handler optionnel, configuration des propriétés (région d’intérêt, niveau de précision) et transmission au gestionnaire. Cela rend l’API prévisible et facilement extensible — ajouter un nouveau type d’analyse signifie créer une nouvelle sous-classe de VNRequest.

swift
import Vision

// 1. Créer la requête
let request = VNDetectFaceRectanglesRequest { req, _ in
    // 3. Traiter les résultats
    guard let faces = req.results as? [VNFaceObservation]
    else { return }
    print("Found \\(faces.count) faces")
}

// 2. Exécuter via le gestionnaire
let handler = VNImageRequestHandler(cgImage: cgImage, options: [:])
try handler.perform([request])

Propriétés clés de VNRequest : regionOfInterest (zone d’intérêt sur l’image pour accélérer l’analyse), preferBackgroundProcessing (mode arrière-plan), revision (version de l’algorithme) et cancellationSupport. Une configuration appropriée de ces propriétés permet d’optimiser les performances pour une tâche spécifique.

Selon Apple WWDC 2024, en 7 années d’existence de Vision, le nombre de sous-classes VNRequest disponibles est passé de 8 (iOS 11) à plus de 25 (iOS 18), couvrant toutes les tâches principales de vision par ordinateur sur les appareils mobiles.

Principaux Types de VNRequest pour l’Analyse

Vision comprend plus de 25 sous-classes VNRequest divisées en catégories : détection, reconnaissance, suivi et classification. Chaque sous-classe hérite de VNRequest et ajoute des propriétés spécifiques à la tâche.

Détection et Reconnaissance

VNDetectFaceRectanglesRequest — détection de visages dans les images. Renvoie VNFaceObservation avec les coordonnées du bounding box et la confiance. VNDetectHumanRectanglesRequest — similaire pour les personnes. VNDetectHumanBodyPoseRequest — estimation de la posture humaine (points squelettiques).

Analyse de Texte

VNRecognizeTextRequest — reconnaissance de texte avec prise en charge de 13 langues et deux niveaux de précision. VNReadCodeRequest — pour les codes spécialisés. VNDetectTextRectanglesRequest — recherche de zones de texte sans reconnaissance (plus rapide, mais seulement des rectangles).

Classification et Analyse

VNClassifyImageRequest — classification d’images dans 1 000 catégories ImageNet. VNGenerateImageFeaturePrintRequest — extraction de vecteurs de caractéristiques pour la comparaison d’images. VNDetectContoursRequest — détection de contours d’objets.

CatégorieExemple de RequêteRésultat
Détection FacialeVNDetectFaceRectanglesRequestVNFaceObservation
Reconnaissance de TexteVNRecognizeTextRequestVNRecognizedTextObservation
Codes-BarresVNDetectBarcodesRequestVNBarcodeObservation
ClassificationVNClassifyImageRequestVNClassificationObservation
SuiviVNTrackObjectRequestVNDetectedObjectObservation
ContoursVNDetectContoursRequestVNContoursObservation

VNImageRequestHandler et VNSequenceRequestHandler

VNImageRequestHandler — un gestionnaire pour les images statiques. Il accepte CGImage, CIImage ou Data (JPEG/PNG) et exécute une ou plusieurs instances VNRequest. C’est la principale façon d’utiliser Vision pour les photos, les captures d’écran et les images téléchargées.

VNSequenceRequestHandler — un gestionnaire pour les séquences d’images (images vidéo). Il accepte le même ensemble de types d’images mais est conçu pour un traitement image par image en conservant l’état entre les images (nécessaire pour le suivi d’objets).

swift
// VNImageRequestHandler pour image unique
let imageHandler = VNImageRequestHandler(
    cgImage: cgImage,
    orientation: orientation,
    options: [:])

// VNSequenceRequestHandler pour vidéo
let sequenceHandler = VNSequenceRequestHandler()
try sequenceHandler.perform([trackingRequest],
    on: cgImage)

Différence importante : VNSequenceRequestHandler ne prend pas en charge l’exécution parallèle de plusieurs requêtes — chaque appel perform() traite un ensemble de requêtes pour une image. Pour le traitement vidéo multithread, créez des instances de gestionnaire séparées pour différents threads.

VNImageRequestHandler peut s’exécuter sur une file d’attente en arrière-plan. Apple recommande DispatchQueue.global(qos: .userInitiated) pour les scénarios interactifs (l’utilisateur attend les résultats) et .background pour le traitement par lots (par exemple, analyse de l’intégralité de la bibliothèque de photos).

VNObservation : Structure des Résultats

VNObservation — la classe de base pour tous les résultats de requêtes Vision. Chaque sous-classe de VNObservation contient des données spécifiques au type d’analyse : coordonnées du bounding box, texte reconnu, confiance, identifiant unique (uuid) et horodatage (timeRange).

Sous-classes clés de VNObservation : VNFaceObservation (résultat de détection faciale avec bounding box et landmarks), VNRecognizedTextObservation (texte reconnu avec candidats), VNBarcodeObservation (code-barres décodé avec payload et symbology), VNClassificationObservation (catégorie de classification avec confiance).

swift
func handleTextResults(request: VNRequest) {
    guard let observations = request.results
        as? [VNRecognizedTextObservation]
    else { return }

    for observation in observations {
        let bbox = observation.boundingBox
        let text = observation.topCandidates(1).first ?? ""
        print("\\(text) at \\(bbox)")
    }
}

Propriété confidence (de 0.0 à 1.0) est présente dans toutes les instances VNObservation et indique la confiance du modèle dans le résultat. Apple recommande de rejeter les observations avec confidence < 0,5 pour la plupart des tâches. Pour les applications critiques (médecine, sécurité), le seuil doit être relevé à 0,8–0,9.

VNObservation contient également timeRange (pour les requêtes vidéo) et uuid (ID unique pour la correspondance entre images). Cela permet de suivre le même objet (par exemple, un visage) à travers une séquence d’images vidéo.

Exécuter Plusieurs Requêtes Simultanément

L’un des principaux avantages de VNRequest est la capacité d’exécuter plusieurs requêtes différentes sur la même image en un seul appel handler.perform(). Vision optimise en interne l’ordre d’exécution et réutilise les calculs communs (par exemple, le prétraitement d’image).

Cela permet d’obtenir un ensemble complet de données sur une image en un seul passage : détecter simultanément les visages, reconnaître le texte, trouver les codes-barres et classifier le contenu. Cette approche est nettement plus efficace que d’appeler chaque requête séquentiellement.

swift
import Vision

// Plusieurs requêtes dans un seul tableau
let faceRequest = VNDetectFaceRectanglesRequest()
let textRequest = VNRecognizeTextRequest()
let barcodeRequest = VNDetectBarcodesRequest()
let classifyRequest = VNClassifyImageRequest()

let handler = VNImageRequestHandler(cgImage: cgImage, options: [:])
try handler.perform([
    faceRequest,
    textRequest,
    barcodeRequest,
    classifyRequest
])

// Accéder aux résultats de chaque requête
print("Faces: \\(faceRequest.results?.count ?? 0)")
print("Text blocks: \\(textRequest.results?.count ?? 0)")

Limitations : toutes les requêtes ne peuvent pas être combinées avec d’autres. Par exemple, VNGenerateImageFeaturePrintRequest doit être exécuté séparément. Apple recommande de regrouper les requêtes par type (détection, reconnaissance, classification) et de tester les combinaisons sur les appareils cibles.

Performances : combiner 3–4 requêtes dans un seul perform() est 30–40% plus rapide que l’exécution séquentielle car Vision réutilise les calculs ML partagés et le prétraitement d’image (mise à l’échelle, correction des couleurs).

Requêtes Personnalisées avec VNCoreMLRequest

VNCoreMLRequest est un pont entre Core ML et Vision, permettant d’exécuter n’importe quel modèle Core ML comme une requête Vision. Le modèle est encapsulé dans VNCoreMLModel, transmis à VNCoreMLRequest, et Vision gère automatiquement le prétraitement de l’image (mise à l’échelle, recadrage à la taille d’entrée du modèle).

VNCoreMLRequest hérite de VNRequest, donc il prend en charge toutes les fonctionnalités standard : regionOfInterest, completion handler, plusieurs requêtes. Cela permet de combiner un modèle ML personnalisé avec les détecteurs intégrés de Vision dans un seul pipeline.

swift
import Vision
import CoreML

// Encapsuler le modèle Core ML
guard let mlModel = try VNCoreMLModel(
    for: MyCustomClassifier().model)
else { return }

// Créer VNCoreMLRequest
let coreMLRequest = VNCoreMLRequest(model: mlModel) { request, _ in
    guard let results = request.results
        as? [VNClassificationObservation]
    else { return }

    for result in results.prefix(5) {
        print("\\(result.identifier): \\(result.confidence)"
    }
}
coreMLRequest.imageCropAndScaleOption = .centerCrop
coreMLRequest.regionOfInterest = faceBoundingBox

imageCropAndScaleOption détermine comment Vision met à l’échelle l’image pour l’entrée du modèle : .centerCrop (recadrage centré), .scaleFill (étirement) ou .scaleFit (mise à l’échelle avec conservation des proportions). Le choix dépend du type de modèle et de la position de l’objet dans l’image.

Exemple pratique : détection de visages via VNDetectFaceRectanglesRequest, puis classification de chaque visage via VNCoreMLRequest avec un modèle personnalisé (par exemple, estimation du sexe ou de l’âge). En combinant deux requêtes dans un seul perform(), vous obtenez un pipeline complet d’analyse faciale en un seul passage.

Questions Fréquemment Posées

Peut-on annuler un VNRequest en cours d’exécution ?

Oui, chaque VNRequest possède une propriété cancel() qui annule l’exécution de la requête. Cependant, l’annulation ne fonctionne qu’avant le début du traitement — si le modèle ML a déjà démarré, l’annulation n’interrompt pas le calcul. Pour une annulation fiable, utilisez DispatchWorkItem.cancel() conjointement avec VNRequest.cancel() dans le completion handler.

VNDetectFaceRectanglesRequest vs VNDetectFaceLandmarksRequest — quelle est la différence ?

VNDetectFaceRectanglesRequest trouve uniquement les rectangles de délimitation des visages. VNDetectFaceLandmarksRequest identifie en plus 68 points clés du visage (yeux, sourcils, nez, bouche, contour). VNDetectFaceLandmarksRequest est plus lent mais fournit plus de données pour l’animation, les masques et les effets AR. Pour un simple comptage de visages, VNDetectFaceRectanglesRequest suffit.

Quelle requête recherche les codes-barres — VNDetectBarcodesRequest ?

Oui, VNDetectBarcodesRequest est la requête correcte pour tous les types de codes-barres et QR codes. Il prend en charge EAN, UPC, Code 39, Code 128, PDF417, Aztec, QR et d’autres formats. Le résultat est renvoyé dans VNBarcodeObservation avec le payload et la symbology. Pour les flux vidéo, utilisez AVCaptureMetadataOutput — il est plus rapide pour le scan en direct.

Peut-on exécuter VNRequest sur un CIImage au lieu de CGImage ?

Oui, VNImageRequestHandler accepte CIImage via l’initialiseur init(ciImage:options:). Il prend également en charge Data (JPEG/PNG) et NSURL (chemin de fichier). CIImage est pratique lorsque l’image est déjà chargée via le pipeline Core Image — cela évite les copies de données inutiles en mémoire.

Combien d’instances VNRequest peuvent être exécutées dans un seul perform() ?

Il n’y a pas de limite de nombre, mais en pratique 3–5 requêtes est optimal. Plus de 5 requêtes peuvent entraîner une augmentation de la consommation mémoire, car chaque requête charge son propre modèle ML. Si vous devez exécuter 10+ analyses différentes, divisez-les en 2–3 groupes et exécutez-les séquentiellement.

Résumé

  • VNRequest — la classe de base Vision pour tous les types d’analyse d’image et de vidéo avec une architecture unifiée Requête-Réponse.
  • Vision comprend plus de 25 sous-classes VNRequest pour la détection faciale, l’OCR, les codes-barres, la classification, les contours, le suivi et les modèles ML.
  • VNImageRequestHandler exécute les requêtes sur les images statiques ; VNSequenceRequestHandler gère les séquences d’images pour le suivi.
  • Les résultats sont renvoyés sous forme de VNObservation avec bounding box, confiance, uuid et données spécifiques au type.
  • Plusieurs requêtes dans un seul perform() fonctionnent 30–40% plus rapidement que les appels séquentiels grâce à la réutilisation des calculs ML.
  • VNCoreMLRequest intègre les modèles Core ML personnalisés dans le pipeline Vision avec prétraitement automatique des images.
  • Toutes les requêtes sont exécutées sur l’appareil sans envoi de données à un serveur, garantissant confidentialité et fonctionnement hors ligne.

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.

Discuter du projet

Lisez aussi