VNCoreMLRequest — bu nima, iOSda Core ML uchun Vision so'rovi

Muallif: IT Sectr Nashr etilgan: 2026-07-20 O'qish vaqti: 8 daq

VNCoreMLRequest — bu VNRequest ning kichik sinfi bo'lib, Core ML modellarini Vision pipeline ichida ishga tushirish imkonini beradi va tayyor Vision detektorlari (yuzlar, matn, ob'ektlar) afzalliklarini klassifikatsiya va regressiya uchun maxsus ML modellari bilan birlashtiradi. Apple Machine Learning Documentation (2024) ma'lumotlariga ko'ra, VNCoreMLRequest avtomatik ravishda rasmni oldindan qayta ishlashni — masshtablash, kesish va rang fazosini konvertatsiya qilishni — Core ML modeli talablariga muvofiq bajaradi.

Asosiy

  • VNCoreMLRequest — Core ML va Vision o'rtasidagi ko'prik: ML modeli Vision so'rovi sifatida ishlaydi.
  • Avtomatik rasmni oldindan qayta ishlash: model talablariga muvofiq masshtablash, kesish va rang tuzatish.
  • Pipeline qurish uchun bir perform() ichida boshqa VNRequest bilan birlashtiriladi.
  • VNCoreMLModel — rasmlar va FeatureValue bilan ishlash uchun MLModel ustidagi o'ramni qo'llab-quvvatlaydi.
  • Maksimal unumdorlik uchun Neural Engine va GPU da ishlaydi.

VNCoreMLRequest nima?

VNCoreMLRequest — bu iOS 11 da Vision bilan birga qo'shilgan VNRequest kichik sinfi bo'lib, Core ML modellarini Vision kontekstida ishga tushirish imkonini beradi. U Core ML modeli uchun zarur bo'lgan barcha rasmni oldindan qayta ishlashni: hajmni o'zgartirish, kesish, normalizatsiya va rang fazosini konvertatsiya qilishni o'z zimmasiga oladi.

VNCoreMLRequestsiz dasturchi UIImage/CGImage ni kerakli o'lchamdagi MultiArray (MLMultiArray) yoki PixelBuffer (CVPixelBuffer) ga qo'lda o'zgartirishi kerak edi. VNCoreMLRequest bu jarayonni avtomatlashtiradi: siz VNImageRequestHandler orqali CGImage ni uzatasiz, VNCoreMLRequest esa uni model kirishiga mos ravishda masshtablaydi.

VNCoreMLRequest VNRequest ning barcha imkoniyatlarini meros qilib oladi: completion handler, regionOfInterest, bir vaqtning o'zida bir nechta so'rovlarni bajarish imkoniyati, VNImageRequestHandler va VNSequenceRequestHandler ni qo'llab-quvvatlash.

swift
import Vision
import CoreML

// 1. Modelni yuklash va o'rash
guard let model = try VNCoreMLModel(
    for: MobileNetV2().model)
else { return }

// 2. VNCoreMLRequest yaratish
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 orqali bajarish
let handler = VNImageRequestHandler(cgImage: image, options: [:])
try handler.perform([request])

VNCoreMLRequest turli xil kirish turlariga ega modellarni qo'llab-quvvatlaydi: rasmlar (Image Feature), MultiArray va Double. Rasmlar uchun Vision avtomatik ravishda CGImage ni kerakli o'lcham va rang fazosidagi CVPixelBuffer ga konvertatsiya qiladi. Boshqa turdagi kirish ma'lumotlari uchun Vision siz Core ML dan to'g'ridan-to'g'ri foydalanishingiz kerak.

Apple WWDC 2023 ma'lumotlariga ko'ra, VNCoreMLRequest rasmlar bilan ishlashda Core ML ni qo'llaydigan barcha iOS ilovalarining 40 foizida ishlatiladi. Bu iOS ilovalariga ML modellarini integratsiya qilishning eng mashhur usuli.

