VNRequest — ano ito, arkitektura ng mga request ng Vision sa iOS

May-akda: IT Sectr Nai-publish: 2026-07-20 Oras ng pagbabasa: 8 min

VNRequest — ay isang abstract na base class ng framework ng Vision na kumakatawan sa isang unit ng pagsusuri ng larawan o video stream. Ang bawat uri ng pagsusuri — detection ng mukha, pagkilala ng teksto, paghahanap ng barcode, klasipikasyon — ay ipinatupad bilang isang konkretong subclass ng VNRequest. Ayon sa Apple Developer Documentation (2024), ang developer ay lumilikha ng isang instance ng request, ini-configure ang mga parameter nito, ipinapasa ang imahe sa pamamagitan ng VNImageRequestHandler at natatanggap ang mga resulta bilang isang array ng VNObservation.

Mga Pangunahing Punto

  • VNRequest — base class para sa lahat ng request ng Vision: pagsusuri ng mga larawan, video at ML models.
  • Ang request ay isinasagawa sa pamamagitan ng VNImageRequestHandler (larawan) o VNSequenceRequestHandler (video).
  • Ang mga resulta ay ibinabalik bilang isang array ng VNObservation — bawat subclass ay naglalaman ng tiyak na data.
  • Completion handler ay nagbibigay-daan sa asynchronous na pagproseso ng mga resulta pagkatapos ng pagsusuri.
  • Maraming request ay maaaring isagawa gamit ang isang tawag handler.perform() para sa isang larawan.

Ano ang VNRequest sa Vision?

VNRequest — ay ang pangunahing elemento ng arkitektura ng Vision na nagpapatupad ng Request-Response pattern para sa pagsusuri ng mga larawan at video. Bawat subclass ng VNRequest ay responsable para sa isang tiyak na gawain ng computer vision: paghahanap ng mga mukha, pagkilala ng teksto, pag-uuri ng nilalaman.

Ang arkitektura ng VNRequest ay naghihiwalay sa “kung ano ang susuriin” (request) mula sa “kung paano ipoproseso” (handler). Ini-configure ng developer ang request (uri ng pagsusuri, karagdagang parameters) at ipinapasa ito sa handler kasama ang larawan. Isinasagawa ng handler ang request at ibinabalik ang mga resulta, nang hindi nangangailangan ang developer na maunawaan ang panloob na ML algorithms.

Lahat ng subclass ng VNRequest ay sumusunod sa isang pare-parehong istraktura: initialization na may opsyonal na completion handler, configuration ng mga property (rehiyon ng pagsusuri, antas ng katumpakan) at pagpasa sa handler. Ginagawa nitong predictable at madaling palawakin ang API — ang pagdagdag ng bagong uri ng pagsusuri ay nangangahulugan ng paggawa ng bagong subclass ng VNRequest.

swift
import Vision

// 1. Gumawa ng request
let request = VNDetectFaceRectanglesRequest { req, _ in
    // 3. Iproseso ang mga resulta
    guard let faces = req.results as? [VNFaceObservation]
    else { return }
    print("Found \\(faces.count) faces")
}

// 2. Isagawa sa pamamagitan ng handler
let handler = VNImageRequestHandler(cgImage: cgImage, options: [:])
try handler.perform([request])

Mga pangunahing property ng VNRequest: regionOfInterest (lugar ng interes sa larawan upang mapabilis ang pagsusuri), preferBackgroundProcessing (background mode), revision (bersyon ng algorithm) at cancellationSupport. Ang tamang configuration ng mga property na ito ay nagbibigay-daan sa iyo na i-optimize ang pagganap para sa isang tiyak na gawain.

Ayon sa Apple WWDC 2024, sa loob ng 7 taon ng pagkakaroon ng Vision, ang bilang ng mga available na VNRequest subclass ay lumago mula 8 (iOS 11) hanggang mahigit 25 (iOS 18), na sumasaklaw sa lahat ng pangunahing gawain ng computer vision sa mga mobile device.

Mga pangunahing uri ng VNRequest para sa pagsusuri

