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 — 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.
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 — 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.
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 — 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.
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.
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.
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 turi | So'rov 1 (aniqlash) | So'rov 2 (ML) | Misol |
|---|---|---|---|
| Yuz → his-tuyg'u | VNDetectFaceRectanglesRequest | VNCoreMLRequest | Kayfiyatni aniqlash |
| Ob'ekt → brend | VNDetectObjectAtPointRequest | VNCoreMLRequest | Logotiplarni tanib olish |
| Matn → til | VNRecognizeTextRequest | VNCoreMLRequest | Matn tilini klassifikatsiya qilish |
| Sahna → tavsif | VNClassifyImageRequest | VNCoreMLRequest | TeGlar yaratish |
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.
// 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.
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.
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.
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.
// 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
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.
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 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.
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.
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
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.
Shuningdek o'qing