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 — 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.
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.
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.
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).
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).
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 — 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).
// 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 — 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).
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.
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.
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).
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.
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
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 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.
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.
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.
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
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.
Basahin din