Vision ay may kasamang mahigit 25 subclass ng VNRequest, nahahati sa mga kategorya: detection, pagkilala, pagsubaybay at klasipikasyon. Bawat subclass ay nagmamana mula sa VNRequest at nagdaragdag ng mga property na tiyak sa gawain.

Detection at pagkilala

VNDetectFaceRectanglesRequest — paghahanap ng mga mukha sa larawan. Nagbabalik ng VNFaceObservation na may mga coordinate ng bounding box at confidence. VNDetectHumanRectanglesRequest — kahalintulad para sa mga tao. VNDetectHumanBodyPoseRequest — pagtukoy ng pose ng tao (mga skeletal points).

Pagsusuri ng teksto

VNRecognizeTextRequest — pagkilala ng teksto na may suporta para sa 13 wika at dalawang antas ng katumpakan. VNReadCodeRequest — para sa mga espesyalisadong code. VNDetectTextRectanglesRequest — paghahanap ng mga lugar ng teksto nang walang pagkilala (mas mabilis, ngunit mga parihaba lamang).

Klasipikasyon at pagsusuri

VNClassifyImageRequest — klasipikasyon ng larawan ayon sa 1000 kategorya ng ImageNet. VNGenerateImageFeaturePrintRequest — extraction ng feature vector para sa paghahambing ng mga larawan. VNDetectContoursRequest — detection ng mga contour ng bagay.

VNImageRequestHandler at VNSequenceRequestHandler

VNImageRequestHandler — handler para sa mga static na larawan. Tumanggap ng CGImage, CIImage o Data (JPEG/PNG) at nagsasagawa ng isa o maramihang VNRequest. Ito ang pangunahing paraan ng paggamit ng Vision para sa mga litrato, screenshot at na-upload na mga larawan.

VNSequenceRequestHandler — handler para sa mga sequence ng larawan (mga frame ng video). Tumanggap ng parehong set ng mga uri ng larawan, ngunit nilayon para sa frame-by-frame na pagproseso na may pagpapanatili ng estado sa pagitan ng mga frame (kinakailangan para sa pagsubaybay ng bagay).

swift
// VNImageRequestHandler para sa isang larawan
let imageHandler = VNImageRequestHandler(
    cgImage: cgImage,
    orientation: orientation,
    options: [:])

// VNSequenceRequestHandler para sa video
let sequenceHandler = VNSequenceRequestHandler()
try sequenceHandler.perform([trackingRequest],
    on: cgImage)

Mahalagang pagkakaiba: Ang VNSequenceRequestHandler ay hindi sumusuporta sa parallel na pagsasagawa ng maraming request — bawat tawag na perform() ay nagpoproseso ng isang set ng request para sa isang frame. Para sa multi-threaded na pagproseso ng video, gumawa ng hiwalay na handler instances para sa iba’t ibang threads.

VNImageRequestHandler ay maaaring isagawa sa background queue. Inirerekomenda ng Apple ang DispatchQueue.global(qos: .userInitiated) para sa mga interactive na senaryo (naghihintay ang user ng resulta) at .background para sa batch processing (hal., pagsusuri ng buong photo library).

VNObservation: istraktura ng mga resulta

VNObservation — base class para sa lahat ng resulta ng request ng Vision. Bawat VNObservation subclass ay naglalaman ng data na tiyak sa uri ng pagsusuri: mga coordinate ng bounding box, kinikilalang teksto, kumpiyansa (confidence), natatanging identifier (uuid) at time stamp (timeRange).

Mga pangunahing VNObservation subclass: VNFaceObservation (resulta ng detection ng mukha na may bounding box at landmarks), VNRecognizedTextObservation (kinikilalang teksto na may candidates), VNBarcodeObservation (na-decode na barcode na may payload at symbology), VNClassificationObservation (kategorya ng klasipikasyon na may 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)")
    }
}

Property na confidence (mula 0.0 hanggang 1.0) ay naroroon sa lahat ng VNObservation at nagpapakita ng kumpiyansa ng modelo sa resulta. Inirerekomenda ng Apple na itapon ang mga observation na may confidence < 0.5 para sa karamihan ng mga gawain. Para sa kritikal na mga application (medikal, seguridad) itaas ang threshold sa 0.8–0.9.

