VNRequest — was es ist, wie Vision-Anfragen in iOS funktionieren

Autor: IT Sectr Veröffentlicht: 2026-07-20 Lesezeit: 8 Min.

VNRequest ist eine abstrakte Basisklasse des Vision-Frameworks, die eine Einheit der Bild- oder Videostromanalyse darstellt. Jede Art der Analyse — Gesichtserkennung, Texterkennung, Barcodesuche, Klassifizierung — ist als konkrete Unterklasse von VNRequest implementiert. Laut Apple Developer Documentation (2024) erstellt ein Entwickler eine Anfrageinstanz, konfiguriert ihre Parameter, übergibt ein Bild über VNImageRequestHandler und erhält Ergebnisse als Array von VNObservation.

Wichtige Erkenntnisse

  • VNRequest — die Basisklasse für alle Vision-Anfragen: Bildanalyse, Video und ML-Modelle.
  • Eine Anfrage wird über VNImageRequestHandler (Bild) oder VNSequenceRequestHandler (Video) ausgeführt.
  • Ergebnisse werden als Array von VNObservation zurückgegeben — jede Unterklasse enthält spezifische Daten.
  • Completion handler ermöglicht die asynchrone Verarbeitung der Ergebnisse nach Abschluss der Analyse.
  • Mehrere Anfragen können mit einem einzigen Aufruf von handler.perform() für ein Bild ausgeführt werden.

Was ist VNRequest in Vision?

VNRequest ist ein grundlegendes Element der Vision-Architektur, das das Anfrage-Antwort-Muster für Bild- und Videoanalyse implementiert. Jede VNRequest-Unterklasse ist für eine bestimmte Aufgabe des Computer Vision zuständig: Gesichtserkennung, Texterkennung, Inhaltsklassifizierung.

Die VNRequest-Architektur trennt “was zu analysieren ist” (die Anfrage) von “wie zu verarbeiten ist” (der Handler). Der Entwickler konfiguriert die Anfrage (Analysetyp, zusätzliche Parameter) und übergibt sie zusammen mit dem Bild an den Handler. Der Handler führt die Anfrage aus und gibt Ergebnisse zurück, ohne dass der Entwickler die internen ML-Algorithmen verstehen muss.

Alle VNRequest-Unterklassen folgen einer einheitlichen Struktur: Initialisierung mit optionalem Completion Handler, Konfiguration von Eigenschaften (Interessensbereich, Genauigkeitsstufe) und Übergabe an den Handler. Dies macht die API vorhersagbar und leicht erweiterbar — das Hinzufügen einer neuen Analysenart bedeutet, eine neue VNRequest-Unterklasse zu erstellen.

swift
import Vision

// 1. Anfrage erstellen
let request = VNDetectFaceRectanglesRequest { req, _ in
    // 3. Ergebnisse verarbeiten
    guard let faces = req.results as? [VNFaceObservation]
    else { return }
    print("Found \\(faces.count) faces")
}

// 2. Über Handler ausführen
let handler = VNImageRequestHandler(cgImage: cgImage, options: [:])
try handler.perform([request])

Wichtige VNRequest-Eigenschaften: regionOfInterest (Interessensbereich auf dem Bild zur Beschleunigung der Analyse), preferBackgroundProcessing (Hintergrundmodus), revision (Algorithmusversion) und cancellationSupport. Die richtige Konfiguration dieser Eigenschaften ermöglicht die Optimierung der Leistung für eine bestimmte Aufgabe.

Laut Apple WWDC 2024 stieg die Zahl der verfügbaren VNRequest-Unterklassen in den 7 Jahren des Bestehens von Vision von 8 (iOS 11) auf über 25 (iOS 18) und deckt alle wichtigen Computer-Vision-Aufgaben auf mobilen Geräten ab.

Wichtige Arten von VNRequest für die Analyse

Vision umfasst über 25 VNRequest-Unterklassen, die in Kategorien eingeteilt sind: Erkennung, Wiedererkennung, Verfolgung und Klassifizierung. Jede Unterklasse erbt von VNRequest und fügt aufgabenspezifische Eigenschaften hinzu.

