VNCoreMLRequest — VNRequest’in bir alt sınıfıdır ve Vision detektörlerinin (yüz, metin, nesne) avantajlarını sınıflandırma ve regresyon için özel ML modelleriyle birleştirerek Core ML modellerini Vision hattı içinde çalıştırmaya olanak tanır. Apple Machine Learning Documentation (2024)’e göre VNCoreMLRequest, Core ML modelinin gereksinimlerine uygun olarak görüntü ön işlemesini (ölçeklendirme, kırpma ve renk uzayı dönüşümü) otomatik olarak gerçekleştirir.
Önemli Noktalar
VNCoreMLRequest, iOS 11’de Vision ile birlikte eklenen VNRequest’in bir alt sınıfıdır ve Core ML modellerini Vision bağlamında çalıştırmaya olanak tanır. Core ML modeli tarafından gereken tüm görüntü ön işlemesini (yeniden boyutlandırma, kırpma, normalleştirme ve renk uzayı dönüşümü) gerçekleştirir.
VNCoreMLRequest olmadan, bir geliştiricinin UIImage/CGImage’ı manuel olarak gerekli boyutta MultiArray (MLMultiArray) veya PixelBuffer (CVPixelBuffer) haline dönüştürmesi gerekirdi. VNCoreMLRequest bu süreci otomatikleştirir: VNImageRequestHandler aracılığıyla bir CGImage iletirsiniz ve VNCoreMLRequest onu model girdisine ölçeklendirir.
VNCoreMLRequest, tüm VNRequest yeteneklerini devralır: tamamlama işleyicisi, regionOfInterest, aynı anda birden çok isteği yürütme yeteneği, VNImageRequestHandler ve VNSequenceRequestHandler desteği.
import Vision
import CoreML
// 1. Modeli yükle ve sarmala
guard let model = try VNCoreMLModel(
for: MobileNetV2().model)
else { return }
// 2. VNCoreMLRequest oluştur
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. İşleyici aracılığıyla yürüt
let handler = VNImageRequestHandler(cgImage: image, options: [:])
try handler.perform([request])
VNCoreMLRequest, farklı girdi türlerine sahip modelleri destekler: görüntüler (Image Feature), MultiArray ve Double. Görüntüler için Vision, CGImage’ı otomatik olarak gerekli boyut ve renk uzayındaki CVPixelBuffer’a dönüştürür. Diğer girdi veri türleri için, Vision olmadan doğrudan Core ML kullanın.
Apple WWDC 2023’e göre VNCoreMLRequest, görüntü işleme için Core ML kullanan tüm iOS uygulamalarının %40’ında kullanılmaktadır. Bu, iOS uygulamalarına ML modelleri entegre etmenin en popüler yoludur.
VNCoreMLModel, Core ML modelini (MLModel) Vision’da kullanılmak üzere uyarlayan bir sarmalayıcıdır. Modelin girdi ve çıktı verilerini Vision’ın anlayabileceği bir formata dönüştürür: görüntü → CVPixelBuffer, sonuç → VNObservation.
VNCoreMLModel başlatması, modelin Vision ile uyumluluğunu kontrol eder: modelin girdi olarak bir görüntüyü (Image Feature) kabul etmesi ve sınıflandırma (MLMultiArray veya Dictionary) döndürmesi gerekir. Model uyumsuzsa, başlatıcı bir hata fırlatır.
import Vision
import CoreML
// Seçenek 1: .mlmodel’den (derleme zamanında derlenmiş)
let model1 = try VNCoreMLModel(
for: MyVisionModel().model)
// Seçenek 2: .mlmodelc’den (cihazda derlenmiş)
let compiledURL = Bundle.main.url(
forResource: "MyVisionModel",
withExtension: "mlmodelc")!
let model2 = try VNCoreMLModel(
for: MLModel(contentsOf: compiledURL))
VNCoreMLModel, ilk yüklemeden sonra modeli bellekte önbelleğe alır. Aynı modeli yeniden yüklemek, önbelleklenmiş örneği döndürerek sonraki istekleri hızlandırır. Ancak model 100 MB’tan ağırsa, iOS kaynaklar yetersiz olduğunda onu bellekten boşaltabilir — bu durumda VNCoreMLModel modeli otomatik olarak yeniden yükler.
Create ML ile eğitilmiş modeller için VNCoreMLModel, ek yapılandırma olmadan çalışır. Create ML, Vision’ın otomatik olarak tanıdığı doğru meta verilerle modelleri dışa aktarır — modeli VNCoreMLModel(model:)’e iletmeniz yeterlidir.
imageCropAndScaleOption, VNCoreMLRequest’in temel bir özelliğidir ve Vision’ın kaynak görüntüyü Core ML model girdi boyutuna uyacak şekilde nasıl dönüştüreceğini belirler. Doğru seçeneği seçmek, sınıflandırma doğruluğunu doğrudan etkiler.
.centerCrop, görüntüyü merkezden kare şeklinde kırpıp ardından model girdi boyutuna ölçeklendirir. Merkezi nesneler üzerinde eğitilmiş modeller için uygundur (çoğu ImageNet sınıflandırıcısı). .scaleFill, oranları korumadan görüntüyü girdi boyutuna uzatır. Hızlıdır ancak geometriyi bozar. .scaleFit, oranları koruyarak ölçeklendirir ve kenarlara letterbox (siyah çubuklar) ekler.
import Vision
let request = VNCoreMLRequest(model: model)
// .centerCrop — merkezi nesneler için (varsayılan)
request.imageCropAndScaleOption = .centerCrop
// .scaleFill — tek tip dokular için (bozulma yok)
request.imageCropAndScaleOption = .scaleFill
// .scaleFit — nesne oranları önemli olduğunda
request.imageCropAndScaleOption = .scaleFit
Öneriler: çoğu sınıflandırma modeli için .centerCrop kullanın — doğruluk ve performans arasında en iyi dengeyi sağlar. Model oranları korunan görüntüler üzerinde eğitildiyse (örneğin, belge fotoğraflarında anomali tespiti), letterbox ile .scaleFit seçin.
Apple Developer Documentation 2024’e göre, yanlış imageCropAndScaleOption seçimi model doğruluğunu %15–25 oranında azaltabilir. Örneğin, çerçevenin kenarındaki bir yüz için .scaleFill, .centerCrop ile bir kısmını kesebilir veya .scaleFill ile oranları bozabilir.
VNCoreMLRequest’in ana gücü, onu tek bir perform() çağrısında diğer VNRequest’lerle birleştirebilme yeteneğidir. Bu, hatlar oluşturmaya olanak tanır: önce yüzleri algılayın (VNDetectFaceRectanglesRequest), ardından özel bir Core ML modeli (VNCoreMLRequest) aracılığıyla her yüzü sınıflandırın.
VNCoreMLRequest ayrıca regionOfInterest’i de destekler — bu alanı ayarlarsanız, Vision görüntüyü Core ML modeline iletmeden önce belirtilen dikdörtgene kırpacaktır. Bu, hatlar için kritiktir: yüz algılamadan sonra, sınırlama kutusunu VNCoreMLRequest için regionOfInterest olarak iletirsiniz.
import Vision
// 1. Yüz algılama
let faceRequest = VNDetectFaceRectanglesRequest()
// 2. Core ML aracılığıyla duygu sınıflandırması
guard let emotionModel = try VNCoreMLModel(
for: EmotionClassifier().model)
else { return }
let emotionRequest = VNCoreMLRequest(model: emotionModel)
try handler.perform([faceRequest, emotionRequest])
// 3. Her yüz için regionOfInterest ayarla
for face in faceRequest.results as? [VNFaceObservation] ?? [] {
emotionRequest.regionOfInterest = face.boundingBox
try handler.perform([emotionRequest])
// Duygu sınıflandırması sonucunu işle
}
Sınırlama: VNCoreMLRequest için regionOfInterest, yalnızca model aynı boyut ve orandaki görüntüler üzerinde eğitildiğinde anlamlıdır. Model kesinlikle kare girdi (224x224) bekliyorsa, regionOfInterest ile .centerCrop en iyi sonucu verecektir.
Apple ML Research’e göre, regionOfInterest aracılığıyla “algılama → sınıflandırma” hattı, tüm görüntünün sınıflandırılmasına kıyasla %20–30 doğruluk iyileştirmesi sağlar, çünkü ML modeli arka plan gürültüsü olmadan yalnızca ilgili alanı alır.
| Hat Türü | İstek 1 (algılama) | İstek 2 (ML) | Örnek |
|---|---|---|---|
| Yüz → duygu | VNDetectFaceRectanglesRequest | VNCoreMLRequest | Ruh hali tespiti |
| Nesne → marka | VNDetectObjectAtPointRequest | VNCoreMLRequest | Logo tanıma |
| Metin → dil | VNRecognizeTextRequest | VNCoreMLRequest | Metin dili sınıflandırması |
| Sahne → açıklama | VNClassifyImageRequest | VNCoreMLRequest | Etiket oluşturma |
VNCoreMLRequest, sonuçları VNClassificationObservation (sınıflandırma modelleri için) veya VNCoreMLFeatureValueObservation (regresyon ve diğer türler için) olarak döndürür. Sonuç türü, Core ML modelinin çıktı verilerine bağlıdır.
VNClassificationObservation, identifier (sınıf adı) ve confidence içerir. Softmax çıktılı modeller, azalan confidence sırasına göre sıralanmış bu gözlemlerin bir dizisini döndürür. VNCoreMLFeatureValueObservation, rastgele bir MLFeatureValue içerir — MultiArray, Double, String veya Dictionary olabilir.
// Sınıflandırma modelleri için
if let classificationResults = request.results
as? [VNClassificationObservation] {
for result in classificationResults
where result.confidence > 0.5 {
print("\\(result.identifier): \\(result.confidence)")
}
}
// Regresyon modelleri için (özellik değerleri)
if let featureResults = request.results
as? [VNCoreMLFeatureValueObservation] {
for result in featureResults {
let value = result.featureValue
print("\\(result.featureName): \\(value)")
}
}
Confidence filtrelemesi: Apple, genel sınıflandırıcılar için confidence < 0,3 ve kritik uygulamalar için < 0,7 olan sonuçların atılmasını önerir. Dengeli veri kümeleri üzerinde eğitilmiş modeller için confidence, doğru cevap olasılığı ile ilişkilidir ancak bunu garanti etmez.
VNCoreMLFeatureValueObservation.featureName, modelin çıktı katmanı adına (örneğin, “classLabel” veya “features”) karşılık gelir. Bu, birden çok çıktılı modelleri işlemeye olanak tanır — her çıktı, benzersiz bir featureName ile ayrı bir gözlemle temsil edilir.
VNCoreMLRequest, Neural Engine (A12+), GPU ve CPU üzerinde çalışmak üzere optimize edilmiştir. Vision, modelin türüne ve boyutuna bağlı olarak model yürütmesi için en iyi cihazı otomatik olarak seçer. Ancak performans, uygun yapılandırmayla daha da iyileştirilebilir.
Core ML modelleri, ilk VNCoreMLRequest’te belleğe yüklenir ve uygulama kaldırılana kadar orada kalır. 200 MB’tan büyük modeller için Apple, bunları ihtiyaç halinde yüklemeyi ve MLModel.release() ile boşaltmayı önerir. VNCoreMLModel önbelleği kendi yönetir, ancak bunu autoreleasepool aracılığıyla kontrol edebilirsiniz.
Toplu işleme için bir VNCoreMLRequest oluşturun ve bunu farklı VNImageRequestHandler’larla yeniden kullanın. Her görüntü için yeni bir VNCoreMLRequest oluşturmayın — bu, tekrarlanan model yükleme nedeniyle işlemeyi yavaşlatır. İsteğin yeniden kullanımı, 10+ görüntü işlenirken %40’a kadar performans artışı sağlar.
// Doğru: tüm görüntüler için tek istek
let batchSize = 20
let batchRequest = VNCoreMLRequest(model: model)
for i in 0..<batchSize {
let handler = VNImageRequestHandler(
cgImage: images[i],
options: [:])
try handler.perform([batchRequest])
// Her çağrıda batchRequest.results güncellenir
}
Cihaz seçimi: varsayılan olarak Vision, A12+ cihazlardaki uyumlu modeller için Neural Engine’i seçer. Model Neural Engine’i desteklemiyorsa, Vision GPU veya CPU kullanır. MLModelConfiguration.computeUnits aracılığıyla cihazı zorla belirtebilirsiniz, ancak Apple otomatik seçimi bırakmanızı önerir.
Apple Performance Benchmarks 2024’e göre, Neural Engine (iPhone 15 Pro) üzerinde VNCoreMLRequest, MobileNetV2 sınıflandırmasını 3–5 ms’de, GPU’da 8–12 ms’de, CPU’da 20–30 ms’de işler. Bu fark, saniyede 30+ kare işleyen gerçek zamanlı uygulamalar için kritik hale gelir.
Sıkça Sorulan Sorular
Evet, Core ML Vision olmadan doğrudan MLModel.prediction() aracılığıyla kullanılabilir. Ancak VNCoreMLRequest, görüntü ön işlemesini (ölçeklendirme, kırpma, CVPixelBuffer’a dönüştürme) otomatikleştirir. Model bir görüntü yerine MultiArray veya Double kabul ediyorsa — doğrudan Core ML kullanın. VNCoreMLRequest yalnızca girdi olarak Image Feature’a sahip modeller içindir.
Güncellenmiş MLModel’den yeni bir VNCoreMLModel ve yeni bir VNCoreMLRequest oluşturun. Eski istek, eski model sürümünü kullanmaya devam edecektir. Uzaktan model güncellemeleri için, sunucudan indirilen bir .mlmodelc dosyasından cihazda modeli derlemek üzere MLModel.compileModel(at:) kullanın.
VNCoreMLRequest yalnızca tek bir Image Feature girdisine sahip modelleri destekler. Modelin birden çok girdisi varsa (örneğin, görüntü + metin), MLModel aracılığıyla doğrudan Core ML kullanın. Vision, görüntünün ötesinde ek parametreler iletemez.
VNImageRequestHandler’a iletilen CGImage için sınır 8192 x 8192 pikseldir. Ancak Core ML modelleri genellikle 224x224, 299x299 veya 512x512 girdi bekler. Vision, büyük görüntüleri otomatik olarak girdi boyutuna ölçeklendirir. Orijinal görüntü çok büyükse, bellekten tasarruf etmek için önceden CGImage aracılığıyla küçültün.
Evet, VNRequest üzerinde preferBackgroundProcessing = true ayarlayın. Bu, sistem kaynak yoğun bir moddayken (örneğin, içerik yükleme) Vision’ın istek yürütmesini ertelemesine olanak tanır. Ayrıca, handler.perform() çağrısı için DispatchQueue.global(qos: .background) kullandığınızdan emin olun.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun