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, 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.
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.
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.
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ı).
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).
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 İstek | Sonuç |
|---|---|---|
| Yüz Algılama | VNDetectFaceRectanglesRequest | VNFaceObservation |
| Metin Tanıma | VNRecognizeTextRequest | VNRecognizedTextObservation |
| Barkodlar | VNDetectBarcodesRequest | VNBarcodeObservation |
| Sınıflandırma | VNClassifyImageRequest | VNClassificationObservation |
| İzleme | VNTrackObjectRequest | VNDetectedObjectObservation |
| Konturlar | VNDetectContoursRequest | VNContoursObservation |
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).
// 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 — 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).
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.
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.
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, 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.
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
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 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.
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.
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.
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
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