Erkennung und Wiedererkennung

VNDetectFaceRectanglesRequest — Gesichtserkennung in Bildern. Gibt VNFaceObservation mit Bounding-Box-Koordinaten und Konfidenz zurück. VNDetectHumanRectanglesRequest — analog für Personen. VNDetectHumanBodyPoseRequest — Schätzung der menschlichen Körperhaltung (Skelettpunkte).

Textanalyse

VNRecognizeTextRequest — Texterkennung mit Unterstützung für 13 Sprachen und zwei Genauigkeitsstufen. VNReadCodeRequest — für spezialisierte Codes. VNDetectTextRectanglesRequest — Suche nach Textbereichen ohne Erkennung (schneller, aber nur Rechtecke).

Klassifizierung und Analyse

VNClassifyImageRequest — Bildklassifizierung in 1.000 ImageNet-Kategorien. VNGenerateImageFeaturePrintRequest — Extraktion von Feature-Vektoren zum Bildvergleich. VNDetectContoursRequest — Erkennung von Objektkonturen.

KategorieBeispielanfrageErgebnis
GesichtserkennungVNDetectFaceRectanglesRequestVNFaceObservation
TexterkennungVNRecognizeTextRequestVNRecognizedTextObservation
BarcodesVNDetectBarcodesRequestVNBarcodeObservation
KlassifizierungVNClassifyImageRequestVNClassificationObservation
VerfolgungVNTrackObjectRequestVNDetectedObjectObservation
KonturenVNDetectContoursRequestVNContoursObservation

VNImageRequestHandler und VNSequenceRequestHandler

VNImageRequestHandler — ein Handler für statische Bilder. Akzeptiert CGImage, CIImage oder Data (JPEG/PNG) und führt eine oder mehrere VNRequest-Instanzen aus. Dies ist die primäre Methode, um Vision für Fotos, Screenshots und hochgeladene Bilder zu verwenden.

VNSequenceRequestHandler — ein Handler für Bildsequenzen (Video-Frames). Akzeptiert denselben Satz von Bildtypen, ist jedoch für die Frame-für-Frame-Verarbeitung unter Beibehaltung des Zustands zwischen Frames konzipiert (notwendig für die Objektverfolgung).

swift
// VNImageRequestHandler für einzelnes Bild
let imageHandler = VNImageRequestHandler(
    cgImage: cgImage,
    orientation: orientation,
    options: [:])

// VNSequenceRequestHandler für Video
let sequenceHandler = VNSequenceRequestHandler()
try sequenceHandler.perform([trackingRequest],
    on: cgImage)

Wichtiger Unterschied: VNSequenceRequestHandler unterstützt keine parallele Ausführung mehrerer Anfragen — jeder perform()-Aufruf verarbeitet einen Satz von Anfragen für einen Frame. Für die mehrfädige Videoverarbeitung erstellen Sie separate Handler-Instanzen für verschiedene Threads.

VNImageRequestHandler kann in einer Hintergrundwarteschlange ausgeführt werden. Apple empfiehlt DispatchQueue.global(qos: .userInitiated) für interaktive Szenarien (der Benutzer wartet auf Ergebnisse) und .background für die Stapelverarbeitung (z.B. Analyse der gesamten Fotobibliothek).

VNObservation: Struktur der Ergebnisse

VNObservation — die Basisklasse für alle Vision-Anfrageergebnisse. Jede VNObservation-Unterklasse enthält für den Analysetyp spezifische Daten: Bounding-Box-Koordinaten, erkannten Text, Konfidenz, eindeutige Kennung (uuid) und Zeitstempel (timeRange).

Wichtige VNObservation-Unterklassen: VNFaceObservation (Gesichtserkennungsergebnis mit Bounding Box und Landmarks), VNRecognizedTextObservation (erkannter Text mit Kandidaten), VNBarcodeObservation (dekodierter Barcode mit Payload und Symbology), VNClassificationObservation (Klassifizierungskategorie mit Konfidenz).

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

