VNRequest — är en abstrakt basklass i Vision-ramverket som representerar en analysenhet för en bild eller videoström. Varje analystyp — ansiktsdetektering, textigenkänning, streckkodssökning, klassificering — är implementerad som en konkret underklass av VNRequest. Enligt Apple Developer Documentation (2024) skapar utvecklaren en instans av en begäran, konfigurerar dess parametrar, skickar bilden via VNImageRequestHandler och får resultaten som en array av VNObservation.
Huvudsakligt
VNRequest — är det grundläggande elementet i Vision-arkitekturen som implementerar Request-Response-mönstret för analys av bilder och video. Varje underklass av VNRequest ansvarar för en specifik uppgift inom datorseende: sökning av ansikten, textigenkänning, klassificering av innehåll.
Arkitekturen för VNRequest separerar ”vad som ska analyseras” (begäran) från ”hur det ska bearbetas” (handler). Utvecklaren konfigurerar begäran (analystyp, ytterligare parametrar) och skickar den till handlern tillsammans med bilden. Handlern utför begäran och returnerar resultaten utan att utvecklaren behöver förstå de interna ML-algoritmerna.
Alla underklasser av VNRequest följer en enhetlig struktur: initiering med valfri completion handler, konfiguration av egenskaper (analysregion, noggrannhetsnivå) och överföring till handlern. Detta gör API:et förutsägbart och lätt att utöka — att lägga till en ny analystyp innebär att skapa en ny underklass av VNRequest.
import Vision
// 1. Skapa begäran
let request = VNDetectFaceRectanglesRequest { req, _ in
// 3. Bearbeta resultat
guard let faces = req.results as? [VNFaceObservation]
else { return }
print("Found \\(faces.count) faces")
}
// 2. Utför via handler
let handler = VNImageRequestHandler(cgImage: cgImage, options: [:])
try handler.perform([request])
Viktiga egenskaper för VNRequest: regionOfInterest (intresseområde på bilden för att snabba upp analysen), preferBackgroundProcessing (bakgrundsläge), revision (algoritmversion) och cancellationSupport. Korrekt konfiguration av dessa egenskaper låter dig optimera prestanda för en specifik uppgift.
Enligt Apple WWDC 2024 har antalet tillgängliga underklasser av VNRequest under Vision’s 7-åriga existens växt från 8 (iOS 11) till över 25 (iOS 18), vilket täcker alla huvudsakliga datorseendeuppgifter på mobila enheter.
Vision innehåller över 25 underklasser av VNRequest, indelade i kategorier: detektering, igenkänning, spårning och klassificering. Varje underklass ärver från VNRequest och lägger till uppgiftsspecifika egenskaper.
VNDetectFaceRectanglesRequest — sökning efter ansikten i bilden. Returnerar VNFaceObservation med bounding box-koordinater och confidence. VNDetectHumanRectanglesRequest — analogt för människor. VNDetectHumanBodyPoseRequest — bestämning av mänsklig pose (skelettpunkter).
VNRecognizeTextRequest — textigenkänning med stöd för 13 språk och två noggrannhetsnivåer. VNReadCodeRequest — för specialiserade koder. VNDetectTextRectanglesRequest — sökning efter textområden utan igenkänning (snabbare, men endast rektanglar).
VNClassifyImageRequest — klassificering av bild enligt 1000 ImageNet-kategorier. VNGenerateImageFeaturePrintRequest — extrahering av feature vector för att jämföra bilder. VNDetectContoursRequest — detektering av objektkonturer.
VNImageRequestHandler — handler för statiska bilder. Accepterar CGImage, CIImage eller Data (JPEG/PNG) och utför en eller flera VNRequest. Detta är det primära sättet att använda Vision för foton, skärmdumpar och uppladdade bilder.
VNSequenceRequestHandler — handler för bildsekvenser (videorutor). Accepterar samma uppsättning bildtyper men är avsedd för bildruta-för-bildruta-bearbetning med bevarande av tillstånd mellan bildrutor (nödvändigt för objektsökning).
// VNImageRequestHandler för en bild
let imageHandler = VNImageRequestHandler(
cgImage: cgImage,
orientation: orientation,
options: [:])
// VNSequenceRequestHandler för video
let sequenceHandler = VNSequenceRequestHandler()
try sequenceHandler.perform([trackingRequest],
on: cgImage)
Viktig skillnad: VNSequenceRequestHandler stöder inte parallell utförande av flera begäran — varje anrop av perform() bearbetar en uppsättning begäran för en bildruta. För flertrådad videobearbetning, skapa separata instanser av handlern för olika trådar.
VNImageRequestHandler kan utföras i bakgrundskö. Apple rekommenderar DispatchQueue.global(qos: .userInitiated) för interaktiva scenarier (användaren väntar på resultat) och .background för batchbearbetning (t.ex. analys av hela fotobiblioteket).
VNObservation — basklass för alla resultat av Vision-begäran. Varje VNObservation-underklass innehåller data specifik för analystypen: bounding box-koordinater, igenkänd text, tillförlitlighet (confidence), unik identifierare (uuid) och tidsstämpel (timeRange).
Viktiga VNObservation-underklasser: VNFaceObservation (resultat av ansiktsdetektering med bounding box och landmarks), VNRecognizedTextObservation (igenkänd text med candidates), VNBarcodeObservation (avkodad streckkod med payload och symbology), VNClassificationObservation (klassificeringskategori med 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)")
}
}
Egenskapen confidence (från 0.0 till 1.0) finns i alla VNObservation och visar modellens tillförlitlighet i resultatet. Apple rekommenderar att kassera observationer med confidence < 0.5 för de flesta uppgifter. För kritiska applikationer (medicin, säkerhet) bör tröskeln höjas till 0.8–0.9.
VNObservation innehåller också timeRange (för videobegäran) och uuid (unikt ID för matchning mellan bildrutor). Detta möjliggör spårning av samma objekt (t.ex. ansikte) genom en sekvens av videobildrutor.
En av de viktigaste fördelarna med VNRequest — möjligheten att utföra flera olika begäran på en bild i ett enda anrop av handler.perform(). Vision optimerar internt utförandet och återanvänder gemensamma beräkningar (t.ex. bildförbehandling).
Detta gör det möjligt att få en komplett uppsättning data om bilden i en enda genomgång: samtidigt detektera ansikten, känna igen text, hitta streckkoder och klassificera innehåll. Detta tillvägagångssätt är betydligt effektivare än att sekventiellt anropa varje begäran separat.
import Vision
// Flera begäran i en 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
])
// Åtkomst till resultat från varje begäran
print("Faces: \\(faceRequest.results?.count ?? 0)")
print("Text blocks: \\(textRequest.results?.count ?? 0)")
Begränsningar: inte alla begäran kan kombineras med andra. Till exempel måste VNGenerateImageFeaturePrintRequest utföras separat. Apple rekommenderar att gruppera begäran efter typ (detektering, igenkänning, klassificering) och testa kombinationer på målenheter.
Prestanda: att kombinera 3–4 begäran i en perform() är 30–40% snabbare än sekventiell utförande, eftersom Vision återanvänder gemensamma ML-beräkningar och bildförbehandling (skalning, färgkorrigering).
VNCoreMLRequest — är en bro mellan Core ML och Vision som gör det möjligt att köra vilken Core ML-modell som helst som en Vision-begäran. Modellen lindas in i VNCoreMLModel, skickas till VNCoreMLRequest, och Vision bearbetar automatiskt bildförbehandlingen (skalning, beskärning till modellens ingångsstorlek).
VNCoreMLRequest ärver från VNRequest, så det stöder alla standardfunktioner: regionOfInterest, completion handler, flera begäran. Detta gör det möjligt att kombinera en anpassad ML-modell med inbyggda Vision-detektorer i en pipeline.
import Vision
import CoreML
// Linda in Core ML-modell
guard let mlModel = try VNCoreMLModel(
for: MyCustomClassifier().model)
else { return }
// Skapa 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 bestämmer hur Vision skalar bilden till modellens ingång: .centerCrop (beskärning från mitten), .scaleFill (utsträckning) eller .scaleFit (skalning med bevarande av proportioner). Valet beror på modelltypen och objektets position i bilden.
Praktiskt exempel: ansiktsdetektering via VNDetectFaceRectanglesRequest, sedan klassificering av varje ansikte via VNCoreMLRequest med en anpassad modell (t.ex. bestämning av kön eller ålder). Genom att kombinera två begäran i en perform() får du en komplett ansiktsanalys-pipeline i en enda genomgång.
Vanliga frågor
Ja, varje VNRequest har en cancel()-egenskap som avbryter utförandet av begäran. Avbrytning fungerar dock endast innan bearbetningen börjar — om ML-modellen redan har startats kommer avbrytning inte att stoppa beräkningen. För tillförlitlig avbrytning, använd DispatchWorkItem.cancel() tillsammans med VNRequest.cancel() i completion handlern.
VNDetectFaceRectanglesRequest hittar endast ansiktsrektanglar. VNDetectFaceLandmarksRequest bestämmer dessutom 68 viktiga punkter i ansiktet (ögon, ögonbryn, näsa, mun, kontur). VNDetectFaceLandmarksRequest är långsammare men ger mer data för animation, masker och AR-effekter. För enkel ansiktsräkning räcker VNDetectFaceRectanglesRequest.
Ja, VNDetectBarcodesRequest — rätt begäran för alla typer av streckkoder och QR-koder. Det stöder EAN, UPC, Code 39, Code 128, PDF417, Aztec, QR och andra format. Resultatet returneras i VNBarcodeObservation med payload och symbology. För videoström, använd AVCaptureMetadataOutput — det är snabbare för levande skanning.
Ja, VNImageRequestHandler accepterar CIImage via initieraren init(ciImage:options:). Även Data (JPEG/PNG) och NSURL (sökväg till fil) stöds. CIImage är praktiskt när bilden redan har laddats via Core Image-pipelinen — detta undviker onödig kopiering av data i minnet.
Det finns ingen gräns för antalet, men i praktiken är 3–5 begäran den optimala mängden. Fler än 5 begäran kan orsaka ökad minnesförbrukning eftersom varje begäran laddar sin egen ML-modell. Om du behöver utföra 10+ olika analyser, dela upp dem i 2–3 grupper och utför dem sekventiellt.
Sammanfattning
Vi utvecklar en mobil applikation nyckelfärdigt
IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.
Läs också