VNCoreMLModel: Core ML modeli ustidagi o'ram

VNCoreMLModel — bu Core ML modelini (MLModel) Vision da foydalanish uchun moslashtiruvchi o'ram. U modelning kirish va chiqish ma'lumotlarini Vision tushunadigan formatga o'zgartiradi: rasm → CVPixelBuffer, natija → VNObservation.

VNCoreMLModel ni ishga tushirish modelning Vision bilan mosligini tekshiradi: model kirishda rasmni (Image Feature) qabul qilishi va klassifikatsiyani (MLMultiArray yoki Dictionary) qaytarishi kerak. Agar model mos kelmasa, ishga tushiruvchi xatolik chiqaradi.

swift
import Vision
import CoreML

// Variant 1: .mlmodel dan (qurish vaqtida kompilyatsiya qilingan)
let model1 = try VNCoreMLModel(
    for: MyVisionModel().model)

// Variant 2: .mlmodelc dan (qurilmada kompilyatsiya qilingan)
let compiledURL = Bundle.main.url(
    forResource: "MyVisionModel",
    withExtension: "mlmodelc")!
let model2 = try VNCoreMLModel(
    for: MLModel(contentsOf: compiledURL))

VNCoreMLModel birinchi yuklashdan keyin modelni xotirada keshlaydi. Xuddi shu modelni qayta yuklash keshlangan nusxani qaytaradi, bu esa keyingi so'rovlarni tezlashtiradi. Biroq, agar model 100 MB dan ortiq bo'lsa, iOS resurslar yetishmasa uni xotiradan tushirishi mumkin — bu holda VNCoreMLModel modelni avtomatik ravishda qayta yuklaydi.

Create ML orqali o'qitilgan modellar uchun VNCoreMLModel qo'shimcha sozlashlarsiz ishlaydi. Create ML modellarni Vision avtomatik ravishda taniydigan to'g'ri metama'lumotlar bilan eksport qiladi — modelni VNCoreMLModel(model:) ga uzatish kifoya.

imageCropAndScaleOption ni sozlash

imageCropAndScaleOption — VNCoreMLRequest ning asosiy xususiyati bo'lib, Vision asl rasmni Core ML model kirish o'lchamiga qanday o'zgartirishini belgilaydi. To'g'ri variantni tanlash klassifikatsiya aniqligiga bevosita ta'sir qiladi.