Konfidenz-Eigenschaft (von 0.0 bis 1.0) ist in allen VNObservation-Instanzen vorhanden und gibt die Konfidenz des Modells im Ergebnis an. Apple empfiehlt, Beobachtungen mit Konfidenz < 0.5 für die meisten Aufgaben zu verwerfen. Für kritische Anwendungen (Medizin, Sicherheit) sollte der Schwellenwert auf 0.8–0.9 erhöht werden.

VNObservation enthält auch timeRange (für Videoanfragen) und uuid (eindeutige ID für den Frame-übergreifenden Abgleich). Dies ermöglicht die Verfolgung desselben Objekts (z.B. eines Gesichts) über eine Sequenz von Videoframes hinweg.

Mehrere Anfragen gleichzeitig ausführen

Einer der Hauptvorteile von VNRequest ist die Fähigkeit, mehrere verschiedene Anfragen auf demselben Bild in einem einzigen handler.perform()-Aufruf auszuführen. Vision optimiert intern die Ausführungsreihenfolge und verwendet gemeinsame Berechnungen (z.B. Bildvorverarbeitung) wieder.

Dies ermöglicht es, in einem Durchgang einen vollständigen Datensatz über ein Bild zu erhalten: gleichzeitig Gesichter erkennen, Text erkennen, Barcodes finden und Inhalte klassifizieren. Dieser Ansatz ist wesentlich effizienter als das sequenzielle Aufrufen jeder einzelnen Anfrage.

swift
import Vision

// Mehrere Anfragen in einem 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
])

// Auf Ergebnisse jeder Anfrage zugreifen
print("Faces: \\(faceRequest.results?.count ?? 0)")
print("Text blocks: \\(textRequest.results?.count ?? 0)")

Einschränkungen: Nicht alle Anfragen können mit anderen kombiniert werden. Beispielsweise muss VNGenerateImageFeaturePrintRequest separat ausgeführt werden. Apple empfiehlt, Anfragen nach Typ zu gruppieren (Erkennung, Wiedererkennung, Klassifizierung) und Kombinationen auf Zielgeräten zu testen.

Leistung: Die Kombination von 3–4 Anfragen in einem einzigen perform() ist 30–40% schneller als die sequenzielle Ausführung, da Vision gemeinsame ML-Berechnungen und Bildvorverarbeitung (Skalierung, Farbkorrektur) wiederverwendet.

Benutzerdefinierte Anfragen mit VNCoreMLRequest

VNCoreMLRequest ist eine Brücke zwischen Core ML und Vision, die es ermöglicht, jedes Core ML-Modell als Vision-Anfrage auszuführen. Das Modell wird in VNCoreMLModel eingewickelt, an VNCoreMLRequest übergeben, und Vision übernimmt automatisch die Bildvorverarbeitung (Skalierung, Zuschneiden auf die Modelleingabegröße).

VNCoreMLRequest erbt von VNRequest und unterstützt daher alle Standardfunktionen: regionOfInterest, Completion Handler, mehrere Anfragen. Dies ermöglicht die Kombination eines benutzerdefinierten ML-Modells mit integrierten Vision-Detektoren in einer einzigen Pipeline.

swift
import Vision
import CoreML

// Core ML-Modell kapseln
guard let mlModel = try VNCoreMLModel(
    for: MyCustomClassifier().model)
else { return }

// VNCoreMLRequest erstellen
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 bestimmt, wie Vision das Bild auf die Modelleingabe skaliert: .centerCrop (zentrierter Zuschnitt), .scaleFill (Streckung) oder .scaleFit (Skalierung unter Beibehaltung des Seitenverhältnisses). Die Wahl hängt vom Modelltyp und der Position des Objekts im Bild ab.

Praktisches Beispiel: Gesichtserkennung über VNDetectFaceRectanglesRequest, dann Klassifizierung jedes Gesichts über VNCoreMLRequest mit einem benutzerdefinierten Modell (z.B. Geschlechts- oder Altersschätzung). Durch die Kombination zweier Anfragen in einem perform() erhalten Sie eine vollständige Gesichtsanalyse-Pipeline in einem Durchgang.

Häufig gestellte Fragen

