VNRequest — bu nədir, iOS-da Vision sorğularının quruluşu

Müəllif: IT Sectr Dərc olunub: 2026-07-20 Oxuma vaxtı: 8 dəq

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 — Vision-un bütün sorğu üçün bazası sinif: şəkil, video və ML modellərinin analizi.
  • Sorğu VNImageRequestHandler (şəkil) və ya VNSequenceRequestHandler (video) vasitəsilə yerinə yetirilir.
  • Nəticələr VNObservation massivi şəklində qaytarılır — hər bir alt sinif spesifik məlumatları ehtiva edir.
  • Completion handler analiz başa çatdıqdan sonra nəticələri asinxron emal etməyə imkan verir.
  • Bir neçə sorğu bir şəkil üçün bir çağırışla handler.perform() yerinə yetirmək olar.

Vision-da VNRequest nədir?

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.

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

Analiz üçün əsas VNRequest növləri

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.

Aşkarlama və tanıma

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

Mətn analizi

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

Təsnifat və analiz

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

KateqoriyaSorğu nümunəsiNəticə
Üzlərin aşkarlanmasıVNDetectFaceRectanglesRequestVNFaceObservation
Mətnin tanınmasıVNRecognizeTextRequestVNRecognizedTextObservation
ŞtrixkodlarVNDetectBarcodesRequestVNBarcodeObservation
TəsnifatVNClassifyImageRequestVNClassificationObservation
IzləməVNTrackObjectRequestVNDetectedObjectObservation
KonturlarVNDetectContoursRequestVNContoursObservation

VNImageRequestHandler və VNSequenceRequestHandler

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

swift
// 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: nəticələrin strukturu

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ı).

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

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.

Bir neçə sorğun eyni vaxtda yerinə yetirilməsi

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.

swift
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 ilə xüsusi sorğular

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.

swift
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

Yerinə yetirilən VNRequest-i ləğv etmək olarmı?

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 və VNDetectFaceLandmarksRequest — fərqi nədir?

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.

Şrixkodları axtarmaq üçün hansı request istifadə olunur — VNDetectBarcodesRequest?

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.

VNRequest-i CGImage deyil, CIImage üzərində yerinə yetirmək olarmı?

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.

Bir perform() də neçə VNRequest yerinə yetirilə bilə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

  • VNRequest — vahid Request-Response arxitekturası ilə şɘkil və video analizinin bütün növləri üçün Vision-un bazası sinfi.
  • Vision üz aşkarlanması, OCR, ştrixkodlar, təsnifat, konturlar, izləmə və ML modelləri üçün 25+ VNRequest alt sinfi ehtiva edir.
  • VNImageRequestHandler statik şɘkillərdə sorğuları yerinə yetirir; VNSequenceRequestHandler — izləmə üçün kadr ardıcıllıqlarında.
  • Nəticələr bounding box, confidence, uuid və növ üçün spesifik məlumatlarla VNObservation şəklində qaytarılır.
  • Bir perform()-də çoxsaylı sorğular ML hesablamalarının təkrar istifadəsi sayəsində ardıcıl çağırışlardan 30–40% sürətlidir.
  • VNCoreMLRequest avtomatik ilkin şɘkil emalı ilə xüsusi Core ML modellərini Vision pipeline-ına inteqrasiya edir.
  • Bütün sorğular cihazda yerinə yetirilir, məlumatları serverə göndərmədən məxfilik və oflayn işi təmin edir.

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.

Layihəni müzakirə et

Həm də oxuyun