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 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.
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.
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.
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).
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).
VNClassifyImageRequest — Bildklassifizierung in 1.000 ImageNet-Kategorien. VNGenerateImageFeaturePrintRequest — Extraktion von Feature-Vektoren zum Bildvergleich. VNDetectContoursRequest — Erkennung von Objektkonturen.
| Kategorie | Beispielanfrage | Ergebnis |
|---|---|---|
| Gesichtserkennung | VNDetectFaceRectanglesRequest | VNFaceObservation |
| Texterkennung | VNRecognizeTextRequest | VNRecognizedTextObservation |
| Barcodes | VNDetectBarcodesRequest | VNBarcodeObservation |
| Klassifizierung | VNClassifyImageRequest | VNClassificationObservation |
| Verfolgung | VNTrackObjectRequest | VNDetectedObjectObservation |
| Konturen | VNDetectContoursRequest | VNContoursObservation |
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).
// 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 — 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).
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.
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.
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.
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.
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
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 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.
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.
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.
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
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.
Lesen Sie auch