VNRequest — апстрактна основна класа оквира Vision која представља јединицу анализе слике или видео тока. Сваки тип анализе — детекција лица, препознавање текста, тражење бар кодова, класификација — имплементиран је као конкретна подкласа VNRequest. Према Apple Developer Documentation (2024), програмер креира инстанцу захтева, конфигурише његове параметре, прослеђује слику кроз VNImageRequestHandler и добија резултате у виду низа VNObservation.
Главно
VNRequest — основни елемент архитектуре Vision, који имплементира образац Request-Response за анализу слика и видеа. Свака подкласа VNRequest одговорна је за конкретан задатак компјутерског вида: проналажење лица, препознавање текста, класификацију садржаја.
Архитектура VNRequest одваја „шта анализирати" (захтев) од „како обрадити" (handler). Програмер конфигурише захтев (тип анализе, додатне параметре) и прослеђује га handler-у заједно са сликом. Handler извршава захтев и враћа резултате, не захтевајући од програмера разумевање унутрашњих ML алгоритама.
Све подкласе VNRequest прате јединствену структуру: иницијализација са опционим completion handler-ом, конфигурисање својстава (регион анализе, ниво прецизности) и прослеђивање handler-у. То чини API предвидљивим и лако проширивим — додавање новог типа анализе значи креирање нове подкласе VNRequest.
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), покривајући све главне задатке компјутерског вида на мобилним уређајима.
Vision укључује преко 25 подкласа VNRequest, подељених у категорије: детекција, препознавање, праћење и класификација. Свака подкласа наслеђује VNRequest и додаје својства специфична за задатак.
VNDetectFaceRectanglesRequest — тражење лица на слици. Враћа VNFaceObservation са координатама bounding box и confidence. VNDetectHumanRectanglesRequest — аналогно за људе. VNDetectHumanBodyPoseRequest — одређивање позе човека (скелетне тачке).
VNRecognizeTextRequest — препознавање текста са подршком за 13 језика и два нивоа прецизности. VNReadCodeRequest — за специјализоване кодове. VNDetectTextRectanglesRequest — тражење области текста без препознавања (брже, али само правоугаоници).
VNClassifyImageRequest — класификација слике по 1000 категорија ImageNet. VNGenerateImageFeaturePrintRequest — екстракција feature vector-а за поређење слика. VNDetectContoursRequest — детекција контура објеката.
| Категорија | Пример захтева | Резултат |
|---|---|---|
| Детекција лица | VNDetectFaceRectanglesRequest | VNFaceObservation |
| Препознавање текста | VNRecognizeTextRequest | VNRecognizedTextObservation |
| Бар кодови | VNDetectBarcodesRequest | VNBarcodeObservation |
| Класификација | VNClassifyImageRequest | VNClassificationObservation |
| Праћење | VNTrackObjectRequest | VNDetectedObjectObservation |
| Контуре | VNDetectContoursRequest | VNContoursObservation |
VNImageRequestHandler — handler за статичне слике. Прима CGImage, CIImage или Data (JPEG/PNG) и извршава један или више VNRequest. Ово је основни начин коришћења Vision за фотографије, снимке екрана и отпремљене слике.
VNSequenceRequestHandler — handler за секвенце слика (кадрове видеа). Прима исти скуп типова слика, али је намењен за обраду кадар по кадар са чувањем стања између кадрова (потребно за праћење објеката).
// 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 — основна класа за све резултате захтева Vision. Свака подкласа VNObservation садржи податке специфичне за тип анализе: координате bounding box-а, препознат текст, поузданост (confidence), јединствени идентификатор (uuid) и временску ознаку (timeRange).
Кључне подкласе VNObservation: VNFaceObservation (резултат детекције лица са bounding box-ом и landmarks), VNRecognizedTextObservation (препознат текст са candidates), VNBarcodeObservation (декодиран бар код са payload и symbology), VNClassificationObservation (категорија класификације са 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)")
}
}
Својство confidence (од 0.0 до 1.0) присутно је код свих VNObservation и показује поузданост модела у резултат. Apple препоручује одбацивање опсервација са confidence < 0.5 за већину задатака. За критичне апликације (медицина, безбедност) праг треба подићи на 0.8–0.9.
VNObservation такође садржи timeRange (за видео захтеве) и uuid (јединствени ID за подударање између кадрова). Ово омогућава праћење истог објекта (нпр. лица) кроз секвенцу видео кадрова.
Једна од кључних предности VNRequest — могућност извршавања више различитих захтева за једну слику у једном позиву handler.perform(). Vision интерно оптимизује редослед извршавања и поново користи заједничка израчунавања (нпр. претходну обраду слике).
Ово омогућава добијање комплетног скупа података о слици у једном пролазу: истовремено детектовати лица, препознати текст, пронаћи бар кодове и класификовати садржај. Овај приступ је значајно ефикаснији од секвенцијалног позивања сваког захтева појединачно.
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 — мост између Core ML и Vision-а, који омогућава покретање било ког Core ML модела као захтева Vision-а. Модел се умотава у VNCoreMLModel, прослеђује VNCoreMLRequest-у, а Vision аутоматски обрађује претходну припрему слике (скалирање, исецање на величину улаза модела).
VNCoreMLRequest наслеђује VNRequest, тако да подржава све стандардне могућности: regionOfInterest, completion handler, вишеструке захтеве. Ово омогућава комбиновање прилагођеног ML модела са уграђеним детекторима Vision-а у једном pipeline-у.
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 има својство cancel() које отказује извршавање захтева. Међутим, отказивање ради само до почетка обраде — ако је ML модел већ покренут, отказивање неће прекинути израчунавање. За поуздано отказивање користите DispatchWorkItem.cancel() заједно са VNRequest.cancel() у completion handler-у.
VNDetectFaceRectanglesRequest проналази само правоугаонике лица. VNDetectFaceLandmarksRequest додатно одређује 68 кључних тачака лица (очи, обрве, нос, уста, контуру). VNDetectFaceLandmarksRequest је спорији, али даје више података за анимацију, маске и AR ефекте. За једноставно бројање лица довољан је VNDetectFaceRectanglesRequest.
Да, VNDetectBarcodesRequest — прави захтев за све типове бар кодова и QR кодова. Подржава EAN, UPC, Code 39, Code 128, PDF417, Aztec, QR и друге формате. Резултат се враћа у VNBarcodeObservation са payload и symbology. За видео ток користите AVCaptureMetadataOutput — бржи је за живо скенирање.
Да, VNImageRequestHandler прима CIImage кроз иницијализатор init(ciImage:options:). Такође су подржани Data (JPEG/PNG) и NSURL (путања до датотеке). CIImage је згодан када је слика већ учитана кроз Core Image pipeline — ово избегава непотребно копирање података у меморији.
Нема ограничења по броју, али у пракси 3–5 захтева је оптималан број. Више од 5 захтева може изазвати раст потрошње меморије, јер сваки захтев учитава свој ML модел. Ако треба да извршите 10+ различитих анализа, поделите их у 2–3 групе и извршавајте секвенцијално.
Резиме
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође