VNRequest — nedir, iOS’ta Vision isteklerinin çalışma şekli

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

VNRequest, Vision framework’ünün bir görüntü veya video akışı analiz birimini temsil eden soyut bir temel sınıfıdır. Her analiz türü — yüz algılama, metin tanıma, barkod arama, sınıflandırma — VNRequest’in somut bir alt sınıfı olarak uygulanır. Apple Geliştirici Belgeleri’ne (2024) göre, bir geliştirici bir istek örneği oluşturur, parametrelerini yapılandırır, VNImageRequestHandler aracılığıyla bir görüntü iletir ve sonuçları bir VNObservation dizisi olarak alır.

Önemli Noktalar

  • VNRequest — tüm Vision istekleri için temel sınıf: görüntü analizi, video ve ML modelleri.
  • Bir istek VNImageRequestHandler (görüntü) veya VNSequenceRequestHandler (video) aracılığıyla yürütülür.
  • Sonuçlar bir VNObservation dizisi olarak döndürülür — her alt sınıf belirli veriler içerir.
  • Completion handler, analiz tamamlandıktan sonra sonuçların eşzamansız olarak işlenmesine olanak tanır.
  • Bir görüntü için handler.perform() işlevinin tek bir çağrısıyla birden çok istek yürütülebilir.

Vision’da VNRequest Nedir?

VNRequest, görüntü ve video analizi için İstek-Yanıt modelini uygulayan Vision mimarisinin temel bir öğesidir. VNRequest’in her alt sınıfı, belirli bir bilgisayarlı görü görevinden sorumludur: yüz algılama, metin tanıma, içerik sınıflandırma.

VNRequest mimarisi, “neyin analiz edileceğini” (istek) “nasıl işleneceğinden” (işleyici) ayırır. Geliştirici, isteği (analiz türü, ek parametreler) yapılandırır ve görüntüyle birlikte işleyiciye iletir. İşleyici, isteği yürütür ve geliştiricinin iç ML algoritmalarını anlamasını gerektirmeden sonuçları döndürür.

VNRequest’in tüm alt sınıfları birleşik bir yapı izler: isteğe bağlı completion handler ile başlatma, özelliklerin yapılandırılması (ilgi alanı, doğruluk düzeyi) ve işleyiciye aktarma. Bu, API’yi öngörülebilir ve kolayca genişletilebilir kılar — yeni bir analiz türü eklemek, yeni bir VNRequest alt sınıfı oluşturmak anlamına gelir.

swift
import Vision

// 1. İstek oluştur
let request = VNDetectFaceRectanglesRequest { req, _ in
    // 3. Sonuçları işle
    guard let faces = req.results as? [VNFaceObservation]
    else { return }
    print("Found \\(faces.count) faces")
}

// 2. İşleyici aracılığıyla yürüt
let handler = VNImageRequestHandler(cgImage: cgImage, options: [:])
try handler.perform([request])

VNRequest’in temel özellikleri: regionOfInterest (analizi hızlandırmak için görüntü üzerindeki ilgi alanı), preferBackgroundProcessing (arka plan modu), revision (algoritma sürümü) ve cancellationSupport. Bu özelliklerin doğru yapılandırılması, belirli bir görev için performansı optimize etmeye olanak tanır.

Apple WWDC 2024’e göre, Vision’ın varlığının 7 yılında, kullanılabilir VNRequest alt sınıflarının sayısı 8’den (iOS 11) 25+ (iOS 18)’e yükselerek mobil cihazlardaki tüm temel bilgisayarlı görü görevlerini kapsamaktadır.

Analiz İçin Ana VNRequest Türleri

Vision, 25+ VNRequest alt sınıfını kategorilere ayrılmış olarak içerir: algılama, tanıma, izleme ve sınıflandırma. Her alt sınıf, VNRequest’ten miras alır ve göreve özgü özellikler ekler.

Algılama ve Tanıma

VNDetectFaceRectanglesRequest — görüntülerde yüz algılama. Sınırlama kutusu koordinatları ve güven ile VNFaceObservation döndürür. VNDetectHumanRectanglesRequest — kişiler için benzer. VNDetectHumanBodyPoseRequest — insan duruşu tahmini (iskelet noktaları).

Metin Analizi

VNRecognizeTextRequest — 13 dil ve iki doğruluk düzeyi desteğiyle metin tanıma. VNReadCodeRequest — özel kodlar için. VNDetectTextRectanglesRequest — tanıma olmadan metin alanları arama (daha hızlı, ancak yalnızca dikdörtgenler).

Sınıflandırma ve Analiz

VNClassifyImageRequest — görüntüleri 1.000 ImageNet kategorisine göre sınıflandırma. VNGenerateImageFeaturePrintRequest — görüntü karşılaştırma için özellik vektörü çıkarma. VNDetectContoursRequest — nesne konturlarını algılama.