.centerCrop — rasmni markazdan kvadrat shaklida kesadi, so'ngra model kirish o'lchamiga masshtablaydi. Markazlashtirilgan ob'ektlarda o'qitilgan modellar uchun mos keladi (ko'pchilik ImageNet klassifikatorlari). .scaleFill — rasmni nisbatlarni saqlamasdan kirish o'lchamiga cho'zadi. Tez, lekin geometriyani buzadi. .scaleFit — nisbatlarni saqlab masshtablaydi, chekkalariga letterbox (qora chiziqlar) qo'shadi.

swift
import Vision

let request = VNCoreMLRequest(model: model)

// .centerCrop — markazlashtirilgan ob'ektlar uchun (standart)
request.imageCropAndScaleOption = .centerCrop

// .scaleFill — bir xil teksturalar uchun (buzilishsiz)
request.imageCropAndScaleOption = .scaleFill

// .scaleFit — ob'ekt nisbatlari muhim bo'lganda
request.imageCropAndScaleOption = .scaleFit

Tavsiyalar: ko'pchilik klassifikatsiya modellari uchun .centerCrop dan foydalaning — u aniqlik va unumdorlikning eng yaxshi nisbatini beradi. Agar model nisbatlarni saqlagan rasmlarda o'qitilgan bo'lsa (masalan, hujjat fotosuratlaridagi anomaliyalarni aniqlash), letterbox bilan .scaleFit ni tanlang.

Apple Developer Documentation 2024 ma'lumotlariga ko'ra, imageCropAndScaleOption ni noto'g'ri tanlash model aniqligini 15–25% ga kamaytirishi mumkin. Masalan, kadr chekkasida joylashgan yuz uchun .scaleFill .centerCrop da uning bir qismini kesib tashlashi yoki .scaleFill da nisbatlarni buzishi mumkin.

Boshqa VNRequest bilan birlashtirish

Asosiy kuch VNCoreMLRequest — uni boshqa VNRequest bilan bir perform() chaqiruvida birlashtirish imkoniyati. Bu pipeline larni qurish imkonini beradi: avval yuzlarni topish (VNDetectFaceRectanglesRequest), so'ngra har bir yuzni maxsus Core ML modeli (VNCoreMLRequest) orqali klassifikatsiya qilish.

VNCoreMLRequest shuningdek regionOfInterest ni qo'llab-quvvatlaydi — agar bu maydon o'rnatilgan bo'lsa, Vision Core ML modeliga uzatishdan oldin rasmni belgilangan to'rtburchakgacha kesadi. Bu pipeline lar uchun juda muhim: yuzni aniqlagandan so'ng uning bounding box ini VNCoreMLRequest uchun regionOfInterest sifatida uzatasiz.

swift
import Vision

// 1. Yuzni aniqlash
let faceRequest = VNDetectFaceRectanglesRequest()

// 2. Core ML orqali his-tuyg'u klassifikatsiyasi
guard let emotionModel = try VNCoreMLModel(
    for: EmotionClassifier().model)
else { return }

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

// 3. Har bir yuz uchun regionOfInterest ni o'rnatish
for face in faceRequest.results as? [VNFaceObservation] ?? [] {
    emotionRequest.regionOfInterest = face.boundingBox
    try handler.perform([emotionRequest])
    // His-tuyg'u klassifikatsiyasi natijasini qayta ishlash
}

Cheklov: VNCoreMLRequest uchun regionOfInterest model bir o'lcham va nisbatdagi rasmlarda o'qitilganida ma'noga ega. Agar model qat'iy kvadrat kirishni (224x224) kutayotgan bo'lsa, regionOfInterest bilan .centerCrop eng yaxshi natijani beradi.

Apple ML Research ma'lumotlariga ko'ra, regionOfInterest orqali „aniqlash → klassifikatsiya“ pipeline i butun rasmni klassifikatsiya qilish bilan solishtirganda aniqlikni 20–30% ga oshiradi, chunki ML modeli fon shovqinisiz faqat tegishli maydonni oladi.

Pipeline turiSo'rov 1 (aniqlash)So'rov 2 (ML)Misol
Yuz → his-tuyg'uVNDetectFaceRectanglesRequestVNCoreMLRequestKayfiyatni aniqlash
Ob'ekt → brendVNDetectObjectAtPointRequestVNCoreMLRequestLogotiplarni tanib olish
Matn → tilVNRecognizeTextRequestVNCoreMLRequestMatn tilini klassifikatsiya qilish
Sahna → tavsifVNClassifyImageRequestVNCoreMLRequestTeGlar yaratish

VNCoreMLRequest natijalarini qayta ishlash

VNCoreMLRequest natijalarni VNClassificationObservation (klassifikatsiya modellari uchun) yoki VNCoreMLFeatureValueObservation (regressiya va boshqa turlar uchun) ko'rinishida qaytaradi. Natija turi Core ML modelining chiqish ma'lumotlariga bog'liq.

VNClassificationObservation identifier (sinf nomi) va confidence (ishonchlilik) ni o'z ichiga oladi. Softmax chiqishiga ega modellar confidence bo'yicha kamayish tartibida saralangan bunday kuzatuvlar massivini qaytaradi. VNCoreMLFeatureValueObservation ixtiyoriy MLFeatureValue qiymatini o'z ichiga oladi — MultiArray, Double, String yoki Dictionary bo'lishi mumkin.

swift
// Klassifikatsiya modellari uchun
if let classificationResults = request.results
    as? [VNClassificationObservation] {
    for result in classificationResults
        where result.confidence > 0.5 {
        print("\\(result.identifier): \\(result.confidence)")
    }
}

// Regressiya modellari uchun (xususiyat qiymatlari)
if let featureResults = request.results
    as? [VNCoreMLFeatureValueObservation] {
    for result in featureResults {
        let value = result.featureValue
        print("\\(result.featureName): \\(value)")
    }
}

Confidence bo'yicha filtrlash: Apple umumiy klassifikatorlar uchun confidence < 0.3 va muhim ilovalar uchun < 0.7 bo'lgan natijalarni tashlashni tavsiya qiladi. Balanslangan ma'lumotlar to'plamlarida o'qitilgan modellar uchun confidence to'g'ri javob ehtimoli bilan bog'liq, ammo uni kafolatlamaydi.

VNCoreMLFeatureValueObservation.featureName modelning chiqish qatlami nomiga mos keladi (masalan, "classLabel" yoki "features"). Bu bir nechta chiqishga ega modellarni qayta ishlash imkonini beradi — har bir chiqish noyob featureName bilan alohida observation sifatida taqdim etiladi.

Eng yaxshi amaliyotlar va unumdorlik

VNCoreMLRequest Neural Engine (A12+), GPU va CPU da ishlash uchun optimallashtirilgan. Vision modelning turi va hajmiga qarab bajarish uchun eng yaxshi qurilmani avtomatik ravishda tanlaydi. Biroq, unumdorlikni to'g'ri sozlash bilan qo'shimcha yaxshilash mumkin.

Xotirani boshqarish

Core ML modellari birinchi VNCoreMLRequest da xotiraga yuklanadi va ilova tushirilgunga qadar qoladi. Hajmi 200 MB dan ortiq modellar uchun Apple ularni talab bo'yicha yuklash va MLModel.release() orqali tushirishni tavsiya qiladi. VNCoreMLModel keshlashni o'zi boshqaradi, ammo siz buni autoreleasepool orqali nazorat qilishingiz mumkin.

Paketli qayta ishlash

Rasmlarni paketli qayta ishlash uchun bitta VNCoreMLRequest yarating va uni turli VNImageRequestHandler bilan qayta ishlating. Har bir rasm uchun yangi VNCoreMLRequest yaratmang — bu modelni qayta yuklash tufayli qayta ishlashni sekinlashtiradi. So'rovni qayta ishlatish 10+ rasmni qayta ishlashda unumdorlikni 40% gacha oshiradi.

swift
// To'g'ri: barcha rasmlar uchun bitta so'rov
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 har bir chaqiruvda yangilanadi
}

