VNCoreMLRequest — wat is het, een Vision-verzoek voor Core ML in iOS

Auteur: IT Sectr Gepubliceerd: 2026-07-20 Leestijd: 8 min

VNCoreMLRequest — is een subclass van VNRequest waarmee Core ML-modellen kunnen worden uitgevoerd binnen de Vision-pipeline, waarbij de voordelen van kant-en-klare Vision-detectoren (gezichten, tekst, objecten) worden gecombineerd met aangepaste ML-modellen voor classificatie en regressie. Volgens Apple Machine Learning Documentation (2024) verwerkt VNCoreMLRequest automatisch de voorbewerking van afbeeldingen — schalen, bijsnijden en kleurruimteconversie — volgens de vereisten van het Core ML-model.

Belangrijkste punten

  • VNCoreMLRequest — brug tussen Core ML en Vision: het ML-model werkt als een Vision-verzoek.
  • Automatische afbeeldingsvoorbewerking: schalen, bijsnijden en kleurcorrectie volgens modelvereisten.
  • Combineerbaar met andere VNRequest in één perform() voor het bouwen van pipelines.
  • Ondersteunt VNCoreMLModel — een wrapper rond MLModel voor het werken met afbeeldingen en FeatureValue.
  • Werkt op Neural Engine en GPU voor maximale prestaties.

Wat is VNCoreMLRequest?

VNCoreMLRequest — is een subclass van VNRequest, toegevoegd in iOS 11 samen met Vision, waarmee Core ML-modellen kunnen worden uitgevoerd in de context van Vision. Het neemt alle voorbewerking van de afbeelding die nodig is voor het Core ML-model voor zijn rekening: formaat wijzigen, bijsnijden, normaliseren en kleurruimteconversie.

Zonder VNCoreMLRequest zou de ontwikkelaar handmatig UIImage/CGImage naar MultiArray (MLMultiArray) of PixelBuffer (CVPixelBuffer) van de juiste grootte moeten converteren. VNCoreMLRequest automatiseert dit proces: u geeft een CGImage door via VNImageRequestHandler, en VNCoreMLRequest schaalt het zelf naar de invoer van het model.

VNCoreMLRequest erft alle mogelijkheden van VNRequest: completion handler, regionOfInterest, de mogelijkheid om meerdere verzoeken tegelijk uit te voeren, ondersteuning voor VNImageRequestHandler en VNSequenceRequestHandler.

swift
import Vision
import CoreML

// 1. Model laden en wrappen
guard let model = try VNCoreMLModel(
    for: MobileNetV2().model)
else { return }

// 2. VNCoreMLRequest aanmaken
let request = VNCoreMLRequest(model: model) { req, _ in
    guard let results = req.results
        as? [VNClassificationObservation]
    else { return }
    for r in results.prefix(3) {
        print("\\(r.identifier): \\(r.confidence)")
    }
}

// 3. Uitvoeren via handler
let handler = VNImageRequestHandler(cgImage: image, options: [:])
try handler.perform([request])

VNCoreMLRequest ondersteunt modellen met verschillende invoertypen: afbeeldingen (Image Feature), MultiArray en Double. Voor afbeeldingen converteert Vision automatisch CGImage naar CVPixelBuffer van de juiste grootte en kleurruimte. Voor andere typen invoergegevens moet u Core ML rechtstreeks gebruiken zonder Vision.

Volgens Apple WWDC 2023 wordt VNCoreMLRequest gebruikt in 40% van alle iOS-applicaties die Core ML toepassen voor het werken met afbeeldingen. Dit is de populairste manier om ML-modellen te integreren in iOS-applicaties.

VNCoreMLModel: wrapper rond het Core ML-model

VNCoreMLModel — is een wrapper die het Core ML-model (MLModel) aanpast voor gebruik in Vision. Het converteert de invoer- en uitvoergegevens van het model naar een formaat dat Vision begrijpt: afbeelding → CVPixelBuffer, resultaat → VNObservation.

Initialisatie van VNCoreMLModel controleert de compatibiliteit van het model met Vision: het model moet een afbeelding als invoer accepteren (Image Feature) en een classificatie retourneren (MLMultiArray of Dictionary). Als het model niet compatibel is, gooit de initialisator een fout.

swift
import Vision
import CoreML

// Optie 1: Vanuit .mlmodel (gecompileerd tijdens build)
let model1 = try VNCoreMLModel(
    for: MyVisionModel().model)

// Optie 2: Vanuit .mlmodelc (gecompileerd op apparaat)
let compiledURL = Bundle.main.url(
    forResource: "MyVisionModel",
    withExtension: "mlmodelc")!
let model2 = try VNCoreMLModel(
    for: MLModel(contentsOf: compiledURL))

VNCoreMLModel caches het model in het geheugen na de eerste keer laden. Het opnieuw laden van hetzelfde model retourneert de gecachte instantie, wat volgende verzoeken versnelt. Als het model echter meer dan 100 MB weegt, kan iOS het uit het geheugen verwijderen bij gebrek aan resources — in dat geval laadt VNCoreMLModel het model automatisch opnieuw.

Voor modellen die zijn getraind via Create ML, werkt VNCoreMLModel zonder extra configuratie. Create ML exporteert modellen met de juiste metadata die Vision automatisch herkent — het volstaat om het model door te geven aan VNCoreMLModel(model:).

imageCropAndScaleOption instellen

imageCropAndScaleOption — een sleuteleigenschap van VNCoreMLRequest die bepaalt hoe Vision de originele afbeelding transformeert naar de invoergrootte van het Core ML-model. De juiste keuze van de optie heeft directe invloed op de nauwkeurigheid van de classificatie.

.centerCrop — snijdt de afbeelding in het midden bij tot een vierkant en schaalt vervolgens naar de invoergrootte van het model. Geschikt voor modellen getraind op gecentreerde objecten (de meeste ImageNet-classificators). .scaleFill — rekt de afbeelding uit naar de invoergrootte zonder verhoudingen te behouden. Snel, maar vervormt de geometrie. .scaleFit — schaalt met behoud van verhoudingen, met toevoeging van letterbox (zwarte balken) aan de randen.

swift
import Vision

let request = VNCoreMLRequest(model: model)

// .centerCrop — voor gecentreerde objecten (standaard)
request.imageCropAndScaleOption = .centerCrop

// .scaleFill — voor uniforme texturen (zonder vervorming)
request.imageCropAndScaleOption = .scaleFill

// .scaleFit — wanneer objectverhoudingen van belang zijn
request.imageCropAndScaleOption = .scaleFit

