VNRequest — vad är det, arkitekturen för Vision-begäran i iOS

Författare: IT Sectr Publicerad: 2026-07-20 Lästid: 8 min

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 — basklass för alla Vision-begäran: analys av bilder, video och ML-modeller.
  • Begäran utförs via VNImageRequestHandler (bild) eller VNSequenceRequestHandler (video).
  • Resultaten returneras som en array av VNObservation — varje underklass innehåller specifik data.
  • Completion handler möjliggör asynkron bearbetning av resultat efter att analysen slutförts.
  • Flera begäran kan utföras med ett anrop handler.perform() för en bild.

Vad är VNRequest i Vision?

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.

swift
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.

Huvudtyper av VNRequest för analys

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.

Detektering och igenkänning

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).

Textanalys

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).

Klassificering och analys

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 och VNSequenceRequestHandler

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).

swift
// 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: struktur av resultat

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).

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)")
    }
}

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.

Utföra flera begäran samtidigt

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.

swift
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).

Anpassade begäran med VNCoreMLRequest

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.

swift
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

Kan en pågående VNRequest avbrytas?

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 och VNDetectFaceLandmarksRequest — vad är skillnaden?

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.

Vilken begäran används för att söka streckkoder — VNDetectBarcodesRequest?

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.

Kan VNRequest utföras på CIImage istället för CGImage?

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.

Hur många VNRequest kan utföras i en perform()?

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

  • VNRequest — Vision-basklass för alla typer av bild- och videoanalys med en enhetlig Request-Response-arkitektur.
  • Vision innehåller 25+ VNRequest-underklasser för ansiktsdetektering, OCR, streckkoder, klassificering, konturer, spårning och ML-modeller.
  • VNImageRequestHandler utför begäran på statiska bilder; VNSequenceRequestHandler — på bildrutesekvenser för spårning.
  • Resultaten returneras som VNObservation med bounding box, confidence, uuid och typspecifik data.
  • Flera begäran i en perform() fungerar 30–40% snabbare än sekventiella anrop tack vare återanvändning av ML-beräkningar.
  • VNCoreMLRequest integrerar anpassade Core ML-modeller i Vision-pipelinen med automatisk bildförbehandling.
  • Alla begäran utförs på enheten utan att skicka data till servern, vilket säkerställer integritet och offlinearbete.

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.

Diskutera projektet

Läs också