VNCoreMLRequest — шта је то, Vision захтев за Core ML у iOS-у

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

VNCoreMLRequest — је подкласа VNRequest која омогућава покретање Core ML модела унутар Vision пајплајна, комбинујући предности готових Vision детектора (лица, текст, објекти) са прилагођеним ML моделима за класификацију и регресију. Према Apple Machine Learning Documentation (2024), VNCoreMLRequest аутоматски обрађује предобраду слике — скалирање, обрезивање и конверзију простор боја — у складу са захтевима Core ML модела.

Главно

  • VNCoreMLRequest — мост између Core ML и Vision: ML модел ради као Vision захтев.
  • Аутоматска предобрада слика: скалирање, crop и корекција боја према захтевима модела.
  • Комбинује се са другим VNRequest у једном perform() за изградњу пајплајнова.
  • Подржава VNCoreMLModel — омот око MLModel за рад са сликама и FeatureValue.
  • Ради на Neural Engine и GPU за максималне перформансе.

Шта је VNCoreMLRequest?

VNCoreMLRequest — је подкласа VNRequest, додата у iOS 11 заједно са Vision, која омогућава покретање Core ML модела у контексту Vision. Он преузима сву предобраду слике потребну за Core ML модел: промену величине, обрезивање, нормализацију и конверзију простор боја.

Без VNCoreMLRequest програмер би морао ручно да конвертује UIImage/CGImage у MultiArray (MLMultiArray) или PixelBuffer (CVPixelBuffer) одговарајуће величине. VNCoreMLRequest аутоматизује овај процес: прослеђујете CGImage преко VNImageRequestHandler, а VNCoreMLRequest сам скалира га на улаз модела.

VNCoreMLRequest наслеђује све могућности VNRequest: completion handler, regionOfInterest, могућност извршавања више захтева истовремено, подршку за VNImageRequestHandler и VNSequenceRequestHandler.

swift
import Vision
import CoreML

// 1. Учитај и умотај модел
guard let model = try VNCoreMLModel(
    for: MobileNetV2().model)
else { return }

// 2. Креирај VNCoreMLRequest
let request = VNCoreMLRequest(model: model) { req, _ in
    guard let results = req.results
        as? [VNClassificationObservation]
    else { return }
    for r in results.prefix(3) {
        print("\\(r.identifier): \\(r.confidence)")
    }
}

// 3. Изврши преко handler-a
let handler = VNImageRequestHandler(cgImage: image, options: [:])
try handler.perform([request])

VNCoreMLRequest подржава моделе са различитим типовима улаза: слике (Image Feature), MultiArray и Double. За слике Vision аутоматски конвертује CGImage у CVPixelBuffer потребне величине и простор боја. За друге типове улазних података потребно је користити Core ML директно без Vision.

Према Apple WWDC 2023, VNCoreMLRequest се користи у 40% свих iOS апликација које примењују Core ML за рад са сликама. Ово је најпопуларнији начин интеграције ML модела у iOS апликације.

VNCoreMLModel: омот око Core ML модела

VNCoreMLModel — је омот који адаптира Core ML модел (MLModel) за коришћење у Vision. Он конвертује улазне и излазне податке модела у формат разумљив Vision-у: слика → CVPixelBuffer, резултат → VNObservation.

Иницијализација VNCoreMLModel проверава компатибилност модела са Vision: модел мора примати слику на улазу (Image Feature) и враћати класификацију (MLMultiArray или Dictionary). Ако модел није компатибилан, иницијализатор баца грешку.

swift
import Vision
import CoreML

// Опција 1: Из .mlmodel (компајлиран у време изградње)
let model1 = try VNCoreMLModel(
    for: MyVisionModel().model)

// Опција 2: Из .mlmodelc (компајлиран на уређају)
let compiledURL = Bundle.main.url(
    forResource: "MyVisionModel",
    withExtension: "mlmodelc")!
let model2 = try VNCoreMLModel(
    for: MLModel(contentsOf: compiledURL))

VNCoreMLModel кешира модел у меморији након првог учитавања. Поновно учитавање истог модела враћа кеширани примерак, што убрзава наредне захтеве. Међутим, ако модел тежи више од 100 MB, iOS може да га истовари из меморије при недостатку ресурса — у том случају VNCoreMLModel ће поново учитати модел аутоматски.

За моделе обучене путем Create ML, VNCoreMLModel ради без додатног подешавања. Create ML извози моделе са исправним метаподацима које Vision препознаје аутоматски — довољно је проследити модел у VNCoreMLModel(model:).

Подешавање imageCropAndScaleOption

imageCropAndScaleOption — кључно својство VNCoreMLRequest које одређује како Vision трансформише изворну слику на величину улаза Core ML модела. Избор правилне опције директно утиче на тачност класификације.

