VNRequest — is een abstracte basisklasse van het Vision-framework die een analyse-eenheid van een afbeelding of videostream vertegenwoordigt. Elk analysetype — gezichtsdetectie, tekstherkenning, barcode zoeken, classificatie — is geïmplementeerd als een concrete subklasse van VNRequest. Volgens Apple Developer Documentation (2024) maakt de ontwikkelaar een instantie van een verzoek, configureert de parameters, geeft de afbeelding door via VNImageRequestHandler en ontvangt de resultaten als een VNObservation-array.
Belangrijkste
VNRequest — is het fundamentele element van de Vision-architectuur, die het Request-Response-patroon implementeert voor analyse van afbeeldingen en video. Elke subklasse van VNRequest is verantwoordelijk voor een specifieke computervisietaak: gezichten zoeken, tekst herkennen, inhoud classificeren.
De architectuur van VNRequest scheidt „wat te analyseren” (verzoek) van „hoe te verwerken” (handler). De ontwikkelaar configureert het verzoek (analysetype, extra parameters) en geeft het samen met de afbeelding door aan de handler. De handler voert het verzoek uit en retourneert resultaten, zonder dat de ontwikkelaar inzicht hoeft te hebben in de interne ML-algoritmen.
Alle subklassen van VNRequest volgen een uniforme structuur: initialisatie met optionele completion handler, configuratie van eigenschappen (analyseregio, nauwkeurigheidsniveau) en overdracht aan de handler. Dit maakt de API voorspelbaar en gemakkelijk uitbreidbaar — een nieuw analysetype toevoegen betekent een nieuwe subklasse van VNRequest maken.
import Vision
// 1. Maak verzoek aan
let request = VNDetectFaceRectanglesRequest { req, _ in
// 3. Verwerk resultaten
guard let faces = req.results as? [VNFaceObservation]
else { return }
print("Found \\(faces.count) faces")
}
// 2. Voer uit via handler
let handler = VNImageRequestHandler(cgImage: cgImage, options: [:])
try handler.perform([request])
Belangrijkste eigenschappen van VNRequest: regionOfInterest (interessegebied op de afbeelding om analyse te versnellen), preferBackgroundProcessing (achtergrondmodus), revision (algoritmeversie) en cancellationSupport. Correcte configuratie van deze eigenschappen stelt u in staat de prestaties te optimaliseren voor een specifieke taak.
Volgens Apple WWDC 2024 is het aantal beschikbare VNRequest-subklassen in de 7 jaar van Vision’s bestaan gegroeid van 8 (iOS 11) naar meer dan 25 (iOS 18), waarmee alle belangrijke computervisietaken op mobiele apparaten worden gedekt.
Vision bevat meer dan 25 subklassen van VNRequest, verdeeld in categorieën: detectie, herkenning, tracking en classificatie. Elke subklasse erft van VNRequest en voegt taakspecifieke eigenschappen toe.
VNDetectFaceRectanglesRequest — zoeken naar gezichten in afbeeldingen. Retourneert VNFaceObservation met bounding box-coördinaten en confidence. VNDetectHumanRectanglesRequest — analoog voor mensen. VNDetectHumanBodyPoseRequest — bepalen van menselijke pose (skeletpunten).
VNRecognizeTextRequest — tekstherkenning met ondersteuning voor 13 talen en twee nauwkeurigheidsniveaus. VNReadCodeRequest — voor gespecialiseerde codes. VNDetectTextRectanglesRequest — zoeken naar tekstgebieden zonder herkenning (sneller, maar alleen rechthoeken).
VNClassifyImageRequest — classificatie van afbeeldingen volgens 1000 ImageNet-categorieën. VNGenerateImageFeaturePrintRequest — extractie van feature vector voor het vergelijken van afbeeldingen. VNDetectContoursRequest — detectie van objectcontouren.
VNImageRequestHandler — handler voor statische afbeeldingen. Accepteert CGImage, CIImage of Data (JPEG/PNG) en voert een of meerdere VNRequest-verzoeken uit. Dit is de primaire manier om Vision te gebruiken voor foto’s, schermafbeeldingen en geüploade afbeeldingen.
VNSequenceRequestHandler — handler voor reeksen afbeeldingen (videoframes). Accepteert dezelfde set afbeeldingstypen, maar is bedoeld voor frame-voor-frame verwerking met behoud van toestand tussen frames (noodzakelijk voor object tracking).
// VNImageRequestHandler voor enkele afbeelding
let imageHandler = VNImageRequestHandler(
cgImage: cgImage,
orientation: orientation,
options: [:])
// VNSequenceRequestHandler voor video
let sequenceHandler = VNSequenceRequestHandler()
try sequenceHandler.perform([trackingRequest],
on: cgImage)
Belangrijk verschil: VNSequenceRequestHandler ondersteunt geen parallelle uitvoering van meerdere verzoeken — elke perform()-aanroep verwerkt één set verzoeken voor één frame. Voor multi-threaded videoverwerking maakt u afzonderlijke handler-instanties voor verschillende threads.
VNImageRequestHandler kan worden uitgevoerd in een achtergrondwachtrij. Apple beveelt DispatchQueue.global(qos: .userInitiated) aan voor interactieve scenario’s (gebruiker wacht op resultaat) en .background voor batchverwerking (bijv. analyse van de hele fotobibliotheek).
VNObservation — basisklasse voor alle resultaten van Vision-verzoeken. Elke VNObservation-subklasse bevat gegevens specifiek voor het analysetype: bounding box-coördinaten, herkende tekst, vertrouwen (confidence), unieke identificatie (uuid) en tijdstempel (timeRange).
Belangrijkste VNObservation-subklassen: VNFaceObservation (resultaat van gezichtsdetectie met bounding box en landmarks), VNRecognizedTextObservation (herkende tekst met candidates), VNBarcodeObservation (gedecodeerde barcode met payload en symbology), VNClassificationObservation (classificatiecategorie met confidence).
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)")
}
}
Eigenschap confidence (van 0.0 tot 1.0) is aanwezig in alle VNObservation-objecten en geeft het vertrouwen van het model in het resultaat weer. Apple raadt aan observaties met confidence < 0.5 voor de meeste taken te verwerpen. Voor kritieke toepassingen (medisch, beveiliging) moet de drempel worden verhoogd naar 0.8–0.9.
VNObservation bevat ook timeRange (voor videoverzoeken) en uuid (unieke ID voor matching tussen frames). Dit maakt het mogelijk hetzelfde object (bijv. een gezicht) te volgen door een reeks videoframes.
Een van de belangrijkste voordelen van VNRequest — de mogelijkheid om meerdere verschillende verzoeken voor dezelfde afbeelding uit te voeren in één handler.perform()-aanroep. Vision optimaliseert intern de uitvoervolgorde en hergebruikt gemeenschappelijke berekeningen (bijv. voorbewerking van de afbeelding).
Dit maakt het mogelijk een volledige dataset over de afbeelding in één keer te verkrijgen: tegelijkertijd gezichten detecteren, tekst herkennen, barcodes vinden en inhoud classificeren. Deze benadering is aanzienlijk efficiënter dan het sequentieel aanroepen van elk verzoek afzonderlijk.
import Vision
// Meerdere verzoeken in één array
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
])
// Toegang tot resultaten van elk verzoek
print("Faces: \\(faceRequest.results?.count ?? 0)")
print("Text blocks: \\(textRequest.results?.count ?? 0)")
Beperkingen: niet alle verzoeken kunnen met andere worden gecombineerd. Bijvoorbeeld VNGenerateImageFeaturePrintRequest moet apart worden uitgevoerd. Apple raadt aan verzoeken te groeperen op type (detectie, herkenning, classificatie) en combinaties te testen op doelapparaten.
Prestaties: het combineren van 3–4 verzoeken in één perform() is 30–40% sneller dan sequentiële uitvoering, omdat Vision gemeenschappelijke ML-berekeningen en voorbewerking van de afbeelding (schalen, kleurcorrectie) hergebruikt.
VNCoreMLRequest — is een brug tussen Core ML en Vision, waarmee elk Core ML-model als een Vision-verzoek kan worden uitgevoerd. Het model wordt ingepakt in VNCoreMLModel, doorgegeven aan VNCoreMLRequest, en Vision verwerkt automatisch de voorbewerking van de afbeelding (schalen, bijsnijden naar de ingangsgrootte van het model).
VNCoreMLRequest erft van VNRequest, dus ondersteunt het alle standaard functionaliteiten: regionOfInterest, completion handler, meerdere verzoeken. Dit maakt het mogelijk een aangepast ML-model te combineren met ingebouwde Vision-detectoren in één pipeline.
import Vision
import CoreML
// Core ML-model inpakken
guard let mlModel = try VNCoreMLModel(
for: MyCustomClassifier().model)
else { return }
// VNCoreMLRequest aanmaken
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 bepaalt hoe Vision de afbeelding schaalt naar de modelinvoer: .centerCrop (bijsnijden vanuit het midden), .scaleFill (uitrekken) of .scaleFit (schalen met behoud van verhoudingen). De keuze hangt af van het modeltype en de positie van het object in de afbeelding.
Praktijkvoorbeeld: gezichtsdetectie via VNDetectFaceRectanglesRequest, vervolgens classificatie van elk gezicht via VNCoreMLRequest met een aangepast model (bijv. bepalen van geslacht of leeftijd). Door twee verzoeken in één perform() te combineren, krijgt u een volledige gezichtsanalyse-pipeline in één keer.
Veelgestelde vragen
Ja, elk VNRequest heeft een cancel()-eigenschap die de uitvoering van het verzoek annuleert. Annuleren werkt echter alleen tot het begin van de verwerking — als het ML-model al is gestart, stopt annuleren de berekening niet. Voor betrouwbaar annuleren gebruikt u DispatchWorkItem.cancel() samen met VNRequest.cancel() in de completion handler.
VNDetectFaceRectanglesRequest vindt alleen gezichtsrechthoeken. VNDetectFaceLandmarksRequest bepaalt daarnaast 68 belangrijke gezichtspunten (ogen, wenkbrauwen, neus, mond, contour). VNDetectFaceLandmarksRequest is langzamer, maar levert meer gegevens voor animatie, maskers en AR-effecten. Voor eenvoudige gezichtstelling is VNDetectFaceRectanglesRequest voldoende.
Ja, VNDetectBarcodesRequest — is het juiste verzoek voor alle soorten barcodes en QR-codes. Het ondersteunt EAN, UPC, Code 39, Code 128, PDF417, Aztec, QR en andere formaten. Het resultaat wordt geretourneerd in VNBarcodeObservation met payload en symbology. Gebruik voor videostreams AVCaptureMetadataOutput — dit is sneller voor live scannen.
Ja, VNImageRequestHandler accepteert CIImage via de initialisator init(ciImage:options:). Ook Data (JPEG/PNG) en NSURL (bestandspad) worden ondersteund. CIImage is handig wanneer de afbeelding al is geladen via de Core Image-pipeline — dit voorkomt onnodig kopiëren van gegevens in het geheugen.
Er is geen limiet aan het aantal, maar in de praktijk is 3–5 verzoeken de optimale hoeveelheid. Meer dan 5 verzoeken kunnen leiden tot hoger geheugengebruik omdat elk verzoek zijn eigen ML-model laadt. Als u 10+ verschillende analyses moet uitvoeren, verdeel ze dan in 2–3 groepen en voer ze sequentieel uit.
Samenvatting
We ontwikkelen een mobiele applicatie turnkey
IT Sectr creëert sinds 2017 iOS- en Android-applicaties voor startups en bedrijven. We adviseren u en stellen de beste oplossing voor.
Lees ook