VNRequest — Vision freymvorkining abstrakt bazaviy sinifi bo‘lib, tasvir yoki video oqimining tahlil birligini ifodalaydi. Tahlilning har bir turi — yuzlarni aniqlash, matnni tanib olish, shtrixkodlarni qidirish, klassifikatsiya — VNRequestning aniq bir subclassi sifatida amalga oshirilgan. Apple Developer Documentation (2024) ma’lumotlariga ko‘ra, dasturchi so‘rov namunasini yaratadi, uning parametrlarini konfiguratsiya qiladi, tasvirni VNImageRequestHandler orqali uzatadi va natijalarni VNObservation massivi shaklida oladi.
Asosiy
VNRequest — tasvir va videolarni tahlil qilish uchun Request-Response andozasini amalga oshiradigan Vision arxitekturasining asosiy elementi. VNRequestning har bir subclassi kompyuter ko‘rishning aniq bir vazifasi uchun javobgardir: yuzlarni qidirish, matnni tanib olish, mazmunni klassifikatsiya qilish.
VNRequest arxitekturasi „nimani tahlil qilish” (so‘rov) ni „qanday qayta ishlash” (handler) dan ajratadi. Dasturchi so‘rovni (tahlil turi, qo‘shimcha parametrlar) konfiguratsiya qiladi va uni tasvir bilan birga handlerga uzatadi. Handler so‘rovni bajaradi va natijalarni qaytaradi, dasturchidan ichki ML algoritmlarini tushunishni talab qilmaydi.
Barcha VNRequest subclasslari yagona tuzilishga amal qiladi: ixtiyoriy completion handler bilan ishga tushirish, xususiyatlarni konfiguratsiya qilish (tahlil hududi, aniqlik darajasi) va handlerga uzatish. Bu API ni bashorat qilinadigan va oson kengaytiriladigan qiladi — yangi tahlil turini qo‘shish VNRequestning yangi subclassini yaratish demakdir.
import Vision
// 1. So‘rov yaratish
let request = VNDetectFaceRectanglesRequest { req, _ in
// 3. Natijalarni qayta ishlash
guard let faces = req.results as? [VNFaceObservation]
else { return }
print("Found \\(faces.count) faces")
}
// 2. Handler orqali bajarish
let handler = VNImageRequestHandler(cgImage: cgImage, options: [:])
try handler.perform([request])
VNRequestning asosiy xususiyatlari: regionOfInterest (tahlilni tezlashtirish uchun tasvirdagi qiziqish hududi), preferBackgroundProcessing (fon rejimi), revision (algoritm versiyasi) va cancellationSupport. Bu xususiyatlarning to‘g‘ri konfiguratsiyasi aniq bir vazifa uchun unumdorlikni optimallashtirish imkonini beradi.
Apple WWDC 2024 ma’lumotlariga ko‘ra, Vision mavjudligining 7 yili davomida mavjud VNRequest subclasslari soni 8 tadan (iOS 11) 25+ taga (iOS 18) oshib, mobil qurilmalarda kompyuter ko‘rishning barcha asosiy vazifalarini qamrab olgan.
Vision 25 dan ortiq VNRequest subclasslarini o‘z ichiga oladi, ular kategoriyalarga bo‘lingan: aniqlash, tanib olish, kuzatish va klassifikatsiya. Har bir subclass VNRequestdan meros oladi va vazifa uchun xos xususiyatlarni qo‘shadi.
VNDetectFaceRectanglesRequest — tasvirda yuzlarni qidirish. bounding box koordinatalari va confidence bilan VNFaceObservation qaytaradi. VNDetectHumanRectanglesRequest — odamlar uchun analogik. VNDetectHumanBodyPoseRequest — odam pozasini aniqlash (skelet nuqtalari).
VNRecognizeTextRequest — 13 tilni qo‘llab-quvvatlash va ikki aniqlik darajasi bilan matnni tanib olish. VNReadCodeRequest — ixtisoslashgan kodlar uchun. VNDetectTextRectanglesRequest — tanib olishsiz matn hududlarini qidirish (tezroq, lekin faqat to‘rtburchaklar).
VNClassifyImageRequest — ImageNetning 1000 kategoriyasi bo‘yicha tasvirni klassifikatsiya qilish. VNGenerateImageFeaturePrintRequest — tasvirlarni solishtirish uchun feature vector olish. VNDetectContoursRequest — obekt konturlarini aniqlash.
| Kategoriya | So‘rov namunasi | Natija |
|---|---|---|
| Yuzni aniqlash | VNDetectFaceRectanglesRequest | VNFaceObservation |
| Matnni tanib olish | VNRecognizeTextRequest | VNRecognizedTextObservation |
| Shtrixkodlar | VNDetectBarcodesRequest | VNBarcodeObservation |
| Klassifikatsiya | VNClassifyImageRequest | VNClassificationObservation |
| Kuzatish | VNTrackObjectRequest | VNDetectedObjectObservation |
| Konturlar | VNDetectContoursRequest | VNContoursObservation |
VNImageRequestHandler — statik tasvirlar uchun handler. CGImage, CIImage yoki Data (JPEG/PNG) qabul qiladi va bir yoki bir nechta VNRequestni bajaradi. Bu Vision-dan fotosuratlar, ekran tasvirlari va yuklangan tasvirlar uchun foydalanishning asosiy usuli.
VNSequenceRequestHandler — tasvir ketma-ketliklari (video kadrlari) uchun handler. Xuddi shu tasvir turlarini qabul qiladi, lekin kadrlar orasida holatni saqlash bilan kadrma-kadr qayta ishlash uchun mo‘ljallangan (obektlarni kuzatish uchun zarur).
// Bitta tasvir uchun VNImageRequestHandler
let imageHandler = VNImageRequestHandler(
cgImage: cgImage,
orientation: orientation,
options: [:])
// Video uchun VNSequenceRequestHandler
let sequenceHandler = VNSequenceRequestHandler()
try sequenceHandler.perform([trackingRequest],
on: cgImage)
Muhim farq: VNSequenceRequestHandler bir nechta so‘rovlarning parallel bajarilishini qo‘llab-quvvatlamaydi — har bir perform() chaqiruvi bitta kadr uchun bitta so‘rovlar to‘plamini qayta ishlaydi. Ko‘p ipli video qayta ishlash uchun turli iplar uchun alohida handler namunalarini yarating.
VNImageRequestHandler fon navbatida bajarilishi mumkin. Apple interaktiv stsenariylar uchun DispatchQueue.global(qos: .userInitiated) (foydalanuvchi natijani kutadi) va paketli qayta ishlash uchun .background (masalan, butun foto kutubxonasini tahlil qilish) tavsiya qiladi.
VNObservation — Vision so‘rovlarining barcha natijalari uchun bazaviy sinf. Har bir VNObservation subclassi tahlil turi uchun xos ma’lumotlarni o‘z ichiga oladi: bounding box koordinatalari, tanib olingan matn, confidence, noyob identifikator (uuid) va vaqt belgisi (timeRange).
VNObservationning asosiy subclasslari: VNFaceObservation (bounding box va landmarks bilan yuz aniqlash natijasi), VNRecognizedTextObservation (candidates bilan tanib olingan matn), VNBarcodeObservation (payload va symbology bilan dekodlangan shtrixkod), VNClassificationObservation (confidence bilan klassifikatsiya kategoriyasi).
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 xususiyati (0.0 dan 1.0 gacha) barcha VNObservationlarda mavjud va modelning natijaga ishonchini ko‘rsatadi. Apple ko‘pchilik vazifalar uchun confidence < 0.5 bo‘lgan kuzatuvlarni tashlab yuborishni tavsiya qiladi. Kritik ilovalar (tibbiyot, xavfsizlik) uchun chegarani 0.8–0.9 gacha ko‘tarish kerak.
VNObservation shuningdek timeRange (video so‘rovlar uchun) va uuid (kadrlar orasida moslashtirish uchun noyob ID) ni o‘z ichiga oladi. Bu bir xil obektni (masalan, yuz) video kadrlar ketma-ketligi orqali kuzatish imkonini beradi.
VNRequestning asosiy afzalliklaridan biri — bitta handler.perform() chaqiruvida bitta tasvirga bir nechta turli so‘rovlarni bajarish imkoniyati. Vision ichki tartibda bajarish tartibini optimallashtiradi va umumiy hisoblashlarni (masalan, tasvirni oldindan qayta ishlashni) qayta ishlatadi.
Bu bir o‘tishda tasvir haqida to‘liq ma’lumot to‘plamini olish imkonini beradi: bir vaqtning o‘zida yuzlarni aniqlash, matnni tanib olish, shtrixkodlarni topish va mazmunni klassifikatsiya qilish. Bunday yondashuv har bir so‘rovni alohida ketma-ket chaqirishdan sezilarli darajada samaraliroq.
import Vision
// Bir massivda bir nechta so‘rovlar
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
])
// Har bir so‘rovdan natijalarga kirish
print("Faces: \\(faceRequest.results?.count ?? 0)")
print("Text blocks: \\(textRequest.results?.count ?? 0)")
Cheklovlar: barcha so‘rovlarni boshqalar bilan birlashtirish mumkin emas. Masalan, VNGenerateImageFeaturePrintRequest alohida bajarilishi kerak. Apple so‘rovlarni turi bo‘yicha guruhlashni (aniqlash, tanib olish, klassifikatsiya) va kombinatsiyalarni maqsadli qurilmalarda sinab ko‘rishni tavsiya qiladi.
Unumdorlik: bir perform() da 3–4 so‘rovni birlashtirish ketma-ket bajarishdan 30–40% tezroq, chunki Vision umumiy ML hisoblashlari va tasvirni oldindan qayta ishlashni (masshtablash, rang tuzatish) qayta ishlatadi.
VNCoreMLRequest — Core ML va Vision o‘rtasidagi ko‘prik bo‘lib, istalgan Core ML modelini Vision so‘rovi sifatida ishga tushirish imkonini beradi. Model VNCoreMLModel ga o‘raladi, VNCoreMLRequest ga uzatiladi va Vision avtomatik ravishda tasvirni oldindan qayta ishlaydi (masshtablash, model kirish o‘lchamiga mos kesish).
VNCoreMLRequest VNRequest dan meros oladi, shuning uchun barcha standart imkoniyatlarni qo‘llab-quvvatlaydi: regionOfInterest, completion handler, bir nechta so‘rovlar. Bu maxsus ML modelini Visionning o‘rnatilgan detektorlari bilan bir pipeline da birlashtirish imkonini beradi.
import Vision
import CoreML
// Core ML modelini o‘rash
guard let mlModel = try VNCoreMLModel(
for: MyCustomClassifier().model)
else { return }
// VNCoreMLRequest yaratish
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 tasvirni model kirishiga qanday masshtablashini aniqlaydi: .centerCrop (markazdan kesish), .scaleFill (cho‘zish) yoki .scaleFit (proporsiyalarni saqlagan holda masshtablash). Tanlov model turiga va tasvirdagi obektning joylashishiga bog‘liq.
Amaliy misol: VNDetectFaceRectanglesRequest orqali yuzlarni aniqlash, so‘ngra har bir yuzni VNCoreMLRequest bilan maxsus model orqali klassifikatsiya qilish (masalan, jins yoki yoshni aniqlash). Ikki so‘rovni bitta perform() da birlashtirib, bir o‘tishda to‘liq yuz tahlili pipeline ini olasiz.
Tez-tez so‘raladigan savollar
Ha, har bir VNRequest so‘rovning bajarilishini bekor qiladigan cancel() xususiyatiga ega. Biroq, bekor qilish faqat qayta ishlash boshlanishidan oldin ishlaydi — agar ML modeli ishga tushirilgan bo‘lsa, bekor qilish hisoblashni to‘xtatmaydi. Ishonchli bekor qilish uchun completion handlerda DispatchWorkItem.cancel() bilan birga VNRequest.cancel() dan foydalaning.
VNDetectFaceRectanglesRequest faqat yuz to‘rtburchaklarini topadi. VNDetectFaceLandmarksRequest qo‘shimcha ravishda yuzning 68 asosiy nuqtasini (ko‘zlar, qoshlar, burun, og‘iz, kontur) aniqlaydi. VNDetectFaceLandmarksRequest sekinroq, lekin animatsiya, maskalar va AR effektlari uchun ko‘proq ma’lumot beradi. Oddiy yuzlarni sanash uchun VNDetectFaceRectanglesRequest yetarli.
Ha, VNDetectBarcodesRequest — barcha turdagi shtrixkod va QR kodlar uchun to‘g‘ri so‘rov. EAN, UPC, Code 39, Code 128, PDF417, Aztec, QR va boshqa formatlarni qo‘llab-quvvatlaydi. Natija payload va symbology bilan VNBarcodeObservation da qaytariladi. Video oqimi uchun AVCaptureMetadataOutput dan foydalaning — jonli skanerlash uchun tezroq.
Ha, VNImageRequestHandler CIImage ni init(ciImage:options:) boshlang‘ich beruvchisi orqali qabul qiladi. Shuningdek Data (JPEG/PNG) va NSURL (fayl yo‘li) qo‘llab-quvvatlanadi. CIImage tasvir Core Image pipeline orqali yuklanganida qulay — bu xotirada keraksiz ma’lumot nusxalashni oldini oladi.
Soni bo‘yicha cheklov yo‘q, lekin amalda 3–5 ta so‘rov optimal miqdor. 5 tadan ortiq so‘rov xotira iste‘molining oshishiga olib kelishi mumkin, chunki har bir so‘rov o‘z ML modelini yuklaydi. Agar 10+ xil tahlil bajarish kerak bo‘lsa, ularni 2–3 guruhga bo‘ling va ketma-ket bajaring.
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.