VNRequest — шта је то, архитектура захтева Vision у iOS-у

Аутор: IT Sectr Објављено: 2026-07-20 Време читања: 8 мин

VNRequest — апстрактна основна класа оквира Vision која представља јединицу анализе слике или видео тока. Сваки тип анализе — детекција лица, препознавање текста, тражење бар кодова, класификација — имплементиран је као конкретна подкласа VNRequest. Према Apple Developer Documentation (2024), програмер креира инстанцу захтева, конфигурише његове параметре, прослеђује слику кроз VNImageRequestHandler и добија резултате у виду низа VNObservation.

Главно

  • VNRequest — основна класа за све захтеве Vision: анализе слика, видеа и ML модела.
  • Захтев се извршава кроз VNImageRequestHandler (слика) или VNSequenceRequestHandler (видео).
  • Резултати се враћају као низ VNObservation — свака подкласа садржи специфичне податке.
  • Completion handler омогућава асинхрону обраду резултата након завршетка анализе.
  • Више захтева се може извршити једним позивом handler.perform() за једну слику.

Шта је VNRequest у Vision-у?

VNRequest — основни елемент архитектуре Vision, који имплементира образац Request-Response за анализу слика и видеа. Свака подкласа VNRequest одговорна је за конкретан задатак компјутерског вида: проналажење лица, препознавање текста, класификацију садржаја.

Архитектура VNRequest одваја „шта анализирати" (захтев) од „како обрадити" (handler). Програмер конфигурише захтев (тип анализе, додатне параметре) и прослеђује га handler-у заједно са сликом. Handler извршава захтев и враћа резултате, не захтевајући од програмера разумевање унутрашњих ML алгоритама.

Све подкласе VNRequest прате јединствену структуру: иницијализација са опционим completion handler-ом, конфигурисање својстава (регион анализе, ниво прецизности) и прослеђивање handler-у. То чини API предвидљивим и лако проширивим — додавање новог типа анализе значи креирање нове подкласе VNRequest.

swift
import Vision

// 1. Креирај захтев
let request = VNDetectFaceRectanglesRequest { req, _ in
    // 3. Обради резултате
    guard let faces = req.results as? [VNFaceObservation]
    else { return }
    print("Found \\(faces.count) faces")
}

// 2. Изврши кроз handler
let handler = VNImageRequestHandler(cgImage: cgImage, options: [:])
try handler.perform([request])

Кључна својства VNRequest: regionOfInterest (област интересовања на слици за убрзање анализе), preferBackgroundProcessing (позадински режим), revision (верзија алгоритма) и cancellationSupport. Правилна конфигурација ових својстава омогућава оптимизацију перформанси за конкретан задатак.

Према Apple WWDC 2024, за 7 година постојања Vision, број доступних подкласа VNRequest порастао је са 8 (iOS 11) на преко 25 (iOS 18), покривајући све главне задатке компјутерског вида на мобилним уређајима.

Основни типови VNRequest за анализу

Vision укључује преко 25 подкласа VNRequest, подељених у категорије: детекција, препознавање, праћење и класификација. Свака подкласа наслеђује VNRequest и додаје својства специфична за задатак.

Детекција и препознавање

VNDetectFaceRectanglesRequest — тражење лица на слици. Враћа VNFaceObservation са координатама bounding box и confidence. VNDetectHumanRectanglesRequest — аналогно за људе. VNDetectHumanBodyPoseRequest — одређивање позе човека (скелетне тачке).

Анализа текста

VNRecognizeTextRequest — препознавање текста са подршком за 13 језика и два нивоа прецизности. VNReadCodeRequest — за специјализоване кодове. VNDetectTextRectanglesRequest — тражење области текста без препознавања (брже, али само правоугаоници).

Класификација и анализа

VNClassifyImageRequest — класификација слике по 1000 категорија ImageNet. VNGenerateImageFeaturePrintRequest — екстракција feature vector-а за поређење слика. VNDetectContoursRequest — детекција контура објеката.

КатегоријаПример захтеваРезултат
Детекција лицаVNDetectFaceRectanglesRequestVNFaceObservation
Препознавање текстаVNRecognizeTextRequestVNRecognizedTextObservation
Бар кодовиVNDetectBarcodesRequestVNBarcodeObservation
КласификацијаVNClassifyImageRequestVNClassificationObservation
ПраћењеVNTrackObjectRequestVNDetectedObjectObservation
КонтуреVNDetectContoursRequestVNContoursObservation

VNImageRequestHandler и VNSequenceRequestHandler

VNImageRequestHandler — handler за статичне слике. Прима CGImage, CIImage или Data (JPEG/PNG) и извршава један или више VNRequest. Ово је основни начин коришћења Vision за фотографије, снимке екрана и отпремљене слике.

VNSequenceRequestHandler — handler за секвенце слика (кадрове видеа). Прима исти скуп типова слика, али је намењен за обраду кадар по кадар са чувањем стања између кадрова (потребно за праћење објеката).

swift
// VNImageRequestHandler за једну слику
let imageHandler = VNImageRequestHandler(
    cgImage: cgImage,
    orientation: orientation,
    options: [:])

// VNSequenceRequestHandler за видео
let sequenceHandler = VNSequenceRequestHandler()
try sequenceHandler.perform([trackingRequest],
    on: cgImage)

Важна разлика: VNSequenceRequestHandler не подржава паралелно извршавање више захтева — сваки позив perform() обрађује један скуп захтева за један кадар. За више нитно обраду видеа, креирајте засебне инстанце handler-а за различите нити.

VNImageRequestHandler може да се извршава у позадинском реду. Apple препоручује DispatchQueue.global(qos: .userInitiated) за интерактивне сценарије (корисник чека резултат) и .background за пакетну обраду (нпр. анализа целе фото библиотеке).

VNObservation: структура резултата

VNObservation — основна класа за све резултате захтева Vision. Свака подкласа VNObservation садржи податке специфичне за тип анализе: координате bounding box-а, препознат текст, поузданост (confidence), јединствени идентификатор (uuid) и временску ознаку (timeRange).

Кључне подкласе VNObservation: VNFaceObservation (резултат детекције лица са bounding box-ом и landmarks), VNRecognizedTextObservation (препознат текст са candidates), VNBarcodeObservation (декодиран бар код са payload и symbology), VNClassificationObservation (категорија класификације са 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)")
    }
}

Својство confidence (од 0.0 до 1.0) присутно је код свих VNObservation и показује поузданост модела у резултат. Apple препоручује одбацивање опсервација са confidence < 0.5 за већину задатака. За критичне апликације (медицина, безбедност) праг треба подићи на 0.8–0.9.

VNObservation такође садржи timeRange (за видео захтеве) и uuid (јединствени ID за подударање између кадрова). Ово омогућава праћење истог објекта (нпр. лица) кроз секвенцу видео кадрова.

Извршавање више захтева истовремено

Једна од кључних предности VNRequest — могућност извршавања више различитих захтева за једну слику у једном позиву handler.perform(). Vision интерно оптимизује редослед извршавања и поново користи заједничка израчунавања (нпр. претходну обраду слике).

Ово омогућава добијање комплетног скупа података о слици у једном пролазу: истовремено детектовати лица, препознати текст, пронаћи бар кодове и класификовати садржај. Овај приступ је значајно ефикаснији од секвенцијалног позивања сваког захтева појединачно.

swift
import Vision

// Више захтева у једном низу
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
])

// Приступ резултатима из сваког захтева
print("Faces: \\(faceRequest.results?.count ?? 0)")
print("Text blocks: \\(textRequest.results?.count ?? 0)")

Ограничења: не могу се сви захтеви комбиновати са другима. На пример, VNGenerateImageFeaturePrintRequest мора да се извршава одвојено. Apple препоручује груписање захтева по типу (детекција, препознавање, класификација) и тестирање комбинација на циљним уређајима.

Перформансе: комбиновање 3–4 захтева у једном perform() је 30–40% брже од секвенцијалног извршавања, јер Vision поново користи заједничка ML израчунавања и претходну обраду слике (скалирање, корекцију боја).

Прилагођени захтеви са VNCoreMLRequest

VNCoreMLRequest — мост између Core ML и Vision-а, који омогућава покретање било ког Core ML модела као захтева Vision-а. Модел се умотава у VNCoreMLModel, прослеђује VNCoreMLRequest-у, а Vision аутоматски обрађује претходну припрему слике (скалирање, исецање на величину улаза модела).

VNCoreMLRequest наслеђује VNRequest, тако да подржава све стандардне могућности: regionOfInterest, completion handler, вишеструке захтеве. Ово омогућава комбиновање прилагођеног ML модела са уграђеним детекторима Vision-а у једном pipeline-у.

swift
import Vision
import CoreML

// Умотај Core ML модел
guard let mlModel = try VNCoreMLModel(
    for: MyCustomClassifier().model)
else { return }

// Креирај 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 одређује како Vision скалира слику на улаз модела: .centerCrop (исецање из центра), .scaleFill (растезање) или .scaleFit (скалирање са очувањем пропорција). Избор зависи од типа модела и положаја објекта на слици.

Практичан пример: детекција лица кроз VNDetectFaceRectanglesRequest, затим класификација сваког лица кроз VNCoreMLRequest са прилагођеним моделом (нпр. одређивање пола или година). Комбиновањем два захтева у једном perform()-у, добијате комплетан pipeline анализе лица у једном пролазу.

Често постављана питања

Може ли се отказати VNRequest који се извршава?

Да, сваки VNRequest има својство cancel() које отказује извршавање захтева. Међутим, отказивање ради само до почетка обраде — ако је ML модел већ покренут, отказивање неће прекинути израчунавање. За поуздано отказивање користите DispatchWorkItem.cancel() заједно са VNRequest.cancel() у completion handler-у.

VNDetectFaceRectanglesRequest и VNDetectFaceLandmarksRequest — у чему је разлика?

VNDetectFaceRectanglesRequest проналази само правоугаонике лица. VNDetectFaceLandmarksRequest додатно одређује 68 кључних тачака лица (очи, обрве, нос, уста, контуру). VNDetectFaceLandmarksRequest је спорији, али даје више података за анимацију, маске и AR ефекте. За једноставно бројање лица довољан је VNDetectFaceRectanglesRequest.

Који захтев се користи за тражење бар кодова — VNDetectBarcodesRequest?

Да, VNDetectBarcodesRequest — прави захтев за све типове бар кодова и QR кодова. Подржава EAN, UPC, Code 39, Code 128, PDF417, Aztec, QR и друге формате. Резултат се враћа у VNBarcodeObservation са payload и symbology. За видео ток користите AVCaptureMetadataOutput — бржи је за живо скенирање.

Може ли се VNRequest извршити на CIImage уместо на CGImage?

Да, VNImageRequestHandler прима CIImage кроз иницијализатор init(ciImage:options:). Такође су подржани Data (JPEG/PNG) и NSURL (путања до датотеке). CIImage је згодан када је слика већ учитана кроз Core Image pipeline — ово избегава непотребно копирање података у меморији.

Колико VNRequest се може извршити у једном perform()-у?

Нема ограничења по броју, али у пракси 3–5 захтева је оптималан број. Више од 5 захтева може изазвати раст потрошње меморије, јер сваки захтев учитава свој ML модел. Ако треба да извршите 10+ различитих анализа, поделите их у 2–3 групе и извршавајте секвенцијално.

Резиме

  • VNRequest — основна класа Vision за све типове анализе слика и видеа са јединственом Request-Response архитектуром.
  • Vision укључује преко 25 подкласа VNRequest за детекцију лица, OCR, бар кодове, класификацију, контуре, праћење и ML моделе.
  • VNImageRequestHandler извршава захтеве на статичним сликама; VNSequenceRequestHandler — на секвенцама кадрова за праћење.
  • Резултати се враћају као VNObservation са bounding box-ом, confidence, uuid-ом и подацима специфичним за тип.
  • Вишеструки захтеви у једном perform()-у раде 30–40% брже од секвенцијалних позива захваљујући поновном коришћењу ML израчунавања.
  • VNCoreMLRequest интегрише прилагођене Core ML моделе у pipeline Vision-а са аутоматском претходном обрадом слика.
  • Сви захтеви се извршавају на уређају без слања података на сервер, обезбеђујући поверљивост и офлајн рад.

Развићемо мобилну апликацију под кључ

IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.

Разговарајте о пројекту

Прочитајте такође