Qurilmani tanlash: standart bo'yicha Vision A12+ qurilmalarida mos modellar uchun Neural Engine ni tanlaydi. Agar model Neural Engine ni qo'llab-quvvatlamasa, Vision GPU yoki CPU dan foydalanadi. Siz MLModelConfiguration.computeUnits orqali qurilmani majburiy belgilashingiz mumkin, ammo Apple avtomatik tanlashni qoldirishni tavsiya qiladi.

Apple Performance Benchmarks 2024 ma'lumotlariga ko'ra, Neural Engine (iPhone 15 Pro) da VNCoreMLRequest MobileNetV2 klassifikatsiyasini 3–5 ms da, GPU da — 8–12 ms da, CPU da — 20–30 ms da bajaradi. Farq sekundiga 30+ kadrni qayta ishlaydigan real-time ilovalar uchun muhim bo'ladi.

Tez-tez so'raladigan savollar

VNCoreMLRequest dan Vision siz — to'g'ridan-to'g'ri Core ML bilan foydalanish mumkinmi?

Ha, Core ML dan MLModel.prediction() orqali to'g'ridan-to'g'ri, Vision siz foydalanish mumkin. Biroq, VNCoreMLRequest rasmni oldindan qayta ishlashni (masshtablash, kesish, CVPixelBuffer ga konvertatsiya) avtomatlashtiradi. Agar model rasmni emas, balki MultiArray yoki Double ni qabul qilsa — Core ML dan to'g'ridan-to'g'ri foydalaning. VNCoreMLRequest faqat kirishda Image Feature ga ega modellar uchun.

Modelning yangi versiyasi chiqqanda VNCoreMLRequest ni qanday yangilash mumkin?

Yangilangan MLModel dan yangi VNCoreMLModel va yangi VNCoreMLRequest yarating. Eski so'rov modelning eski versiyasidan foydalanishda davom etadi. Modellarni masofadan yangilash uchun serverdan yuklab olingan .mlmodelc faylidan modelni qurilmada kompilyatsiya qilish uchun MLModel.compileModel(at:) dan foydalaning.

VNCoreMLRequest bir nechta kirishga ega modellarni qo'llab-quvvatlaydimi?

VNCoreMLRequest faqat bitta Image Feature kirishiga ega modellarni qo'llab-quvvatlaydi. Agar model bir nechta kirishga ega bo'lsa (masalan, rasm + matn), MLModel orqali Core ML dan to'g'ridan-to'g'ri foydalaning. Vision rasmdan tashqari qo'shimcha parametrlarni uzata olmaydi.

VNCoreMLRequest uchun maksimal rasm o'lchami qancha?

Cheklov — VNImageRequestHandler ga uzatiladigan CGImage uchun 8192 x 8192 piksel. Biroq, Core ML modellari odatda 224x224, 299x299 yoki 512x512 kirishni kutadi. Vision katta rasmni kirish o'lchamiga avtomatik masshtablaydi. Agar asl rasm juda katta bo'lsa, xotirani tejash uchun uni CGImage orqali oldindan kichraytiring.

VNCoreMLRequest ni fon rejimida ishga tushirish mumkinmi?

Ha, VNRequest da preferBackgroundProcessing = true ni o'rnating. Bu tizim resurs talab qiladigan rejimda bo'lsa (masalan, kontent yuklash), Vision ga so'rovni kechiktirish imkonini beradi. Shuningdek, handler.perform() ni chaqirish uchun DispatchQueue.global(qos: .background) dan foydalanish majburiy.

Xulosa

  • VNCoreMLRequest — Vision pipeline ida Core ML modellarini ishga tushirish uchun VNRequest kichik sinfi, rasmlarni avtomatik oldindan qayta ishlash bilan.
  • VNCoreMLModel MLModel ni Vision uchun o'rab, CGImage ni kerakli o'lcham va rang fazosidagi CVPixelBuffer ga avtomatik konvertatsiya qiladi.
  • imageCropAndScaleOption (centerCrop, scaleFill, scaleFit) masshtablash strategiyasini belgilaydi va model aniqligiga 15–25% ta'sir qiladi.
  • VNDetectFaceRectanglesRequest va boshqa VNRequest bilan birlashtirish regionOfInterest bilan „aniqlash → klassifikatsiya“ pipeline larini qurish imkonini beradi.
  • Natijalar VNClassificationObservation (klassifikatsiya uchun) yoki VNCoreMLFeatureValueObservation (regressiya/boshqa turlar uchun) sifatida qaytariladi.
  • Paketli qayta ishlash uchun bitta VNCoreMLRequest ni qayta ishlatish har bir rasm uchun yangisini yaratish bilan solishtirganda unumdorlikni 40% gacha oshiradi.
  • Neural Engine da unumdorlik (MobileNetV2 da 3–5 ms) CPU ga qaraganda 4–6 baravar yuqori, bu real-time ilovalar uchun muhim.

Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz

IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.

Loyihani muhokama qilish

Shuningdek o'qing