VNObservation ay naglalaman din ng timeRange (para sa mga video request) at uuid (natatanging ID para sa pagtutugma sa pagitan ng mga frame). Ito ay nagpapahintulot sa pagsubaybay ng parehong bagay (hal., mukha) sa pamamagitan ng isang sequence ng video frames.

Pagsasagawa ng maraming request nang sabay-sabay

Isa sa mga pangunahing bentahe ng VNRequest — ang kakayahang magsagawa ng maraming iba’t ibang request para sa isang larawan sa isang tawag na handler.perform(). Panloob na ino-optimize ng Vision ang pagkakasunod-sunod ng pagpapatupad at muling ginagamit ang mga karaniwang kalkulasyon (hal., preprocessing ng larawan).

Ito ay nagpapahintulot na makakuha ng kumpletong set ng data tungkol sa larawan sa isang pass: sabay-sabay na detect ang mga mukha, kilalanin ang teksto, hanapin ang mga barcode at uriin ang nilalaman. Ang pamamaraang ito ay mas mahusay kaysa sa sunod-sunod na pagtawag ng bawat request nang paisa-isa.

swift
import Vision

// Maramihang request sa isang array
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
])

// I-access ang mga resulta mula sa bawat request
print("Faces: \\(faceRequest.results?.count ?? 0)")
print("Text blocks: \\(textRequest.results?.count ?? 0)")

Mga limitasyon: hindi lahat ng request ay maaaring pagsamahin sa iba. Halimbawa, ang VNGenerateImageFeaturePrintRequest ay dapat isagawa nang hiwalay. Inirerekomenda ng Apple ang paggrupo ng mga request ayon sa uri (detection, pagkilala, klasipikasyon) at pagtest ng mga kombinasyon sa target na device.

Pagganap: ang pagsasama ng 3–4 request sa isang perform() ay 30–40% mas mabilis kaysa sunod-sunod na pagpapatupad, dahil muling ginagamit ng Vision ang mga karaniwang ML kalkulasyon at preprocessing ng larawan (pag-scale, pagwawasto ng kulay).

Custom na request gamit ang VNCoreMLRequest

VNCoreMLRequest — ay isang tulay sa pagitan ng Core ML at Vision, na nagpapahintulot na patakbuhin ang anumang Core ML model bilang isang Vision request. Ang modelo ay binabalot sa VNCoreMLModel, ipinapasa sa VNCoreMLRequest, at awtomatikong pinoproseso ng Vision ang preprocessing ng larawan (pag-scale, pag-crop sa laki ng input ng modelo).

VNCoreMLRequest ay nagmamana mula sa VNRequest, kaya sinusuportahan nito ang lahat ng standard na functionality: regionOfInterest, completion handler, maramihang request. Ito ay nagpapahintulot na pagsamahin ang custom na ML model sa mga built-in na detector ng Vision sa isang pipeline.

swift
import Vision
import CoreML

// I-wrap ang Core ML model
guard let mlModel = try VNCoreMLModel(
    for: MyCustomClassifier().model)
else { return }

// Gumawa ng 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 ay tumutukoy kung paano ine-scale ng Vision ang larawan sa input ng modelo: .centerCrop (pag-crop mula sa gitna), .scaleFill (pag-unat) o .scaleFit (pag-scale na may pagpapanatili ng proporsyon). Ang pagpili ay depende sa uri ng modelo at posisyon ng bagay sa larawan.

Praktikal na halimbawa: detection ng mukha sa pamamagitan ng VNDetectFaceRectanglesRequest, pagkatapos ay klasipikasyon ng bawat mukha sa pamamagitan ng VNCoreMLRequest na may custom na modelo (hal., pagtukoy ng kasarian o edad). Sa pamamagitan ng pagsasama ng dalawang request sa isang perform(), makakakuha ka ng kumpletong pipeline ng pagsusuri ng mukha sa isang pass.

Mga Madalas Itanong

Maaari bang kanselahin ang isang tumatakbong VNRequest?

Oo, bawat VNRequest ay may property na cancel() na kinakansela ang pagpapatupad ng request. Gayunpaman, ang pagkansela ay gumagana lamang bago magsimula ang pagproseso — kung ang ML model ay naisagawa na, hindi ititigil ng pagkansela ang pagtutuos. Para sa maaasahang pagkansela, gamitin ang DispatchWorkItem.cancel() kasama ng VNRequest.cancel() sa completion handler.

VNDetectFaceRectanglesRequest at VNDetectFaceLandmarksRequest — ano ang pagkakaiba?

VNDetectFaceRectanglesRequest ay nakakahanap lamang ng mga parihaba ng mukha. VNDetectFaceLandmarksRequest ay karagdagang tinutukoy ang 68 pangunahing punto ng mukha (mata, kilay, ilong, bibig, contour). Ang VNDetectFaceLandmarksRequest ay mas mabagal ngunit nagbibigay ng mas maraming data para sa animation, mask at AR effects. Para sa simpleng pagbibilang ng mukha, sapat na ang VNDetectFaceRectanglesRequest.

Aling request ang ginagamit para sa paghahanap ng barcode — VNDetectBarcodesRequest?

Oo, VNDetectBarcodesRequest — ang tamang request para sa lahat ng uri ng barcode at QR code. Sinusuportahan nito ang EAN, UPC, Code 39, Code 128, PDF417, Aztec, QR at iba pang format. Ang resulta ay ibinabalik sa VNBarcodeObservation na may payload at symbology. Para sa video stream, gamitin ang AVCaptureMetadataOutput — mas mabilis ito para sa live scanning.

Maaari bang isagawa ang VNRequest sa CIImage sa halip na CGImage?

Oo, VNImageRequestHandler ay tumatanggap ng CIImage sa pamamagitan ng initializer na init(ciImage:options:). Sinusuportahan din ang Data (JPEG/PNG) at NSURL (path ng file). Ang CIImage ay maginhawa kapag ang larawan ay na-load na sa pamamagitan ng Core Image pipeline — ito ay umiiwas sa hindi kinakailangang pagkopya ng data sa memorya.

Ilang VNRequest ang maaaring isagawa sa isang perform()?

Walang limitasyon sa bilang, ngunit sa pagsasanay 3–5 request ang pinakamainam na dami. Mahigit sa 5 request ay maaaring magdulot ng pagtaas sa konsumo ng memory dahil bawat request ay naglo-load ng sarili nitong ML model. Kung kailangan mong magsagawa ng 10+ iba’t ibang pagsusuri, hatiin ang mga ito sa 2–3 grupo at isagawa nang sunod-sunod.

Buod

  • VNRequest — base class ng Vision para sa lahat ng uri ng pagsusuri ng larawan at video na may pare-parehong Request-Response architecture.
  • Ang Vision ay may kasamang 25+ VNRequest subclass para sa face detection, OCR, barcode, klasipikasyon, contour, pagsubaybay at ML models.
  • VNImageRequestHandler ay nagsasagawa ng mga request sa static na mga larawan; VNSequenceRequestHandler — sa mga frame sequence para sa pagsubaybay.
  • Ang mga resulta ay ibinabalik bilang VNObservation na may bounding box, confidence, uuid at data na tiyak sa uri.
  • Maramihang request sa isang perform() ay gumagana nang 30–40% mas mabilis kaysa sunod-sunod na tawag dahil sa muling paggamit ng ML calculations.
  • VNCoreMLRequest ay nagsasama ng custom na Core ML model sa pipeline ng Vision na may awtomatikong preprocessing ng mga larawan.
  • Lahat ng request ay isinasagawa sa device nang hindi nagpapadala ng data sa server, tinitiyak ang privacy at offline na trabaho.

Gagawa kami ng mobile application na turnkey

Gumagawa ang IT Sectr ng mga iOS at Android application para sa mga startup at negosyo mula noong 2017. Magpapayo kami sa iyo at magmumungkahi ng pinakamahusay na solusyon.

Pag-usapan ang proyekto

Basahin din