Aanbevelingen: gebruik voor de meeste classificatiemodellen .centerCrop — dit geeft de beste verhouding tussen nauwkeurigheid en prestaties. Als het model is getraind op afbeeldingen met behoud van verhoudingen (bijvoorbeeld anomaliedetectie op documentfoto's), kies dan .scaleFit met letterbox.

Volgens Apple Developer Documentation 2024 kan een verkeerde keuze van imageCropAndScaleOption de nauwkeurigheid van het model met 15–25% verminderen. Bijvoorbeeld, .scaleFill voor een gezicht aan de rand van het frame kan een deel ervan afsnijden bij .centerCrop of de verhoudingen vervormen bij .scaleFill.

Combineren met andere VNRequest

De grootste kracht van VNCoreMLRequest — de mogelijkheid om het te combineren met andere VNRequest in één perform()-aanroep. Dit maakt het mogelijk om pipelines te bouwen: eerst gezichten vinden (VNDetectFaceRectanglesRequest), vervolgens elk gezicht classificeren via een aangepast Core ML-model (VNCoreMLRequest).

VNCoreMLRequest ondersteunt ook regionOfInterest — als u dit gebied instelt, zal Vision de afbeelding bijsnijden tot de opgegeven rechthoek voordat het aan het Core ML-model wordt doorgegeven. Dit is cruciaal voor pipelines: na detectie van een gezicht geeft u de bounding box door als regionOfInterest voor VNCoreMLRequest.

swift
import Vision

// 1. Gezichtsdetectie
let faceRequest = VNDetectFaceRectanglesRequest()

// 2. Emotieclassificatie via Core ML
guard let emotionModel = try VNCoreMLModel(
    for: EmotionClassifier().model)
else { return }

let emotionRequest = VNCoreMLRequest(model: emotionModel)
try handler.perform([faceRequest, emotionRequest])

// 3. regionOfInterest instellen voor elk gezicht
for face in faceRequest.results as? [VNFaceObservation] ?? [] {
    emotionRequest.regionOfInterest = face.boundingBox
    try handler.perform([emotionRequest])
    // Emotieclassificatieresultaat verwerken
}

Beperking: regionOfInterest voor VNCoreMLRequest is zinvol wanneer het model is getraind op afbeeldingen van één grootte en verhouding. Als het model een strikt vierkante invoer verwacht (224x224), zal .centerCrop met regionOfInterest het beste resultaat geven.

Volgens Apple ML Research geeft de pipeline 'detectie → classificatie' via regionOfInterest een nauwkeurigheidsverbetering van 20–30% vergeleken met classificatie van de hele afbeelding, omdat het ML-model alleen het relevante gebied zonder achtergrondruis ontvangt.

PipelinetypeVerzoek 1 (detectie)Verzoek 2 (ML)Voorbeeld
Gezicht → emotieVNDetectFaceRectanglesRequestVNCoreMLRequestStemming bepalen
Object → merkVNDetectObjectAtPointRequestVNCoreMLRequestLogoherkenning
Tekst → taalVNRecognizeTextRequestVNCoreMLRequestTaalclassificatie van tekst
Scène → beschrijvingVNClassifyImageRequestVNCoreMLRequestTags genereren

Resultaten van VNCoreMLRequest verwerken

VNCoreMLRequest retourneert resultaten in de vorm van VNClassificationObservation (voor classificatiemodellen) of VNCoreMLFeatureValueObservation (voor regressie en andere typen). Het type resultaat hangt af van de uitvoergegevens van het Core ML-model.

VNClassificationObservation bevat identifier (klassenaam) en confidence (betrouwbaarheid). Modellen met een softmax-uitvoer retourneren een array van dergelijke observaties, gesorteerd op aflopende confidence. VNCoreMLFeatureValueObservation bevat een willekeurige MLFeatureValue-waarde — dit kan MultiArray, Double, String of Dictionary zijn.

swift
// Voor classificatiemodellen
if let classificationResults = request.results
    as? [VNClassificationObservation] {
    for result in classificationResults
        where result.confidence > 0.5 {
        print("\\(result.identifier): \\(result.confidence)")
    }
}

// Voor regressiemodellen (kenmerkwaarden)
if let featureResults = request.results
    as? [VNCoreMLFeatureValueObservation] {
    for result in featureResults {
        let value = result.featureValue
        print("\\(result.featureName): \\(value)")
    }
}

Filteren op confidence: Apple raadt aan om resultaten met confidence < 0.3 voor algemene classificators en < 0.7 voor kritieke toepassingen weg te gooien. Voor modellen getraind op gebalanceerde datasets correleert confidence met de waarschijnlijkheid van een correct antwoord, maar garandeert deze niet.

VNCoreMLFeatureValueObservation.featureName komt overeen met de naam van de uitvoerlaag van het model (bijvoorbeeld 'classLabel' of 'features'). Dit maakt het mogelijk om modellen met meerdere uitvoeren te verwerken — elke uitvoer wordt vertegenwoordigd door een afzonderlijke observation met een unieke featureName.

Beste praktijken en prestaties

VNCoreMLRequest is geoptimaliseerd voor gebruik op Neural Engine (A12+), GPU en CPU. Vision kiest automatisch het beste apparaat voor het uitvoeren van het model, afhankelijk van het type en de grootte. De prestaties kunnen echter verder worden verbeterd door correcte configuratie.

Geheugenbeheer

Core ML-modellen worden in het geheugen geladen bij het eerste VNCoreMLRequest en blijven daar totdat de applicatie wordt afgesloten. Voor modellen groter dan 200 MB raadt Apple aan om ze op verzoek te laden en te verwijderen via MLModel.release(). VNCoreMLModel beheert het cachen zelf, maar u kunt dit controleren via autoreleasepool.

Batchverwerking

Voor batchverwerking van afbeeldingen maakt u één VNCoreMLRequest aan en hergebruikt u deze met verschillende VNImageRequestHandlers. Maak geen nieuwe VNCoreMLRequest voor elke afbeelding — dit vertraagt de verwerking door het opnieuw laden van het model. Hergebruik van het verzoek geeft een prestatieverbetering tot 40% bij het verwerken van 10+ afbeeldingen.

swift
// Correct: één verzoek voor alle afbeeldingen
let batchSize = 20
let batchRequest = VNCoreMLRequest(model: model)

for i in 0..<batchSize {
    let handler = VNImageRequestHandler(
        cgImage: images[i],
        options: [:])
    try handler.perform([batchRequest])
    // batchRequest.results worden bij elke aanroep bijgewerkt
}

Apparaatkeuze: standaard kiest Vision Neural Engine voor compatibele modellen op A12+-apparaten. Als het model Neural Engine niet ondersteunt, gebruikt Vision GPU of CPU. U kunt het apparaat geforceerd instellen via MLModelConfiguration.computeUnits, maar Apple raadt aan om de automatische selectie te behouden.

Volgens Apple Performance Benchmarks 2024 verwerkt VNCoreMLRequest op Neural Engine (iPhone 15 Pro) MobileNetV2-classificatie in 3–5 ms, op GPU — 8–12 ms, op CPU — 20–30 ms. Het verschil wordt cruciaal voor real-time applicaties die 30+ frames per seconde verwerken.

Veelgestelde vragen

Kan VNCoreMLRequest worden gebruikt zonder Vision — rechtstreeks met Core ML?

Ja, Core ML kan rechtstreeks worden gebruikt via MLModel.prediction(), zonder Vision. Echter, VNCoreMLRequest automatiseert de voorbewerking van afbeeldingen (schalen, bijsnijden, converteren naar CVPixelBuffer). Als het model geen afbeelding maar een MultiArray of Double accepteert, gebruik dan rechtstreeks Core ML. VNCoreMLRequest is alleen voor modellen met Image Feature als invoer.

Hoe update ik VNCoreMLRequest bij een nieuwe modelversie?

Maak een nieuwe VNCoreMLModel van het bijgewerkte MLModel en een nieuwe VNCoreMLRequest. Het oude verzoek blijft de oude modelversie gebruiken. Voor het op afstand updaten van modellen gebruikt u MLModel.compileModel(at:) om het model op het apparaat te compileren vanuit een .mlmodelc-bestand dat van de server is gedownload.

Ondersteunt VNCoreMLRequest modellen met meerdere invoeren?

VNCoreMLRequest ondersteunt alleen modellen met één Image Feature-invoer. Als een model meerdere invoeren heeft (bijvoorbeeld afbeelding + tekst), gebruik dan rechtstreeks Core ML via MLModel. Vision kan geen extra parameters naast de afbeelding doorgeven.

Wat is de maximale afbeeldingsgrootte voor VNCoreMLRequest?

De limiet is 8192 x 8192 pixels voor CGImage dat wordt doorgegeven aan VNImageRequestHandler. Core ML-modellen verwachten echter meestal een invoer van 224x224, 299x299 of 512x512. Vision schaalt grote afbeeldingen automatisch naar de invoergrootte. Als de originele afbeelding te groot is, verklein deze dan vooraf via CGImage om geheugen te besparen.

Kan VNCoreMLRequest op de achtergrond worden uitgevoerd?

Ja, stel preferBackgroundProcessing = true in op VNRequest. Hierdoor kan Vision de uitvoering van het verzoek uitstellen als het systeem in een resource-intensieve modus is (bijvoorbeeld tijdens het laden van content). Gebruik ook altijd DispatchQueue.global(qos: .background) voor het aanroepen van handler.perform().

Samenvatting

  • VNCoreMLRequest — een subclass van VNRequest voor het uitvoeren van Core ML-modellen in de Vision-pipeline met automatische afbeeldingsvoorbewerking.
  • VNCoreMLModel wikkelt MLModel voor Vision, waarbij CGImage automatisch wordt geconverteerd naar CVPixelBuffer van de juiste grootte en kleurruimte.
  • imageCropAndScaleOption (centerCrop, scaleFill, scaleFit) bepaalt de schaalstrategie en beïnvloedt de modelnauwkeurigheid met 15–25%.
  • Combinatie met VNDetectFaceRectanglesRequest en andere VNRequest maakt het mogelijk om 'detectie → classificatie'-pipelines te bouwen met regionOfInterest.
  • Resultaten worden geretourneerd als VNClassificationObservation (voor classificatie) of VNCoreMLFeatureValueObservation (voor regressie/andere typen).
  • Hergebruik van één VNCoreMLRequest voor batchverwerking geeft tot 40% prestatieverbetering vergeleken met het maken van een nieuwe voor elke afbeelding.
  • Prestaties op Neural Engine (3–5 ms op MobileNetV2) zijn 4–6 keer hoger dan op CPU, wat cruciaal is voor real-time applicaties.

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.

Bespreek het project

Lees ook