VNRequest — τι είναι, αρχιτεκτονική αιτημάτων Vision στο iOS

Συγγραφέας: IT Sectr Δημοσιεύτηκε: 2026-07-20 Χρόνος ανάγνωσης: 8 λεπ

VNRequest — είναι μια αφηρημένη βασική κλάση του πλαισίου Vision που αντιπροσωπεί μια μονάδα ανάλυσης εικόνας ή ροής βίντεο. Κάθε τύπος ανάλυσης — ανίχνευση προσώπων, αναγνώριση κειμένου, αναζήτηση αριθμών βαρών, ταξινόμηση — υλοποιείται ως μια συγκεκριμένη υποκλάση του VNRequest. Σύμφωνα με τα Apple Developer Documentation (2024), ο αναπτυκτής δημιουργεί μια περίπτωση αιτήματος, ρυθμίζει τις παραμέτρους του, μεταβιβάζει την εικόνα μέσω VNImageRequestHandler και λαμβάνει τα αποτελέσματα ως έναν πίνακα VNObservation.

Βασικά Σημεία

  • VNRequest — βασική κλάση για όλα τα αιτήματα Vision: ανάλυση εικόνων, βίντεο και μοντέλων ML.
  • Το αίτημα εκτελείται μέσω VNImageRequestHandler (εικόνα) ή VNSequenceRequestHandler (βίντεο).
  • Τα αποτελέσματα επιστρέφονται ως ένας πίνακας VNObservation — κάθε υποκλάση περιέχει συγκεκριμένα δεδομένα.
  • Completion handler επιτρέπει την ασύγχρονη επεξεργασία των αποτελεσμάτων μετά τον τερματισμό της ανάλυσης.
  • Πολλά αιτήματα μπορούν να εκτελεστούν με μια κλήση handler.perform() για μία εικόνα.

Τι είναι το VNRequest στο Vision;

VNRequest — είναι το θεμελιώδες στοιχείο της αρχιτεκτονικής Vision, που υλοποιεί το πρότυπο Request-Response για την ανάλυση εικόνων και βίντεο. Κάθε υποκλάση VNRequest είναι υπεύθυνη για μια συγκεκριμένη εργασία υπολογιστικής όρασης: αναζήτηση προσώπων, αναγνώριση κειμένου, ταξινόμηση περιεχομένου.

Η αρχιτεκτονική VNRequest διαχωρίζει το «τι να αναλύσουμε» (αίτημα) από το «πώς να επεξεργαστούμε» (handler). Ο αναπτυκτής ρυθμίζει το αίτημα (τύπο ανάλυσης, επιπλέον παραμέτρους) και το μεταβιβάζει στο handler μαζί με την εικόνα. Το handler εκτελεί το αίτημα και επιστρέφει τα αποτελέσματα χωρίς να απαιτείται από τον αναπτυκτή να κατανοεί τους εσωτερικούς αλγόριθμους ML.

Όλες οι υποκλάσεις VNRequest ακολουθούν μια ενιαία δομή: αρχικοποίηση με προαιρετικό completion handler, ρύθμιση ιδιοτήτων (περιοχή ανάλυσης, επίπεδο ακρίβειας) και μεταβίβαση στο handler. Αυτό κάνει το API πρεβλεψιμο και εύκολα επεκτάσιμο — η προσθήκη ενός νέου τύπου ανάλυσης σημαίνει τη δημιουργία μιας νέας υποκλάσης VNRequest.

swift
import Vision

// 1. Δημιουργία αιτήματος
let request = VNDetectFaceRectanglesRequest { req, _ in
    // 3. Επεξεργασία αποτελεσμάτων
    guard let faces = req.results as? [VNFaceObservation]
    else { return }
    print("Found \\(faces.count) faces")
}

// 2. Εκτέλεση μέσω handler
let handler = VNImageRequestHandler(cgImage: cgImage, options: [:])
try handler.perform([request])

Βασικές ιδιότητες VNRequest: regionOfInterest (περιοχή ενδιαφέροντος στην εικόνα για επίταχυνση της ανάλυσης), preferBackgroundProcessing (λειτουργία υποβάθρου), revision (έκδοση αλγορίθμου) και cancellationSupport. Η σωστή ρύθμιση αυτών των ιδιοτήτων σας επιτρέπει να βελτιστοποιήσετε την απόδοση για μια συγκεκριμένη εργασία.

Σύμφωνα με το Apple WWDC 2024, κατά τα 7 χρόνια ύπαρξης του Vision, ο αριθμός των διαθέσιμων υποκλάσεων VNRequest αυξήθηκε από 8 (iOS 11) σε πάνω από 25 (iOS 18), καλύπτοντας όλες τις κύριες εργασίες υπολογιστικής όρασης σε κινητές συσκευές.

Βασικοί τύποι VNRequest για ανάλυση

Vision περιλαμβάνει πάνω από 25 υποκλάσεις VNRequest, χωρισμένες σε κατηγορίες: ανίχνευση, αναγνώριση, παρακολούθηση και ταξινόμηση. Κάθε υποκλάση κληρονομεί από VNRequest και προσθέτει ιδιότητες συγκεκριμένες για την εργασία.

Ανίχνευση και αναγνώριση

VNDetectFaceRectanglesRequest — αναζήτηση προσώπων στην εικόνα. Επιστρέφει VNFaceObservation με συντεταγμένες bounding box και confidence. VNDetectHumanRectanglesRequest — ανάλογα για ανθρώπους. VNDetectHumanBodyPoseRequest — προσδιορισμός στάσης σώματος (σκελετικά σημεία).

Ανάλυση κειμένου

VNRecognizeTextRequest — αναγνώριση κειμένου με υποστήριξη 13 γλωσσών και δύο επίπεδα ακρίβειας. VNReadCodeRequest — για εξειδικευμένους κώδικες. VNDetectTextRectanglesRequest — αναζήτηση περιοχών κειμένου χωρίς αναγνώριση (ταχύτερο, αλλά μόνο ορθογώνια).

Ταξινόμηση και ανάλυση

VNClassifyImageRequest — ταξινόμηση εικόνας σύμφωνα με 1000 κατηγορίες ImageNet. VNGenerateImageFeaturePrintRequest — εξαγωγή feature vector για σύγκριση εικόνων. VNDetectContoursRequest — ανίχνευση περιγραμμάτων αντικειμένων.

VNImageRequestHandler και VNSequenceRequestHandler

VNImageRequestHandler — handler για στατικές εικόνες. Δέχεται CGImage, CIImage ή Data (JPEG/PNG) και εκτελεί ένα ή περισσότερα VNRequest. Αυτός είναι ο κύριος τρόπος χρήσης του Vision για φωτογραφίες, στιγμιότυπα οθόνης και μεταφορτωμένες εικόνες.

VNSequenceRequestHandler — handler για ακολουθίες εικόνων (καρέ βίντεο). Δέχεται το ίδιο σύνολο τύπων εικόνας, αλλά προορίζεται για επεξεργασία καρέ-καρέ με διατήρηση κατάστασης μεταξύ καρέ (απαραίτητο για παρακολούθηση αντικειμένων).

swift
// VNImageRequestHandler για μία εικόνα
let imageHandler = VNImageRequestHandler(
    cgImage: cgImage,
    orientation: orientation,
    options: [:])

// VNSequenceRequestHandler για βίντεο
let sequenceHandler = VNSequenceRequestHandler()
try sequenceHandler.perform([trackingRequest],
    on: cgImage)

Σημαντική διαφορά: Το VNSequenceRequestHandler δεν υποστηρίζει παράλληλη εκτέλεση πολλαπλών αιτημάτων — κάθε κλήση perform() επεξεργάζεται ένα σύνολο αιτημάτων για ένα καρέ. Για επεξεργασία βίντεο πολλαπλών νημάτων, δημιουργήστε ξεχωριστά instances του handler για διαφορετικά νήματα.

VNImageRequestHandler μπορεί να εκτελείται σε ουρά παρασκηνίου. Η Apple συνιστά DispatchQueue.global(qos: .userInitiated) για διαδραστικά σενάρια (ο χρήστης περιμένει αποτέλεσμα) και .background για μαζική επεξεργασία (π.χ. ανάλυση ολόκληρης της φωτοθήκης).

VNObservation: δομή αποτελεσμάτων

VNObservation — βασική κλάση για όλα τα αποτελέσματα αιτημάτων Vision. Κάθε υποκλάση VNObservation περιέχει δεδομένα συγκεκριμένα για τον τύπο ανάλυσης: συντεταγμένες bounding box, αναγνωρισμένο κείμενο, εμπιστοσύνη (confidence), μοναδικό αναγνωριστικό (uuid) και χρονική σήμανση (timeRange).

Βασικές υποκλάσεις VNObservation: VNFaceObservation (αποτέλεσμα ανίχνευσης προσώπου με bounding box και landmarks), VNRecognizedTextObservation (αναγνωρισμένο κείμενο με candidates), VNBarcodeObservation (αποκωδικοποιημένος γραμμωτός κώδικας με payload και symbology), VNClassificationObservation (κατηγορία ταξινόμησης με confidence).

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 (από 0.0 έως 1.0) υπάρχει σε όλα τα VNObservation και δείχνει την εμπιστοσύνη του μοντέλου στο αποτέλεσμα. Η Apple συνιστά την απόρριψη παρατηρήσεων με confidence < 0.5 για τις περισσότερες εργασίες. Για κρίσιμες εφαρμογές (ιατρική, ασφάλεια) το όριο πρέπει να αυξηθεί στο 0.8–0.9.