Kann eine laufende VNRequest abgebrochen werden?

Ja, jede VNRequest hat eine cancel()-Eigenschaft, die die Ausführung der Anfrage abbricht. Der Abbruch funktioniert jedoch nur vor Beginn der Verarbeitung — wenn das ML-Modell bereits gestartet wurde, unterbricht der Abbruch die Berechnung nicht. Für einen zuverlässigen Abbruch verwenden Sie DispatchWorkItem.cancel() zusammen mit VNRequest.cancel() im Completion Handler.

VNDetectFaceRectanglesRequest vs VNDetectFaceLandmarksRequest — was ist der Unterschied?

VNDetectFaceRectanglesRequest findet nur Begrenzungsrechtecke von Gesichtern. VNDetectFaceLandmarksRequest identifiziert zusätzlich 68 Gesichtsschlüsselpunkte (Augen, Augenbrauen, Nase, Mund, Kontur). VNDetectFaceLandmarksRequest ist langsamer, liefert aber mehr Daten für Animationen, Masken und AR-Effekte. Für eine einfache Gesichtszählung reicht VNDetectFaceRectanglesRequest aus.

Welche Anfrage sucht nach Barcodes — VNDetectBarcodesRequest?

Ja, VNDetectBarcodesRequest ist die richtige Anfrage für alle Arten von Barcodes und QR-Codes. Es unterstützt EAN, UPC, Code 39, Code 128, PDF417, Aztec, QR und andere Formate. Das Ergebnis wird in VNBarcodeObservation mit Payload und Symbology zurückgegeben. Für Videoströme verwenden Sie AVCaptureMetadataOutput — es ist schneller für Live-Scans.

Kann VNRequest auf einem CIImage anstelle von CGImage ausgeführt werden?

Ja, VNImageRequestHandler akzeptiert CIImage über den Initialisierer init(ciImage:options:). Es unterstützt auch Data (JPEG/PNG) und NSURL (Dateipfad). CIImage ist praktisch, wenn das Bild bereits über die Core-Image-Pipeline geladen wurde — dies vermeidet unnötiges Datenkopieren im Speicher.

Wie viele VNRequest-Instanzen können in einem perform() ausgeführt werden?

Es gibt keine Begrenzung der Anzahl, aber in der Praxis sind 3–5 Anfragen optimal. Mehr als 5 Anfragen können zu einem erhöhten Speicherverbrauch führen, da jede Anfrage ihr eigenes ML-Modell lädt. Wenn Sie 10+ verschiedene Analysen durchführen müssen, teilen Sie sie in 2–3 Gruppen auf und führen Sie sie sequenziell aus.

Zusammenfassung

  • VNRequest — die Basisklasse von Vision für alle Arten der Bild- und Videoanalyse mit einer einheitlichen Anfrage-Antwort-Architektur.
  • Vision umfasst über 25 VNRequest-Unterklassen für Gesichtserkennung, OCR, Barcodes, Klassifizierung, Konturen, Verfolgung und ML-Modelle.
  • VNImageRequestHandler führt Anfragen auf statischen Bildern aus; VNSequenceRequestHandler verarbeitet Bildsequenzen zur Verfolgung.
  • Ergebnisse werden als VNObservation mit Bounding Box, Konfidenz, uuid und typspezifischen Daten zurückgegeben.
  • Mehrere Anfragen in einem perform() arbeiten 30–40% schneller als sequenzielle Aufrufe dank der Wiederverwendung von ML-Berechnungen.
  • VNCoreMLRequest integriert benutzerdefinierte Core ML-Modelle in die Vision-Pipeline mit automatischer Bildvorverarbeitung.
  • Alle Anfragen werden auf dem Gerät ausgeführt, ohne Daten an einen Server zu senden, was Privatsphäre und Offline-Betrieb gewährleistet.

Wir entwickeln eine mobile Applikation schlüsselfertig

IT Sectr entwickelt seit 2017 iOS- und Android-Apps für Startups und Unternehmen. Wir beraten Sie und schlagen die beste Lösung vor.

Projekt besprechen

Lesen Sie auch