VNRequest — co to je, architektura požadavků Vision v iOS

Autor: IT Sectr Publikováno: 2026-07-20 Doba čtení: 8 min

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 — základní třída pro všechny požadavky Vision: analýzu obrázků, videa a ML modelů.
  • Požadavek se provádí přes VNImageRequestHandler (obrázek) nebo VNSequenceRequestHandler (video).
  • Výsledky jsou vráceny jako pole VNObservation — každá podtřída obsahuje specifická data.
  • Completion handler umožňuje asynchronní zpracování výsledků po dokončení analýzy.
  • Více požadavků lze provést jedním voláním handler.perform() pro jeden obrázek.

Co je VNRequest ve Vision?

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.

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

Hlavní typy VNRequest pro analýzu

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.

Detekce a rozpoznávání

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

Analýza textu

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

Klasifikace a analýza

VNClassifyImageRequest — klasifikace obrazu podle 1000 kategorií ImageNet. VNGenerateImageFeaturePrintRequest — extrakce feature vectoru pro porovnávání obrázků. VNDetectContoursRequest — detekce obrysů objektů.

VNImageRequestHandler a VNSequenceRequestHandler

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

swift
// 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: struktura výsledků

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

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

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

Provádění více požadavků současně

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ášť.

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

Vlastní požadavky s VNCoreMLRequest

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.

swift
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

Lze zrušit právě prováděný VNRequest?

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 a VNDetectFaceLandmarksRequest — jaký je rozdíl?

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.

Který požadavek se používá pro hledání čárových kódů — VNDetectBarcodesRequest?

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

Lze provést VNRequest na CIImage místo CGImage?

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.

Kolik VNRequest lze provést v jednom perform()?

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í

  • VNRequest — základní třída Vision pro všechny typy analýzy obrázků a videa s jednotnou architekturou Request-Response.
  • Vision zahrnuje více než 25 podtříd VNRequest pro detekci obličejů, OCR, čárové kódy, klasifikaci, obrysy, sledování a ML modely.
  • VNImageRequestHandler provádí požadavky na statických obrázcích; VNSequenceRequestHandler — na sekvencích snímků pro sledování.
  • Výsledky jsou vráceny jako VNObservation s bounding box, confidence, uuid a daty specifickými pro typ.
  • Více požadavků v jednom perform() pracuje o 30–40% rychleji než sekvenční volání díky znovupoužití ML výpočtů.
  • VNCoreMLRequest integruje vlastní modely Core ML do pipeline Vision s automatickým předzpracováním obrázků.
  • Všechny požadavky jsou prováděny na zařízení bez odesílání dat na server, což zajišťuje soukromí a offline práci.

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

Prodiskutovat projekt

Přečtěte si také