VNRequest — je abstraktní základní třída frameworku Vision, která představuje jednotku analýzy obrazu nebo video streamu. Každý typ analýzy — detekce obličejů, rozpoznávání textu, hledání čárových kódů, klasifikace — je implementován jako konkrétní podtřída VNRequest. Podle Apple Developer Documentation (2024) vývojář vytvoří instanci požadavku, nakonfiguruje jeho parametry, předá obraz přes VNImageRequestHandler a obdrží výsledky jako pole VNObservation.
Hlavní
VNRequest — je základním prvkem architektury Vision, který implementuje vzor Request-Response pro analýzu obrázků a videa. Každá podtřída VNRequest je zodpovědná za konkrétní úlohu počítačového vidění: vyhledávání obličejů, rozpoznávání textu, klasifikaci obsahu.
Architektura VNRequest odděluje „co analyzovat“ (požadavek) od „jak zpracovávat“ (handler). Vývojář nakonfiguruje požadavek (typ analýzy, další parametry) a předá jej handleru spolu s obrázkem. Handler provede požadavek a vrátí výsledky, aniž by vyžadoval od vývojáře porozumění vnitřním ML algoritmům.
Všechny podtřídy VNRequest následují jednotnou strukturu: inicializace s volitelným completion handler, konfigurace vlastností (oblast analýzy, úroveň přesnosti) a předání handleru. To činí API předvídatelným a snadno rozšiřitelným — přidání nového typu analýzy znamená vytvoření nové podtřídy VNRequest.
import Vision
// 1. Vytvořit požadavek
let request = VNDetectFaceRectanglesRequest { req, _ in
// 3. Zpracovat výsledky
guard let faces = req.results as? [VNFaceObservation]
else { return }
print("Found \\(faces.count) faces")
}
// 2. Provést přes handler
let handler = VNImageRequestHandler(cgImage: cgImage, options: [:])
try handler.perform([request])
Klíčové vlastnosti VNRequest: regionOfInterest (oblast zájmu na obrázku pro zrychlení analýzy), preferBackgroundProcessing (režim na pozadí), revision (verze algoritmu) a cancellationSupport. Správná konfigurace těchto vlastností umožňuje optimalizovat výkon pro konkrétní úlohu.
Podle Apple WWDC 2024 se během 7 let existence Vision počet dostupných podtříd VNRequest zvýšil z 8 (iOS 11) na více než 25 (iOS 18), pokrývajíc všechny hlavní úlohy počítačového vidění na mobilních zařízeních.
Vision zahrnuje více než 25 podtříd VNRequest, rozdělených do kategorií: detekce, rozpoznávání, sledování a klasifikace. Každá podtřída dědí z VNRequest a přidává vlastnosti specifické pro daný úkol.
VNDetectFaceRectanglesRequest — hledání obličejů na obrázku. Vrací VNFaceObservation se souřadnicemi bounding box a confidence. VNDetectHumanRectanglesRequest — podobně pro lidi. VNDetectHumanBodyPoseRequest — určení pózy člověka (kosterní body).
VNRecognizeTextRequest — rozpoznávání textu s podporou 13 jazyků a dvěma úrovněmi přesnosti. VNReadCodeRequest — pro specializované kódy. VNDetectTextRectanglesRequest — hledání oblastí textu bez rozpoznávání (rychlejší, ale pouze obdélníky).
VNClassifyImageRequest — klasifikace obrazu podle 1000 kategorií ImageNet. VNGenerateImageFeaturePrintRequest — extrakce feature vectoru pro porovnávání obrázků. VNDetectContoursRequest — detekce obrysů objektů.
VNImageRequestHandler — handler pro statické obrázky. Přijímá CGImage, CIImage nebo Data (JPEG/PNG) a provádí jeden nebo více VNRequest. To je hlavní způsob použití Vision pro fotografie, snímky obrazovky a nahrané obrázky.
VNSequenceRequestHandler — handler pro sekvence obrázků (snímky videa). Přijímá stejnou sadu typů obrázků, ale je určen pro zpracování snímek po snímku s uchováním stavu mezi snímky (nutné pro sledování objektů).
// VNImageRequestHandler pro jeden obrázek
let imageHandler = VNImageRequestHandler(
cgImage: cgImage,
orientation: orientation,
options: [:])
// VNSequenceRequestHandler pro video
let sequenceHandler = VNSequenceRequestHandler()
try sequenceHandler.perform([trackingRequest],
on: cgImage)
Důležitý rozdíl: VNSequenceRequestHandler nepodporuje paralelní provádění více požadavků — každé volání perform() zpracovává jednu sadu požadavků pro jeden snímek. Pro vícevláknové zpracování videa vytvořte samostatné instance handleru pro různá vlákna.
VNImageRequestHandler může být prováděn ve frontě na pozadí. Apple doporučuje DispatchQueue.global(qos: .userInitiated) pro interaktivní scénáře (uživatel čeká na výsledek) a .background pro dávkové zpracování (např. analýza celé fotoknihovny).
VNObservation — základní třída pro všechny výsledky požadavků Vision. Každá podtřída VNObservation obsahuje data specifická pro typ analýzy: souřadnice bounding box, rozpoznaný text, spolehlivost (confidence), jedinečný identifikátor (uuid) a časovou značku (timeRange).
Klíčové podtřídy VNObservation: VNFaceObservation (výsledek detekce obličeje s bounding box a landmarks), VNRecognizedTextObservation (rozpoznaný text s candidates), VNBarcodeObservation (dekódovaný čárový kód s payload a symbology), VNClassificationObservation (kategorie klasifikace s 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)")
}
}
Vlastnost confidence (od 0.0 do 1.0) je přítomna u všech VNObservation a ukazuje spolehlivost modelu ve výsledek. Apple doporučuje zahazovat pozorování s confidence < 0.5 pro většinu úloh. Pro kritické aplikace (lékařství, bezpečnost) je třeba prah zvýšit na 0.8–0.9.
VNObservation také obsahuje timeRange (pro video požadavky) a uuid (jedinečné ID pro párování mezi snímky). To umožňuje sledování stejného objektu (např. obličeje) sekvencí video snímků.
Jedna z klíčových výhod VNRequest — možnost provádět více různých požadavků na jeden obrázek v jednom volání handler.perform(). Vision interně optimalizuje pořadí provádění a znovu používá společné výpočty (např. předzpracování obrázku).
To umožňuje získat kompletní sadu dat o obrázku v jednom průchodu: současně detekovat obličeje, rozpoznat text, najít čárové kódy a klasifikovat obsah. Tento přístup je výrazně efektivnější než sekvenční volání každého požadavku zvlášť.
import Vision
// Více požadavků v jednom poli
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
])
// Přístup k výsledkům z každého požadavku
print("Faces: \\(faceRequest.results?.count ?? 0)")
print("Text blocks: \\(textRequest.results?.count ?? 0)")
Omezení: ne všechny požadavky lze kombinovat s ostatními. Například VNGenerateImageFeaturePrintRequest musí být proveden samostatně. Apple doporučuje seskupování požadavků podle typu (detekce, rozpoznávání, klasifikace) a testování kombinací na cílových zařízeních.
Výkon: kombinace 3–4 požadavků v jednom perform() je o 30–40% rychlejší než sekvenční provádění, protože Vision znovu používá společné ML výpočty a předzpracování obrázku (změna měřítka, korekce barev).
VNCoreMLRequest — most mezi Core ML a Vision, který umožňuje spouštění libovolného modelu Core ML jako požadavku Vision. Model je zabalen do VNCoreMLModel, předán VNCoreMLRequest a Vision automaticky zpracuje předzpracování obrázku (změna měřítka, oříznutí na velikost vstupu modelu).
VNCoreMLRequest dědí z VNRequest, takže podporuje všechny standardní funkce: regionOfInterest, completion handler, více požadavků. To umožňuje kombinovat vlastní ML model s vestavěnými detektory Vision v jednom pipeline.
import Vision
import CoreML
// Zabalit model Core ML
guard let mlModel = try VNCoreMLModel(
for: MyCustomClassifier().model)
else { return }
// Vytvořit 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 určuje, jak Vision změří obrázek na vstup modelu: .centerCrop (oříznutí ze středu), .scaleFill (roztažení) nebo .scaleFit (změna měřítka s uchováním proporcí). Volba závisí na typu modelu a pozici objektu na obrázku.
Praktický příklad: detekce obličejů přes VNDetectFaceRectanglesRequest, poté klasifikace každého obličeje přes VNCoreMLRequest s vlastním modelem (např. určení pohlaví nebo věku). Kombinací dvou požadavků v jednom perform() získáte kompletní pipeline analýzy obličeje v jednom průchodu.
Často kladené otázky
Ano, každý VNRequest má vlastnost cancel(), která zruší provádění požadavku. Zrušení však funguje pouze do zahájení zpracování — pokud byl ML model již spuštěn, zrušení nepřeruší výpočet. Pro spolehlivé zrušení použijte DispatchWorkItem.cancel() společně s VNRequest.cancel() v completion handler.
VNDetectFaceRectanglesRequest nachází pouze obdélníky obličejů. VNDetectFaceLandmarksRequest navíc určuje 68 klíčových bodů obličeje (oči, obočí, nos, ústa, konturu). VNDetectFaceLandmarksRequest je pomalejší, ale poskytuje více dat pro animaci, masky a AR efekty. Pro jednoduché počítání obličejů stačí VNDetectFaceRectanglesRequest.
Ano, VNDetectBarcodesRequest — správný požadavek pro všechny typy čárových kódů a QR. Podporuje EAN, UPC, Code 39, Code 128, PDF417, Aztec, QR a další formáty. Výsledek je vrácen v VNBarcodeObservation s payload a symbology. Pro video stream použijte AVCaptureMetadataOutput — je rychlejší pro živé skenování.
Ano, VNImageRequestHandler přijímá CIImage přes inicializátor init(ciImage:options:). Podporovány jsou také Data (JPEG/PNG) a NSURL (cesta k souboru). CIImage je výhodný, když je obrázek již načten přes Core Image pipeline — to zabraňuje zbytečnému kopírování dat v paměti.
Neexistuje žádný limit počtu, ale v praxi je 3–5 požadavků optimální množství. Více než 5 požadavků může způsobit nárůst spotřeby paměti, protože každý požadavek načítá svůj vlastní ML model. Pokud potřebujete provést 10+ různých analýz, rozdělte je do 2–3 skupin a provádějte sekvenčně.
Shrnutí
Vyvineme mobilní aplikaci na klíč
IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.
Přečtěte si také