VNObservation περιέχει επίσης timeRange (για αιτήματα βίντεο) και uuid (μοναδικό ID για αντιστοίχιση μεταξύ καρέ). Αυτό επιτρέπει την παρακολούθηση του ίδιου αντικειμένου (π.χ. πρόσωπο) μέσω μιας ακολουθίας καρέ βίντεο.

Εκτέλεση πολλαπλών αιτημάτων ταυτόχρονα

Ένα από τα βασικά πλεονεκτήματα του VNRequest — η δυνατότητα εκτέλεσης πολλαπλών διαφορετικών αιτημάτων για μία εικόνα σε μία κλήση handler.perform(). Το Vision εσωτερικά βελτιστοποιεί τη σειρά εκτέλεσης και επαναχρησιμοποιεί κοινούς υπολογισμούς (π.χ. προεπεξεργασία εικόνας).

Αυτό επιτρέπει τη λήψη ενός πλήρους συνόλου δεδομένων για την εικόνα σε ένα πέρασμα: ταυτόχρονα ανίχνευση προσώπων, αναγνώριση κειμένου, εύρεση γραμμωτών κωδίκων και ταξινόμηση περιεχομένου. Αυτή η προσέγγιση είναι σημαντικά πιο αποδοτική από τη διαδοχική κλήση κάθε αιτήματος ξεχωριστά.

swift
import Vision

// Πολλαπλά αιτήματα σε έναν πίνακα
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
])

// Πρόσβαση σε αποτελέσματα από κάθε αίτημα
print("Faces: \\(faceRequest.results?.count ?? 0)")
print("Text blocks: \\(textRequest.results?.count ?? 0)")

Περιορισμοί: δεν μπορούν όλα τα αιτήματα να συνδυαστούν με άλλα. Για παράδειγμα, το VNGenerateImageFeaturePrintRequest πρέπει να εκτελείται ξεχωριστά. Η Apple συνιστά την ομαδοποίηση αιτημάτων ανά τύπο (ανίχνευση, αναγνώριση, ταξινόμηση) και τη δοκιμή συνδυασμών σε συσκευές-στόχους.

Απόδοση: ο συνδυασμός 3–4 αιτημάτων σε ένα perform() είναι 30–40% ταχύτερος από τη διαδοχική εκτέλεση, καθώς το Vision επαναχρησιμοποιεί κοινούς υπολογισμούς ML και προεπεξεργασία εικόνας (κλιμάκωση, διόρθωση χρωμάτων).

Προσαρμοσμένα αιτήματα με VNCoreMLRequest

VNCoreMLRequest — είναι μια γέφυρα μεταξύ Core ML και Vision, που επιτρέπει την εκτέλεση οποιουδήποτε μοντέλου Core ML ως αιτήματος Vision. Το μοντέλο τυλίγεται σε VNCoreMLModel, μεταβιβάζεται στο VNCoreMLRequest και το Vision επεξεργάζεται αυτόματα την προεπεξεργασία της εικόνας (κλιμάκωση, περικοπή στο μέγεθος εισόδου του μοντέλου).

VNCoreMLRequest κληρονομεί από VNRequest, επομένως υποστηρίζει όλες τις τυπικές λειτουργίες: regionOfInterest, completion handler, πολλαπλά αιτήματα. Αυτό επιτρέπει το συνδυασμό ενός προσαρμοσμένου μοντέλου ML με τους ενσωματωμένους ανιχνευτές Vision σε ένα pipeline.

swift
import Vision
import CoreML

// Τύλιγμα μοντέλου Core ML
guard let mlModel = try VNCoreMLModel(
    for: MyCustomClassifier().model)
else { return }

// Δημιουργία VNCoreMLRequest
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 κλιμακώνει την εικόνα στην είσοδο του μοντέλου: .centerCrop (περικοπή από το κέντρο), .scaleFill (τέντωμα) ή .scaleFit (κλιμάκωση με διατήρηση αναλογιών). Η επιλογή εξαρτάται από τον τύπο του μοντέλου και τη θέση του αντικειμένου στην εικόνα.

Πρακτικό παράδειγμα: ανίχνευση προσώπων μέσω VNDetectFaceRectanglesRequest, στη συνέχεια ταξινόμηση κάθε προσώπου μέσω VNCoreMLRequest με προσαρμοσμένο μοντέλο (π.χ. προσδιορισμός φύλου ή ηλικίας). Συνδυάζοντας δύο αιτήματα σε ένα perform(), λαμβάνετε ένα πλήρες pipeline ανάλυσης προσώπου σε ένα πέρασμα.

Συχνές Ερωτήσεις

Μπορεί να ακυρωθεί ένα VNRequest που εκτελείται;

Ναι, κάθε VNRequest έχει μια ιδιότητα cancel() που ακυρώνει την εκτέλεση του αιτήματος. Ωστόσο, η ακύρωση λειτουργεί μόνο πριν από την έναρξη της επεξεργασίας — εάν το μοντέλο ML έχει ήδη ξεκινήσει, η ακύρωση δεν θα διακόψει τον υπολογισμό. Για αξιόπιστη ακύρωση, χρησιμοποιήστε DispatchWorkItem.cancel() μαζί με VNRequest.cancel() στο completion handler.

VNDetectFaceRectanglesRequest και VNDetectFaceLandmarksRequest — ποια είναι η διαφορά;

VNDetectFaceRectanglesRequest βρίσκει μόνο ορθογώνια προσώπων. VNDetectFaceLandmarksRequest επιπλέον προσδιορίζει 68 βασικά σημεία του προσώπου (μάτια, φρύδια, μύτη, στόμα, περίγραμμα). Το VNDetectFaceLandmarksRequest είναι πιο αργό, αλλά παρέχει περισσότερα δεδομένα για κινούμενα σχέδια, μάσκες και εφέ AR. Για απλή καταμέτρηση προσώπων, αρκεί το VNDetectFaceRectanglesRequest.

Ποιο αίτημα χρησιμοποιείται για την αναζήτηση γραμμωτών κωδίκων — VNDetectBarcodesRequest;

Ναι, VNDetectBarcodesRequest — το σωστό αίτημα για όλους τους τύπους γραμμωτών κωδίκων και QR. Υποστηρίζει EAN, UPC, Code 39, Code 128, PDF417, Aztec, QR και άλλες μορφές. Το αποτέλεσμα επιστρέφεται σε VNBarcodeObservation με payload και symbology. Για ροή βίντεο χρησιμοποιήστε AVCaptureMetadataOutput — είναι ταχύτερο για ζωντανή σάρωση.

Μπορεί να εκτελεστεί το VNRequest σε CIImage αντί για CGImage;

Ναι, VNImageRequestHandler δέχεται CIImage μέσω του αρχικοποιητή init(ciImage:options:). Υποστηρίζονται επίσης Data (JPEG/PNG) και NSURL (διαδρομή αρχείου). Το CIImage είναι βολικό όταν η εικόνα έχει ήδη φορτωθεί μέσω του Core Image pipeline — αυτό αποφεύγει την περιττή αντιγραφή δεδομένων στη μνήμη.

Πόσα VNRequest μπορούν να εκτελεστούν σε ένα perform();

Δεν υπάρχει όριο στον αριθμό, αλλά στην πράξη 3–5 αιτήματα είναι η βέλτιστη ποσότητα. Περισσότερα από 5 αιτήματα μπορεί να προκαλέσουν αύξηση της κατανάλωσης μνήμης, καθώς κάθε αίτημα φορτώνει το δικό του μοντέλο ML. Εάν χρειάζεται να εκτελέσετε 10+ διαφορετικές αναλύσεις, χωρίστε τις σε 2–3 ομάδες και εκτελέστε τις διαδοχικά.

Σύνοψη

  • VNRequest — βασική κλάση Vision για όλους τους τύπους ανάλυσης εικόνας και βίντεο με ενιαία αρχιτεκτονική Request-Response.
  • Το Vision περιλαμβάνει 25+ υποκλάσεις VNRequest για ανίχνευση προσώπου, OCR, γραμμωτούς κώδικες, ταξινόμηση, περιγράμματα, παρακολούθηση και μοντέλα ML.
  • VNImageRequestHandler εκτελεί αιτήματα σε στατικές εικόνες· VNSequenceRequestHandler — σε ακολουθίες καρέ για παρακολούθηση.
  • Τα αποτελέσματα επιστρέφονται ως VNObservation με bounding box, confidence, uuid και δεδομένα συγκεκριμένα για τον τύπο.
  • Πολλαπλά αιτήματα σε ένα perform() λειτουργούν 30–40% ταχύτερα από διαδοχικές κλήσεις χάρη στην επαναχρησιμοποίηση υπολογισμών ML.
  • VNCoreMLRequest ενσωματώνει προσαρμοσμένα μοντέλα Core ML στο pipeline Vision με αυτόματη προεπεξεργασία εικόνας.
  • Όλα τα αιτήματα εκτελούνται στη συσκευή χωρίς αποστολή δεδομένων στον διακομιστή, εξασφαλίζοντας απόρρητο και λειτουργία εκτός σύνδεσης.

Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση

Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.

Συζήτηση έργου

Διαβάστε επίσης