.centerCrop — обрезује слику по центру до квадрата, затим скалира на величину улаза модела. Погодно за моделе обучене на центрираним објектима (већина ImageNet класификатора). .scaleFill — развлачи слику на величину улаза без чувања пропорција. Брзо, али изобличује геометрију. .scaleFit — скалира са чувањем пропорција, додајући letterbox (црне траке) по ивицама.

swift
import Vision

let request = VNCoreMLRequest(model: model)

// .centerCrop — за центриране објекте (подразумевано)
request.imageCropAndScaleOption = .centerCrop

// .scaleFill — за униформне текстуре (без изобличења)
request.imageCropAndScaleOption = .scaleFill

// .scaleFit — када су пропорције објекта важне
request.imageCropAndScaleOption = .scaleFit

Препоруке: за већину модела класификације користите .centerCrop — он даје најбољи однос тачности и перформанси. Ако је модел обучен на сликама са чувањем пропорција (на пример, детекција аномалија на фотографијама докумената), бирајте .scaleFit са letterbox.

Према Apple Developer Documentation 2024, неправилан избор imageCropAndScaleOption може смањити тачност модела за 15–25%. На пример, .scaleFill за лице смештено на ивици кадра може одсећи његов део при .centerCrop или изобличити пропорције при .scaleFill.

Комбиновање са другим VNRequest

Главна снага VNCoreMLRequest — могућност комбиновања са другим VNRequest у једном позиву perform(). Ово омогућава изградњу пајплајнова: прво пронаћи лица (VNDetectFaceRectanglesRequest), затим класификовати свако лице кроз прилагођени Core ML модел (VNCoreMLRequest).

VNCoreMLRequest такође подржава regionOfInterest — ако поставите ову област, Vision ће одсећи слику до наведеног правоугаоника пре прослеђивања Core ML моделу. Ово је критично за пајплајнове: након детекције лица прослеђујете његов bounding box као regionOfInterest за VNCoreMLRequest.

swift
import Vision

// 1. Детекција лица
let faceRequest = VNDetectFaceRectanglesRequest()

// 2. Класификација емоција путем Core ML
guard let emotionModel = try VNCoreMLModel(
    for: EmotionClassifier().model)
else { return }

let emotionRequest = VNCoreMLRequest(model: emotionModel)
try handler.perform([faceRequest, emotionRequest])

// 3. Постави regionOfInterest за свако лице
for face in faceRequest.results as? [VNFaceObservation] ?? [] {
    emotionRequest.regionOfInterest = face.boundingBox
    try handler.perform([emotionRequest])
    // Обради резултат класификације емоција
}

Ограничење: regionOfInterest за VNCoreMLRequest има смисла када је модел обучен на сликама једне величине и пропорције. Ако модел очекује строго квадратан улаз (224x224), .centerCrop са regionOfInterest даће најбољи резултат.

Према Apple ML Research, пајплајн „детекција → класификација“ кроз regionOfInterest даје повећање тачности за 20–30% у поређењу са класификацијом целе слике, јер ML модел добија на улаз само релевантну област без позадинског шума.

Тип пајплајнаЗахтев 1 (детекција)Захтев 2 (ML)Пример
Лице → емоцијаVNDetectFaceRectanglesRequestVNCoreMLRequestОдређивање расположења
Објекат → брендVNDetectObjectAtPointRequestVNCoreMLRequestПрепознавање логотипа
Текст → језикVNRecognizeTextRequestVNCoreMLRequestКласификација језика текста
Сцена → описVNClassifyImageRequestVNCoreMLRequestГенерисање ознака

Обрада резултата VNCoreMLRequest

VNCoreMLRequest враћа резултате у облику VNClassificationObservation (за класификационе моделе) или VNCoreMLFeatureValueObservation (за регресионе и друге типове). Тип резултата зависи од излазних података Core ML модела.

VNClassificationObservation садржи identifier (назив класе) и confidence (сигурност). Модели са softmax излазом враћају низ таквих запажања, сортираних по опадајућем confidence. VNCoreMLFeatureValueObservation садржи произвољну вредност MLFeatureValue — може бити MultiArray, Double, String или Dictionary.

swift
// За класификационе моделе
if let classificationResults = request.results
    as? [VNClassificationObservation] {
    for result in classificationResults
        where result.confidence > 0.5 {
        print("\\(result.identifier): \\(result.confidence)")
    }
}

// За регресионе моделе (вредности карактеристика)
if let featureResults = request.results
    as? [VNCoreMLFeatureValueObservation] {
    for result in featureResults {
        let value = result.featureValue
        print("\\(result.featureName): \\(value)")
    }
}

Филтрирање по confidence: Apple препоручује одбацивање резултата са confidence < 0.3 за опште класификаторе и < 0.7 за критичне апликације. За моделе обучене на балансираним скуповима података, confidence корелира са вероватноћом тачног одговора, али не гарантује је.

VNCoreMLFeatureValueObservation.featureName одговара имену излазног слоја модела (на пример, "classLabel" или "features"). Ово омогућава обраду модела са више излаза — сваки излаз је представљен посебним observation-ом са јединственим featureName.

