VNRequest — Vision çərçivəsinin abstrakt bazası sinfidir, şəkil və ya video axının analiz vahidini təmsil edir. Hər bir analiz növü — üzlərin aşkarlanması, mətnin tanınması, ştrixkodların axtarılması, təsnifat — VNRequest-in konkret alt sinfi kimi tətbiq edilir. Apple Developer Documentation-a (2024) görə, tərtibatçı sorğu nümunəsini yaradır, onun parametrlərini konfiqurasiya edir, şəkli VNImageRequestHandler vasitəsilə ötürür və nəticələri VNObservation massivi şəklində alır.
Başlıca
VNRequest — şɘkil və videoların analizi üçün Request-Response nümunəsini tətbiq edən Vision arxitekturasının əsas elementidir. VNRequest-in hər bir alt sinfi kompüter görməsinin müəyyən bir tapşırığına cavabdehdir: üzlərin axtarılması, mətnin tanınması, məzmunun təsnifatı.
VNRequest arxitekturası „nə analiz etməli” (sorğu) „necə emal etməli” (handler)-dən ayırır. Tərtibatçı sorğu (analiz növü, əlavə parametrlər) konfiqurasiya edir və onu şɘkillə birlikdə handler-ə ötürür. Handler sorğu yerinə yetirir və nəticələri qaytarır, tərtibatçıdan daxili ML alqoritmlərini başa düşməyi tələb etmir.
Bütün VNRequest alt sinifləri vahid struktura malikdir: isteğə bağlı completion handler ilə işə salma, xassələrin konfiqurasiyası (analiz regionu, dəqiqlik səviyyəsi) və handler-ə ötürmə. Bu, API-ni proqnozlaşdırıla bilən və asanlıqla genişləndirilən edir — yeni analiz növü əlavə etmək VNRequest-in yeni alt sinfini yaratmaq deməkdir.
import Vision
// 1. Sorğu yarat
let request = VNDetectFaceRectanglesRequest { req, _ in
// 3. Nəticələri emal et
guard let faces = req.results as? [VNFaceObservation]
else { return }
print("Found \\(faces.count) faces")
}
// 2. Handler vasitəsilə yerinə yetir
let handler = VNImageRequestHandler(cgImage: cgImage, options: [:])
try handler.perform([request])
VNRequest-in əsas xassələri: regionOfInterest (analizi sürətləndirmək üçün şəkildə maraq dairəsi), preferBackgroundProcessing (fon rejimi), revision (alqoritm versiyası) və cancellationSupport. Bu xassələrin düzgün konfiqurasiyası performansı konkret tapşırığa uyğun optimallaşdırmağa imkan verir.
Apple WWDC 2024-yə görə, Vision-un 7 illik mövcudluğu ərzində mövcud VNRequest alt siniflərinin sayı 8-dən (iOS 11) 25+-dək (iOS 18) artıb, mobil cihazlarda kompüter görməsinin bütün əsas tapşırıqlarını əhatə edir.
Vision 25-dən çox VNRequest alt sinfini əhatə edir, kateqoriyalara bölünüb: aşkarlama, tanıma, izləmə və təsnifat. Hər bir alt sinif VNRequest-dən miras alır və tapşırıq üçün spesifik xassələr əlavə edir.
VNDetectFaceRectanglesRequest — şəkildə üzlərin axtarılması. bounding box koordinatları və confidence ilə VNFaceObservation qaytarır. VNDetectHumanRectanglesRequest — insanlar üçün analoji. VNDetectHumanBodyPoseRequest — insan duruşunun müəyyən edilməsi (skelet nöqtələri).
VNRecognizeTextRequest — 13 dil və iki dəqiqlik səviyyəsi ilə mətnin tanınması. VNReadCodeRequest — ixtisaslaşdırılmış kodlar üçün. VNDetectTextRectanglesRequest — tanıma olmadan mətn sahələrinin axtarılması (daha sürətli, ancaq yalnız düzbucaqlılar).
VNClassifyImageRequest — şɘklin ImageNet-in 1000 kateqoriyası üzrə təsnifatı. VNGenerateImageFeaturePrintRequest — şɘkilləri müqayisə etmək üçün feature vector-un çıxarılması. VNDetectContoursRequest — obyekt konturlarının aşkarlanması.
| Kateqoriya | Sorğu nümunəsi | Nəticə |
|---|---|---|
| Üzlərin aşkarlanması | VNDetectFaceRectanglesRequest | VNFaceObservation |
| Mətnin tanınması | VNRecognizeTextRequest | VNRecognizedTextObservation |
| Ştrixkodlar | VNDetectBarcodesRequest | VNBarcodeObservation |
| Təsnifat | VNClassifyImageRequest | VNClassificationObservation |
| Izləmə | VNTrackObjectRequest | VNDetectedObjectObservation |
| Konturlar | VNDetectContoursRequest | VNContoursObservation |
VNImageRequestHandler — statik şɘkillər üçün handler. CGImage, CIImage və ya Data (JPEG/PNG) qəbul edir və bir və ya bir neçə VNRequest yerinə yetirir. Bu, fotoşəkillər, ekran görüntüləri və yüklənmiş şəkillər üçün Vision-dan istifadənin əsas yoludur.
VNSequenceRequestHandler — şɘkil ardıcıllıqları (video kadrları) üçün handler. Eyni şɘkil növləri dəstini qəbul edir, lakin kadrlar arasında vəziyyəti qorumaqla kadr-kadr emal üçün nəzərdə tutulub (obyekt izləməsi üçün zəruridir).
// Tək şɘkil üçün VNImageRequestHandler
let imageHandler = VNImageRequestHandler(
cgImage: cgImage,
orientation: orientation,
options: [:])
// Video üçün VNSequenceRequestHandler
let sequenceHandler = VNSequenceRequestHandler()
try sequenceHandler.perform([trackingRequest],
on: cgImage)
Əhəmiyyətli fərq: VNSequenceRequestHandler bir neçə sorğun paralel yerinə yetirilməsini dəstəkləmir — hər bir perform() çağırışı bir kadr üçün bir sorğu dəsti emal edir. Çoxiplikli video emalı üçün müxtəlif ipliklər üçün ayrı handler nümunələri yaradın.
VNImageRequestHandler fon növbəsində yerinə yetirilə bilər. Apple interaktiv ssenarilər üçün DispatchQueue.global(qos: .userInitiated) (istifadəçi nəticəni gözləyir) və toplu emal üçün .background (məsələn, bütün foto kitabxanasının analizi) tövsiyə edir.
VNObservation — Vision sorğularının bütün nəticələri üçün bazası sinif. Hər bir VNObservation alt sinfi analiz növü üçün spesifik məlumatları ehtiva edir: bounding box koordinatları, tanınmış mətn, confidence, unikal identifikator (uuid) və vaxt damğası (timeRange).
VNObservation-ın əsas alt sinifləri: VNFaceObservation (üz aşkarlama nəticəsi bounding box və landmarks ilə), VNRecognizedTextObservation (candidates ilə tanınmış mətn), VNBarcodeObservation (payload və symbology ilə dekodlanmış ştrixkod), VNClassificationObservation (confidence ilə təsnifat kateqoriyası).
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)")
}
}
confidence xassəsi (0.0-dan 1.0-dək) bütün VNObservation-larda mövcuddur və modelin nəticəyə inamını göstərir. Apple əksər tapşırıqlar üçün confidence < 0.5 olan müşahidələrin atılmasını tövsiyə edir. Kritik tətbiqlər (tibb, təhlükəsizlik) üçün həddi 0.8–0.9-dək qaldırmağa dəyər.
VNObservation həmçinin timeRange (video sorğuları üçün) və uuid (kadrlar arasında uyğunlaşdırma üçün unikal ID) ehtiva edir. Bu, eyni obyekti (məsələn, üz) video kadrları ardıcıllığı üzrə izləməyə imkan verir.
VNRequest-in əsas üstünlüklərindən biri — bir handler.perform() çağırışında bir şɘkildə bir neçə müxtəlif sorğu yerinə yetirmək imkanı. Vision daxili olaraq icra sırasını optimallaşdırır və ümumi hesablamaları (məsələn, şɘkilin ilkin emalını) təkrar istifadə edir.
Bu, bir keçiddə şɘkil haqqında tam məlumat dəsti əldə etməyə imkan verir: eyni vaxtda üzləri müəyyən etmək, mətni tanımaq, ştrixkodları tapmaq və məzmunu təsnif etmək. Bu yanaşma hər sorğu ayrılıqda ardıcıl çağırmaqdan qat-qat səmərəlidir.
import Vision
// Tək massivdə çoxsaylı sorğular
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
])
// Hər sorğudan nəticələri əldə et
print("Faces: \\(faceRequest.results?.count ?? 0)")
print("Text blocks: \\(textRequest.results?.count ?? 0)")
Məhdudiyyətlər: bütün sorğular digɘrləri ilə birləşdirilə bilməz. Məsələn, VNGenerateImageFeaturePrintRequest ayrıca yerinə yetirilməlidir. Apple sorğuları növünə görə qruplaşdırmağı (aşkarlama, tanıma, təsnifat) və kombinasiyaları hədəf cihazlarda test etməyi tövsiyə edir.
Performans: bir perform() də 3–4 sorğun birləşdirilməsi ardıcıl icradan 30–40% sürətlidir, çünki Vision ümumi ML hesablamalarını və şɘkilin ilkin emalını (miqyaslama, rəng korreksiyası) təkrar istifadə edir.
VNCoreMLRequest — Core ML ilə Vision arasında körpüdür, istənilən Core ML modelini Vision sorğu kimi işə salmağa imkan verir. Model VNCoreMLModel-ə bürülür, VNCoreMLRequest-ə ötürülür və Vision avtomatik olaraq şɘklin ilkin emalını (miqyaslama, modelin giriş ölçüsünə uyğun kəsmə) yerinə yetirir.
VNCoreMLRequest VNRequest-dən miras alır, buna görə bütün standart imkanları dəstəkləyir: regionOfInterest, completion handler, çoxsaylı sorğular. Bu, xüsusi ML modelini Vision-un daxili aşkarlayıcıları ilə bir pipeline-də birləşdirməyə imkan verir.
import Vision
import CoreML
// Core ML modelini sar
guard let mlModel = try VNCoreMLModel(
for: MyCustomClassifier().model)
else { return }
// VNCoreMLRequest yarat
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-un şɘkli modelin girişinə necə miqyaslayacağını müəyyən edir: .centerCrop (mərkəzdən kəsmə), .scaleFill (uzatma) və ya .scaleFit (nisbətləri qoruyaraq miqyaslama). Seçim modelin növündən və şɘkildə obyektin yerləşməsindən asılıdır.
Praktik nümunə: VNDetectFaceRectanglesRequest vasitəsilə üzlərin aşkarlanması, sonra hər bir üzün VNCoreMLRequest ilə xüsusi model vasitəsilə təsnifatı (məsələn, cins və ya yaşın müəyyən edilməsi). İki sorğu bir perform()-də birləşdirərək, bir keçiddə tam üz analizi pipeline-ı əldə edirsiniz.
Tez-tez verilən suallar
Bəli, hər bir VNRequest sorğun icrasını ləğv edən cancel() xassəsinə malikdir. Lakin ləğv yalnız emal başlamamışdan əvvəl işləyir — əgər ML modeli artıq işə salınıbsa, ləğv hesablamanı dayandırmaz. Etibarlı ləğv üçün completion handler-də DispatchWorkItem.cancel() ilə birlikdə VNRequest.cancel() istifadə edin.
VNDetectFaceRectanglesRequest yalnız üz düzbucaqlılarını tapır. VNDetectFaceLandmarksRequest əlavə olaraq üzün 68 əsas nöqtəsini (gözlər, qaşlar, burun, ağız, kontur) müəyyən edir. VNDetectFaceLandmarksRequest yavaşdır, lakin animasiya, maskalar və AR effektləri üçün daha çox məlumat verir. Sadəcə üzləri saymaq üçün VNDetectFaceRectanglesRequest kifayətdir.
Bəli, VNDetectBarcodesRequest — bütün ştrixkod və QR kod növləri üçün düzgun sorğudur. EAN, UPC, Code 39, Code 128, PDF417, Aztec, QR və digər formatları dəstəkləyir. Nəticə payload və symbology ilə VNBarcodeObservation-da qaytarılır. Video axını üçün AVCaptureMetadataOutput istifadə edin — canlı skan etmək üçün daha sürətlidir.
Bəli, VNImageRequestHandler CIImage-i init(ciImage:options:) initallaşdırıcısı vasitəsilə qəbul edir. Həmçinin Data (JPEG/PNG) və NSURL (fayl yolu) dəstəklənir. CIImage, şəkil artıq Core Image pipeline vasitəsilə yükləndikdə rahatdır — bu, yaddaşda lazımsız məlumat kopyalamasının qarşısını alır.
Say məhdudiyyəti yoxdur, lakin praktikada 3–5 sorğu optimal miqdardır. 5-dən çox sorğu yaddaş istehlakının artmasına səbəb ola bilər, çünki hər sorğu öz ML modelini yükləyir. 10+ müxtəlif analiz yerinə yetirmək lazımdırsa, onları 2–3 qrupa bölün və ardıcıl yerinə yetirin.
Yekun
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