VNCoreMLRequest — VNRequest-in alt sinfi olub, Core ML modellərini Vision pipeline-i daxilində işə salmağa imkan verir, hazır Vision detektorlarının (üz, mətn, obyektlər) üstünlüklərini klassifikasiya və reqressiya üçün fərdi ML modelləri ilə birləşdirir. Apple Machine Learning Documentation (2024) məlumatına görə, VNCoreMLRequest şəklin ilkin emalını — miqyaslama, kəsmə və rəng məkanının konvertasiyasını — Core ML modelinin tələblərinə uyğun olaraq avtomatik həyata keçirir.
Başlıca xüsusiyyətlər
VNCoreMLRequest — iOS 11-də Vision ilə birlikdə əlavə edilmiş VNRequest-in alt sinfi olub, Core ML modellərini Vision kontekstində işə salmağa imkan verir. Core ML modeli tərəfindən tələb olunan şəkilin ilkin emalının hamısını öz üzərinə götürür: ölçü dəyişikliyi, kəsmə, normallaşdırma və rəng məkanının konvertasiyası.
VNCoreMLRequest olmadan, tərtibatçı UIImage/CGImage əl ilə tələb olunan ölçüdə MultiArray (MLMultiArray) və ya PixelBuffer (CVPixelBuffer) çevirməli olardı. VNCoreMLRequest bu prosesi avtomatlaşdırır: siz VNImageRequestHandler vasitəsilə CGImage ötürürsünüz, VNCoreMLRequest isə onu modelin giriş ölçüsünə uyğun miqyaslayır.
VNCoreMLRequest VNRequest-in bütün imkanlarını miras alır: completion handler, regionOfInterest, eyni anda bir neçə sorğun icrası, VNImageRequestHandler və VNSequenceRequestHandler dəstəyi.
import Vision
import CoreML
// 1. Modeli yüklə və sar
guard let model = try VNCoreMLModel(
for: MobileNetV2().model)
else { return }
// 2. VNCoreMLRequest yarat
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 vasitəsilə icra et
let handler = VNImageRequestHandler(cgImage: image, options: [:])
try handler.perform([request])
VNCoreMLRequest müxtəlif giriş tipli modelləri dəstəkləyir: şəkillər (Image Feature), MultiArray və Double. Şəkillər üçün Vision avtomatik olaraq CGImage-nı tələb olunan ölçüdə və rəng məkanında CVPixelBuffer-a çevirir. Digər giriş məlumat növləri üçün Vision olmadan birbaşa Core ML istifadə edilməlidir.
Apple WWDC 2023 məlumatına görə, VNCoreMLRequest şəkillərlə iş üçün Core ML tətbiq edən iOS tətbiqlərinin 40%-də istifadə olunur. Bu, iOS tətbiqlərinə ML modellərinin inteqrasiyasının ən populyar üsuludur.
VNCoreMLModel — Core ML modelini (MLModel) Vision-da istifadə üçün uyğunlaşdıran sarğıcıdır. Modelin giriş və çıxış məlumatlarını Vision üçün anlaşıqlı formata çevirir: şəkil → CVPixelBuffer, nəticə → VNObservation.
VNCoreMLModel-in inisializasiyası modelin Vision ilə uyğunluğunu yoxlayır: model girişdə şəkil (Image Feature) qəbul etməli və klassifikasiya qaytarmalıdır (MLMultiArray və ya Dictionary). Model uyğun deyilsə, inisializator xəta atır.
import Vision
import CoreML
// Seçim 1: .mlmodel-dən (qurma zamanı kompilyasiya olunub)
let model1 = try VNCoreMLModel(
for: MyVisionModel().model)
// Seçim 2: .mlmodelc-dən (cihazda kompilyasiya olunub)
let compiledURL = Bundle.main.url(
forResource: "MyVisionModel",
withExtension: "mlmodelc")!
let model2 = try VNCoreMLModel(
for: MLModel(contentsOf: compiledURL))
VNCoreMLModel modeli ilk yüklənmədən sonra yaddaşda keşləyir. Eyni modelin təkrar yüklənməsi keşlənmiş nüsxəni qaytarır ki, bu da sonrakı sorğuları sürətləndirir. Lakin model 100 MB-dan artıqdırsa, iOS resurs çatışmazlığı zamanı onu yaddaşdan boşada bilər — bu halda VNCoreMLModel modeli avtomatik olaraq yenidən yükləyir.
Create ML vasitəsilə öyrədilmiş modellər üçün VNCoreMLModel əlavə konfiqurasiya olmadan işləyir. Create ML modelləri Vision-un avtomatik tanıdığı düzgün metadatalarla ixrac edir — modeli VNCoreMLModel(model:)-ə ötürmək kifayətdir.
imageCropAndScaleOption — VNCoreMLRequest-in Vision-un orijinal şəkli Core ML modelinin giriş ölçüsünə necə çevirdiyini müyyən edən əsas xüsusiyyətidir. Düzgün variantın seçilməsi birbaşa klassifikasiya dəqiqliyinə təsir edir.
.centerCrop — şəkli mərkəzdən kvadrat şəklində kəsir, sonra modelin giriş ölçüsünə miqyaslayır. Mərkəzləşdirilmiş obyektlər üzərində öyrədilmiş modellər üçün uyğundur (əksər ImageNet klassifikatorları). .scaleFill — şəkli nisbətləri qorumadan giriş ölçüsünə qədər uzadır. Sürətli, lakin həndəsəni təhrif edir. .scaleFit — nisbətləri qoruyaraq miqyaslayır, kənarlarda letterbox (qara zolaqlar) əlavə edir.
import Vision
let request = VNCoreMLRequest(model: model)
// .centerCrop — mərkəzləşdirilmiş obyektlər üçün (standart)
request.imageCropAndScaleOption = .centerCrop
// .scaleFill — homogen teksturlar üçün (təhrifsiz)
request.imageCropAndScaleOption = .scaleFill
// .scaleFit — obyekt nisbətləri önəmli olduqda
request.imageCropAndScaleOption = .scaleFit
Tövsiyələr: əksər klassifikasiya modelləri üçün .centerCrop istifadə edin — o, dəqiqlik və performansın ən yaxşı nisbətini təmin edir. Model nisbətləri qorunan şəkillər üzərində öyrədilmişsə (məs. sənəd fotolarında anomaliya deteksiyası), letterbox ilə .scaleFit seçin.
Apple Developer Documentation 2024 məlumatına görə, səhv imageCropAndScaleOption seçimi modelin dəqiqliyini 15–25% azalda bilər. Məsələn, çərçivənin kənarında yerləşən üz üçün .scaleFill .centerCrop-da onun bir hissəsini kəsə və ya .scaleFill-də nisbətləri təhrif edə bilər.
Əsas üstünlük VNCoreMLRequest-in — onu digər VNRequest ilə bir perform() çağırışında birləşdirmək imkanıdır. Bu, pipeline-lar qurmağa imkan verir: əvvəlcə üzləri tapın (VNDetectFaceRectanglesRequest), sonra hər üzü fərdi Core ML modeli vasitəsilə klassifikasiya edin (VNCoreMLRequest).
VNCoreMLRequest həmçinin regionOfInterest-i dəstəkləyir — bu sahəni təyin etsəniz, Vision Core ML modelinə ötürməzdən əvvəl şəkli göstərilən dördbucaqa qədər kəsir. Bu, pipeline-lar üçün kritik əhəmiyyət kəsb edir: üz deteksiyasından sonra onun bounding box-nı VNCoreMLRequest üçün regionOfInterest kimi ötürürsünüz.
import Vision
// 1. Üz deteksiyası
let faceRequest = VNDetectFaceRectanglesRequest()
// 2. Core ML vasitəsilə emosiya klassifikasiyası
guard let emotionModel = try VNCoreMLModel(
for: EmotionClassifier().model)
else { return }
let emotionRequest = VNCoreMLRequest(model: emotionModel)
try handler.perform([faceRequest, emotionRequest])
// 3. Hər üz üçün regionOfInterest təyin et
for face in faceRequest.results as? [VNFaceObservation] ?? [] {
emotionRequest.regionOfInterest = face.boundingBox
try handler.perform([emotionRequest])
// Emosiya klassifikasiyası nəticəsini emal et
}
Məhdudiyyət: VNCoreMLRequest üçün regionOfInterest yalnız model eyni ölçüdə və nisbətdə şəkillər üzərində öyrədildikdə məna kəsb edir. Model ciddi kvadrat giriş (224x224) gözləyirsə, regionOfInterest ilə .centerCrop ən yaxşı nəticəni verəcək.
Apple ML Research məlumatına görə, regionOfInterest vasitəsilə „deteksiya → klassifikasiya” pipeline-ı bütün şəklin klassifikasiyası ilə müqayisədə dəqiqliyi 20–30% artırır, çünki ML modeli girişdə fon səs-küysüz yalnız münasibət sahəni alır.
| Pipeline növü | Sorğu 1 (deteksiya) | Sorğu 2 (ML) | Nümunə |
|---|---|---|---|
| Üz → emosiya | VNDetectFaceRectanglesRequest | VNCoreMLRequest | Əhval-ruhiyyənin müyyənləşdirilməsi |
| Obyekt → brend | VNDetectObjectAtPointRequest | VNCoreMLRequest | Loqoların tanınması |
| Mətn → dil | VNRecognizeTextRequest | VNCoreMLRequest | Mətn dilinin klassifikasiyası |
| Səhnə → təsvir | VNClassifyImageRequest | VNCoreMLRequest | Teqlərin yaradılması |
VNCoreMLRequest nəticələri VNClassificationObservation (klassifikasiya modelləri üçün) və ya VNCoreMLFeatureValueObservation (reqressiya və digər tiplər üçün) şəklində qaytarır. Nəticənin növü Core ML modelinin çıxış məlumatlarından asılıdır.
VNClassificationObservation identifier (sinif adı) və confidence (əminlik) ehtiva edir. Softmax çıxışı olan modellər confidence-ə görə azalan sırada çeşidlənmiş belə müşahidələr massivi qaytarır. VNCoreMLFeatureValueObservation ixtiyari MLFeatureValue dəyərini ehtiva edir — MultiArray, Double, String və ya Dictionary ola bilər.
// Klassifikasiya modelləri üçün
if let classificationResults = request.results
as? [VNClassificationObservation] {
for result in classificationResults
where result.confidence > 0.5 {
print("\\(result.identifier): \\(result.confidence)")
}
}
// Reqressiya modelləri üçün (xüsusiyyət dəyərləri)
if let featureResults = request.results
as? [VNCoreMLFeatureValueObservation] {
for result in featureResults {
let value = result.featureValue
print("\\(result.featureName): \\(value)")
}
}
Confidence əsasında filtrləmə: Apple ümumi klassifikatorlar üçün confidence < 0.3 və kritik tətbiqlər üçün < 0.7 olan nəticələrin atılmasını tövsiyə edir. Balanslaşdırılmış məlumat dəstləri üzərində öyrədilmiş modellər üçün confidence düzgün cavab ehtimalı ilə korrelyasiya edir, lakin buna zəmanət vermir.
VNCoreMLFeatureValueObservation.featureName modelin çıxış qatının adına uyğun gəlir (məs. „classLabel” və ya „features”). Bu, bir neçə çıxışı olan modelləri emal etməyə imkan verir — hər çıxış unikal featureName ilə ayrıca müşahidə ilə təmsil olunur.
VNCoreMLRequest Neural Engine (A12+), GPU və CPU-da iş üçün optimallaşdırılıb. Vision modelin növündən və ölçüsündən asılı olaraq avtomatik olaraq ən yaxşı qurğunu seçir. Lakin performansı düzgün konfiqurasiya ilə əlavə olaraq yaxşılaşdırmaq olar.
Core ML modelləri ilk VNCoreMLRequest zamanı yaddaşa yüklənir və tətbiq boşaldılana qədər orada qalır. 200 MB-dan böyük modellər üçün Apple onları tələb üzrə yükləməyi və MLModel.release() vasitəsilə boşatmağı tövsiyə edir. VNCoreMLModel keşləməni özü idarə edir, lakin siz bunu autoreleasepool vasitəsilə kontrol edə bilərsiniz.
Şəkillərin toplu emalı üçün bir VNCoreMLRequest yaradın və onu müxtəlif VNImageRequestHandler ilə təkrar istifadə edin. Hər şəkil üçün yeni VNCoreMLRequest yaratmayın — bu, modelin təkrar yüklənməsi səbəbindən emalı yavaş ladar. Sorğun təkrar istifadəsi 10+ şəkil emal edərkən performansı 40%-ə qədər artırır.
// Düzgün: bütün şəkillər üçün tək sorğu
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 hər çağırışda yenilənir
}
Qurğu seçimi: standart olaraq Vision A12+ cihazlarında uyğun modellər üçün Neural Engine seçir. Model Neural Engine dəstəkləmirsə, Vision GPU və ya CPU istifadə edir. MLModelConfiguration.computeUnits vasitəsilə məcburi olaraq qurğu təyin edə bilərsiniz, lakin Apple avtomatik seçimi buraxmağı tövsiyə edir.
Apple Performance Benchmarks 2024 məlumatına görə, VNCoreMLRequest Neural Engine-də (iPhone 15 Pro) MobileNetV2 klassifikasiyasını 3–5 ms, GPU-da — 8–12 ms, CPU-da — 20–30 ms müddətində emal edir. Fərq saniyədə 30+ kadr emal edən real-vaxt tətbiqləri üçün kritik olur.
Tez-tez verilən suallar
Bəli, Core ML birbaşa MLModel.prediction() vasitəsilə, Vision olmadan istifadə edilə bilər. Lakin VNCoreMLRequest şəkillərin ilkin emalını (miqyaslama, kəsmə, CVPixelBuffer-a çevirmə) avtomatlaşdırır. Model şəkil deyil, MultiArray və ya Double qəbul edirsə — birbaşa Core ML istifadə edin. VNCoreMLRequest yalnız girişdə Image Feature olan modellər üçündür.
Yenilənmiş MLModel-dən yeni VNCoreMLModel və yeni VNCoreMLRequest yaradın. Köhnə sorğu modelin köhnə versiyasını istifadə etməyə davam edəcək. Modellərin uzaqdan yenilənməsi üçün serverdən yüklənmiş .mlmodelc faylından cihazda modeli kompilyasiya etmək üçün MLModel.compileModel(at:) istifadə edin.
VNCoreMLRequest yalnız bir Image Feature girişi olan modelləri dəstəkləyir. Modelin bir neçə girişi varsa (məs. şəkil + mətn), MLModel vasitəsilə birbaşa Core ML istifadə edin. Vision şəkildən əlavə əlavə parametrlər ötürə bilməz.
Məhdudiyyət — VNImageRequestHandler-a ötürülən CGImage üçün 8192 x 8192 piksel. Lakin Core ML modelləri adətən 224x224, 299x299 və ya 512x512 giriş gözləyir. Vision böyük şəkli avtomatik olaraq giriş ölçüsünə miqyaslayır. Orijinal şəkil çox böyükdürsə, yaddaşa qənət etmək üçün onu CGImage vasitəsilə əvvəlcədən kiçildin.
Bəli, VNRequest-də preferBackgroundProcessing = true təyin edin. Bu, sistem resurs tutumlu rejimdə olduqda (məs. məzmun yükləmə) Vision-a sorğun icrasını təxirə salmağa imkan verəcək. Həmçinin handler.perform() çağırışı üçün mütləq DispatchQueue.global(qos: .background) istifadə edin.
Xülasə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun