VNCoreMLRequest — nedir, iOS’ta Core ML için Vision isteği

Yazar: IT Sectr Yayınlanma: 2026-07-20 Okuma süresi: 8 dk

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 — Core ML ve Vision arasında köprü: ML modeli bir Vision isteği olarak çalışır.
  • Otomatik görüntü ön işleme: model gereksinimlerine göre ölçeklendirme, kırpma ve renk düzeltme.
  • Hatlar oluşturmak için tek bir perform() işleminde diğer VNRequest ile birleştirilebilir.
  • VNCoreMLModel desteği — görüntüler ve FeatureValue ile çalışmak için MLModel üzerinde bir sarmalayıcı.
  • Maksimum performans için Neural Engine ve GPU üzerinde çalışır.

VNCoreMLRequest Nedir?

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.

swift
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 modeli üzerinde sarmalayıcı

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.

swift
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 Yapılandırması

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.

swift
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.

Diğer VNRequest ile Birleştirme

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.

swift
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 → duyguVNDetectFaceRectanglesRequestVNCoreMLRequestRuh hali tespiti
Nesne → markaVNDetectObjectAtPointRequestVNCoreMLRequestLogo tanıma
Metin → dilVNRecognizeTextRequestVNCoreMLRequestMetin dili sınıflandırması
Sahne → açıklamaVNClassifyImageRequestVNCoreMLRequestEtiket oluşturma

VNCoreMLRequest Sonuçlarını İşleme

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.

swift
// 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.

En İyi Uygulamalar ve Performans

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.

Bellek yönetimi

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

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.

swift
// 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

VNCoreMLRequest Vision olmadan — doğrudan Core ML ile kullanılabilir mi?

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.

Yeni bir model sürümü yayınlandığında VNCoreMLRequest nasıl güncellenir?

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 birden çok girdili modelleri destekler mi?

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.

VNCoreMLRequest için maksimum görüntü boyutu nedir?

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.

VNCoreMLRequest arka planda çalıştırılabilir mi?

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

  • VNCoreMLRequest — otomatik görüntü ön işlemesiyle Vision hattında Core ML modellerini çalıştırmak için VNRequest’in bir alt sınıfı.
  • VNCoreMLModel, MLModel’i Vision için sarmalar ve CGImage’ı gerekli boyut ve renk uzayındaki CVPixelBuffer’a otomatik olarak dönüştürür.
  • imageCropAndScaleOption (centerCrop, scaleFill, scaleFit) ölçeklendirme stratejisini belirler ve model doğruluğunu %15–25 etkiler.
  • VNDetectFaceRectanglesRequest ve diğer VNRequest ile birleştirme, regionOfInterest ile “algılama → sınıflandırma” hatları oluşturmaya olanak tanır.
  • Sonuçlar VNClassificationObservation (sınıflandırma için) veya VNCoreMLFeatureValueObservation (regresyon/diğer türler için) olarak döndürülür.
  • Toplu işleme için tek bir VNCoreMLRequest’i yeniden kullanma, her görüntü için yeni oluşturmaya kıyasla %40’a kadar performans artışı sağlar.
  • Neural Engine üzerinde performans (MobileNetV2’de 3–5 ms), CPU’dan 4–6 kat daha hızlıdır ve gerçek zamanlı uygulamalar için kritiktir.

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.

Projeyi tartış

Ayrıca okuyun