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 — 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.
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 — 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.
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 — 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.
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.
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.
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.
| Pipelinetype | Verzoek 1 (detectie) | Verzoek 2 (ML) | Voorbeeld |
|---|---|---|---|
| Gezicht → emotie | VNDetectFaceRectanglesRequest | VNCoreMLRequest | Stemming bepalen |
| Object → merk | VNDetectObjectAtPointRequest | VNCoreMLRequest | Logoherkenning |
| Tekst → taal | VNRecognizeTextRequest | VNCoreMLRequest | Taalclassificatie van tekst |
| Scène → beschrijving | VNClassifyImageRequest | VNCoreMLRequest | Tags genereren |
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.
// 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.
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.
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.
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.
// 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
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.
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.
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.
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.
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
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