Најбоље праксе и перформансе

VNCoreMLRequest је оптимизован за рад на Neural Engine (A12+), GPU и CPU. Vision аутоматски бира најбољи уређај за извршење модела у зависности од његовог типа и величине. Међутим, перформансе се могу додатно побољшати правилним подешавањем.

Управљање меморијом

Core ML модели се учитавају у меморију при првом VNCoreMLRequest и остају тамо до истовара апликације. За моделе величине веће од 200 MB Apple препоручује учитавање по потреби и истовар путем MLModel.release(). VNCoreMLModel сама управља кеширањем, али можете контролисати ово кроз autoreleasepool.

Групна обрада

За пакетну обраду слика креирајте један VNCoreMLRequest и поново га користите са различитим VNImageRequestHandler. Немојте креирати нови VNCoreMLRequest за сваку слику — то ће успорити обраду због поновног учитавања модела. Поновно коришћење захтева даје повећање перформанси до 40% при обради 10+ слика.

swift
// Исправно: један захтев за све слике
let batchSize = 20
let batchRequest = VNCoreMLRequest(model: model)

for i in 0..<batchSize {
    let handler = VNImageRequestHandler(
        cgImage: images[i],
        options: [:])
    try handler.perform([batchRequest])
    // batchRequest.results се ажурира при сваком позиву
}

Избор уређаја: подразумевано Vision бира Neural Engine за компатибилне моделе на уређајима A12+. Ако модел не подржава Neural Engine, Vision користи GPU или CPU. Можете присилно одредити уређај путем MLModelConfiguration.computeUnits, али Apple препоручује да оставите аутоматски избор.

Према Apple Performance Benchmarks 2024, VNCoreMLRequest на Neural Engine (iPhone 15 Pro) обрађује класификацију MobileNetV2 за 3–5 ms, на GPU — 8–12 ms, на CPU — 20–30 ms. Разлика постаје критична за real-time апликације које обрађују 30+ кадрова у секунди.

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

Може ли се VNCoreMLRequest користити без Vision — директно са Core ML?

Да, Core ML се може користити директно путем MLModel.prediction(), без Vision. Међутим, VNCoreMLRequest аутоматизује предобраду слика (скалирање, crop, конверзију у CVPixelBuffer). Ако модел прима не слику, већ MultiArray или Double — користите Core ML директно. VNCoreMLRequest је само за моделе са Image Feature на улазу.

Како ажурирати VNCoreMLRequest када изађе нова верзија модела?

Креирајте нови VNCoreMLModel из ажурираног MLModel и нови VNCoreMLRequest. Стари захтев ће наставити да користи стару верзију модела. За даљинско ажурирање модела користите MLModel.compileModel(at:) за компилацију модела на уређају из .mlmodelc фајла преузетог са сервера.

Да ли VNCoreMLRequest подржава моделе са више улаза?

VNCoreMLRequest подржава само моделе са једним Image Feature улазом. Ако модел има више улаза (на пример, слика + текст), користите Core ML директно путем MLModel. Vision не може проследити додатне параметре осим слике.

Која је максимална величина слике за VNCoreMLRequest?

Ограничење — 8192 x 8192 пиксела за CGImage који се прослеђује VNImageRequestHandler. Међутим, Core ML модели обично очекују улаз 224x224, 299x299 или 512x512. Vision аутоматски скалира велику слику на величину улаза. Ако је изворна слика превише велика, претходно је смањите путем CGImage ради уштеде меморије.

Може ли се VNCoreMLRequest покренути у позадинском режиму?

Да, поставите preferBackgroundProcessing = true на VNRequest. Ово ће омогућити Vision-у да одложи извршење захтева ако је систем у режиму интензивног коришћења ресурса (на пример, учитавање садржаја). Такође обавезно користите DispatchQueue.global(qos: .background) за позив handler.perform().

Закључци

  • VNCoreMLRequest — подкласа VNRequest за покретање Core ML модела у Vision пајплајну са аутоматском предобрадом слика.
  • VNCoreMLModel умотава MLModel за Vision, аутоматски конвертујући CGImage у CVPixelBuffer потребне величине и простор боја.
  • imageCropAndScaleOption (centerCrop, scaleFill, scaleFit) одређује стратегију скалирања и утиче на тачност модела за 15–25%.
  • Комбиновање са VNDetectFaceRectanglesRequest и другим VNRequest омогућава изградњу пајплајнова „детекција → класификација“ са regionOfInterest.
  • Резултати се враћају као VNClassificationObservation (за класификацију) или VNCoreMLFeatureValueObservation (за регресију/друге типове).
  • Поновно коришћење једног VNCoreMLRequest за пакетну обраду даје до 40% повећања перформанси у поређењу са креирањем новог за сваку слику.
  • Перформансе на Neural Engine (3–5 ms на MobileNetV2) су 4–6 пута веће него на CPU, што је критично за real-time апликације.

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

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

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

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