KategoriÖrnek İstekSonuç
Yüz AlgılamaVNDetectFaceRectanglesRequestVNFaceObservation
Metin TanımaVNRecognizeTextRequestVNRecognizedTextObservation
BarkodlarVNDetectBarcodesRequestVNBarcodeObservation
SınıflandırmaVNClassifyImageRequestVNClassificationObservation
İzlemeVNTrackObjectRequestVNDetectedObjectObservation
KonturlarVNDetectContoursRequestVNContoursObservation

VNImageRequestHandler ve VNSequenceRequestHandler

VNImageRequestHandler — statik görüntüler için bir işleyici. CGImage, CIImage veya Data (JPEG/PNG) kabul eder ve bir veya daha fazla VNRequest örneğini yürütür. Bu, Vision’ı fotoğraflar, ekran görüntüleri ve yüklenen görüntüler için kullanmanın birincil yoludur.

VNSequenceRequestHandler — görüntü dizileri (video kareleri) için bir işleyici. Aynı görüntü türlerini kabul eder ancak kareler arasında durumu koruyarak kare kare işleme için tasarlanmıştır (nesne izleme için gereklidir).

swift
// Tek görüntü için VNImageRequestHandler
let imageHandler = VNImageRequestHandler(
    cgImage: cgImage,
    orientation: orientation,
    options: [:])

// Video için VNSequenceRequestHandler
let sequenceHandler = VNSequenceRequestHandler()
try sequenceHandler.perform([trackingRequest],
    on: cgImage)

Önemli fark: VNSequenceRequestHandler, birden çok isteğin paralel yürütülmesini desteklemez — her perform() çağrısı, bir kare için bir dizi isteği işler. Çok iş parçacıklı video işleme için, farklı iş parçacıkları için ayrı işleyici örnekleri oluşturun.

VNImageRequestHandler bir arka plan kuyruğunda çalışabilir. Apple, etkileşimli senaryolar için (kullanıcı sonuçları bekler) DispatchQueue.global(qos: .userInitiated) ve toplu işleme için (tüm fotoğraf kitaplığını analiz etme gibi) .background kullanılmasını önerir.

VNObservation: Sonuçların Yapısı

VNObservation — tüm Vision istek sonuçları için temel sınıf. VNObservation’ın her alt sınıfı, analiz türüne özgü veriler içerir: sınırlama kutusu koordinatları, tanınan metin, güven, benzersiz tanımlayıcı (uuid) ve zaman damgası (timeRange).

VNObservation‑ın temel alt sınıfları: VNFaceObservation (sınırlama kutusu ve yüz işaretleriyle yüz algılama sonucu), VNRecognizedTextObservation (adaylarla tanınan metin), VNBarcodeObservation (yük ve sembolojiyle çözülmüş barkod), VNClassificationObservation (güvenle sınıflandırma kategorisi).

swift
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)")
    }
}

Güven özelliği (0.0 ila 1.0 arası) tüm VNObservation örneklerinde bulunur ve modelin sonuca olan güvenini gösterir. Apple, çoğu görev için güveni < 0.5 olan gözlemlerin atılmasını önerir. Kritik uygulamalar için (tıp, güvenlik), eşik 0.8–0.9’a yükseltilmelidir.

VNObservation ayrıca timeRange (video istekleri için) ve uuid (kareler arası eşleme için benzersiz kimlik) içerir. Bu, aynı nesnenin (bir yüz gibi) bir dizi video karesi boyunca izlenmesine olanak tanır.

Birden Çok İsteği Aynı Anda Yürütme

VNRequest’in temel avantajlarından biri, aynı görüntü üzerinde tek bir handler.perform() çağrısıyla birden çok farklı isteği yürütme yeteneğidir. Vision, yürütme sırasını dahili olarak optimize eder ve ortak hesaplamaları (görüntü ön işleme gibi) yeniden kullanır.

Bu, tek bir geçişte bir görüntü hakkında eksiksiz bir veri kümesi elde edilmesini sağlar: aynı anda yüzleri algılama, metin tanıma, barkodları bulma ve içeriği sınıflandırma. Bu yaklaşım, her bir isteği sırayla çağırmaktan önemli ölçüde daha verimlidir.

swift
import Vision

// Tek bir dizide birden çok istek
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
])

// Her istekten sonuçlara eriş
print("Faces: \\(faceRequest.results?.count ?? 0)")
print("Text blocks: \\(textRequest.results?.count ?? 0)")

Sınırlamalar: tüm istekler diğerleriyle birleştirilemez. Örneğin, VNGenerateImageFeaturePrintRequest ayrı olarak yürütülmelidir. Apple, istekleri türe göre gruplamayı (algılama, tanıma, sınıflandırma) ve kombinasyonları hedef cihazlarda test etmeyi önerir.

Performans: Tek bir perform() işleminde 3–4 isteği birleştirmek, sıralı yürütmeden %30–40 daha hızlıdır çünkü Vision, paylaşılan ML hesaplamalarını ve görüntü ön işlemeyi (boyutlandırma, renk düzeltme) yeniden kullanır.

VNCoreMLRequest ile Özelleştirilmiş İstekler

VNCoreMLRequest, Core ML ile Vision arasında bir köprü görevi görerek herhangi bir Core ML modelinin bir Vision isteği olarak çalıştırılmasına olanak tanır. Model, VNCoreMLModel içine sarılır, VNCoreMLRequest’e iletilir ve Vision, görüntü ön işlemeyi (boyutlandırma, model giriş boyutuna kırpma) otomatik olarak halleder.

VNCoreMLRequest, VNRequest’ten miras alır, bu nedenle tüm standart özellikleri destekler: regionOfInterest, completion handler, birden çok istek. Bu, özelleştirilmiş bir ML modelinin Vision’ın yerleşik algılayıcılarıyla tek bir iş hattında birleştirilmesine olanak tanır.

swift
import Vision
import CoreML

// Core ML modelini sarma
guard let mlModel = try VNCoreMLModel(
    for: MyCustomClassifier().model)
else { return }

// VNCoreMLRequest oluşturma
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’ın görüntüyü model girişine göre nasıl boyutlandıracağını belirler: .centerCrop (ortadan kırpma), .scaleFill (uzatma) veya .scaleFit (en boy oranını koruyarak boyutlandırma). Seçim, model türüne ve görüntüfeki nesnenin konumuna bağlıdır.

Pratik örnek: VNDetectFaceRectanglesRequest aracılığıyla yüz algılama, ardından özelleştirilmiş bir modelle (cinsiyet veya yaş tahmini gibi) VNCoreMLRequest aracılığıyla her yüzü sınıflandırma. İki isteği tek bir perform() işleminde birleştirerek, tek bir geçişte eksiksiz bir yüz analizi iş hattı elde edersiniz.

Sıkça Sorulan Sorular

Çalışan bir VNRequest iptal edilebilir mi?

Evet, her VNRequest’in isteğin yürütülmesini iptal eden bir cancel() özelliği vardır. Ancak iptal, yalnızca işleme başlamadan önce çalışır — ML modeli zaten başlatılmışsa, iptal hesaplamayı kesintiye uğratmaz. Güvenilir iptal için, completion handler içinde DispatchWorkItem.cancel() işlevini VNRequest.cancel() ile birlikte kullanın.

VNDetectFaceRectanglesRequest ve VNDetectFaceLandmarksRequest — farkı nedir?

VNDetectFaceRectanglesRequest yalnızca yüzlerin sınırlama dikdörtgenlerini bulur. VNDetectFaceLandmarksRequest ayrıca 68 yüz anahtar noktasını (gözler, kaşlar, burun, ağız, kontur) tanımlar. VNDetectFaceLandmarksRequest daha yavaştır ancak animasyon, maske ve AR efektleri için daha fazla veri sağlar. Basit yüz sayma için VNDetectFaceRectanglesRequest yeterlidir.

Barkodları arayan istek hangisidir — VNDetectBarcodesRequest?

Evet, VNDetectBarcodesRequest her tür barkod ve QR kodu için doğru istektir. EAN, UPC, Code 39, Code 128, PDF417, Aztec, QR ve diğer biçimleri destekler. Sonuç, yük ve sembolojiyle birlikte VNBarcodeObservation içinde döndürülür. Video akışları için AVCaptureMetadataOutput kullanın — canlı tarama için daha hızlıdır.

VNRequest, CGImage yerine CIImage üzerinde yürütülebilir mi?

Evet, VNImageRequestHandler, init(ciImage:options:) başlatıcısı aracılığıyla CIImage kabul eder. Ayrıca Data (JPEG/PNG) ve NSURL (dosya yolu) destekler. CIImage, görüntü zaten Core Image iş hattı üzerinden yüklenmişse kullanışlıdır — bu, bellekte gereksiz veri kopyalamayı önler.

Tek bir perform() işleminde kaç VNRequest örneği yürütülebilir?

Sayı sınırı yoktur, ancak pratikte 3–5 istek idealdir. 5’ten fazla istek, her istek kendi ML modelini yüklediğinden bellek tüketiminde artışa neden olabilir. 10+ farklı analiz çalıştırmanız gerekiyorsa, bunları 2–3 gruba ayırın ve sırayla yürütün.

Özet

  • VNRequest — birleşik İstek-Yanıt mimarisiyle her tür görüntü ve video analizi için Vision’ın temel sınıfı.
  • Vision, yüz algılama, OCR, barkod, sınıflandırma, kontur, izleme ve ML modelleri için 25+ VNRequest alt sınıfı içerir.
  • VNImageRequestHandler statik görüntülerde istekleri yürütür; VNSequenceRequestHandler izleme için kare dizilerini işler.
  • Sonuçlar, sınırlama kutusu, güven, uuid ve türe özgü verilerle VNObservation olarak döndürülür.
  • Tek bir perform() işlemindeki birden çok istek, ML hesaplamasının yeniden kullanımı sayesinde sıralı çağrılardan %30–40 daha hızlı çalışır.
  • VNCoreMLRequest, otomatik görüntü ön işlemeyle özel Core ML modellerini Vision iş hattına entegre eder.
  • Tüm istekler, sunucuya veri göndermeden cihazda yürütülerek gizlilik ve çevrimdışı çalışma sağlar.

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