VNRequest Vision फ्रेमवर्क का एक एब्स्ट्रैक्ट बेस क्लास है जो इमेज या वीडियो स्ट्रीम विश्लेषण की एक इकाई का प्रतिनिधित्व करता है। प्रत्येक प्रकार का विश्लेषण — चेहरे की पहचान, टेक्स्ट रिकॉग्निशन, बारकोड खोज, वर्गीकरण — VNRequest के एक विशिष्ट उपवर्ग के रूप में लागू किया गया है। Apple डेवलपर डॉक्यूमेंटेशन (2024) के अनुसार, डेवलपर एक अनुरोध इंस्टेंस बनाता है, उसके पैरामीटर कॉन्फ़िगर करता है, VNImageRequestHandler के माध्यम से इमेज पास करता है और VNObservation की एक सरणी के रूप में परिणाम प्राप्त करता है।
मुख्य बातें
VNRequest Vision आर्किटेक्चर का एक मौलिक तत्व है, जो इमेज और वीडियो विश्लेषण के लिए अनुरोध-प्रतिक्रिया पैटर्न लागू करता है। VNRequest का प्रत्येक उपवर्ग कंप्यूटर विज़न के एक विशिष्ट कार्य के लिए जिम्मेदार है: चेहरे की पहचान, टेक्स्ट रिकॉग्निशन, सामग्री वर्गीकरण।
VNRequest आर्किटेक्चर “क्या विश्लेषण करें” (अनुरोध) को “कैसे प्रोसेस करें” (हैंडलर) से अलग करता है। डेवलपर अनुरोध (विश्लेषण प्रकार, अतिरिक्त पैरामीटर) कॉन्फ़िगर करता है और इसे इमेज के साथ हैंडलर को पास करता है। हैंडलर अनुरोध निष्पादित करता है और परिणाम लौटाता है, बिना डेवलपर को आंतरिक ML एल्गोरिदम को समझने की आवश्यकता के।
VNRequest के सभी उपवर्ग एक समान संरचना का पालन करते हैं: वैकल्पिक completion handler के साथ आरंभीकरण, गुणों का कॉन्फ़िगरेशन (रुचि का क्षेत्र, सटीकता स्तर) और हैंडलर को पास करना। यह API को पूर्वानुमानित और आसानी से विस्तार योग्य बनाता है — विश्लेषण का एक नया प्रकार जोड़ने का मतलब VNRequest का एक नया उपवर्ग बनाना है।
import Vision
// 1. अनुरोध बनाएं
let request = VNDetectFaceRectanglesRequest { req, _ in
// 3. परिणाम प्रोसेस करें
guard let faces = req.results as? [VNFaceObservation]
else { return }
print("Found \\(faces.count) faces")
}
// 2. हैंडलर के माध्यम से निष्पादित करें
let handler = VNImageRequestHandler(cgImage: cgImage, options: [:])
try handler.perform([request])
VNRequest के मुख्य गुण: regionOfInterest (विश्लेषण को गति देने के लिए इमेज पर रुचि का क्षेत्र), preferBackgroundProcessing (पृष्ठभूमि मोड), revision (एल्गोरिदम संस्करण) और cancellationSupport। इन गुणों का उचित कॉन्फ़िगरेशन किसी विशिष्ट कार्य के लिए प्रदर्शन को अनुकूलित करने की अनुमति देता है।
Apple WWDC 2024 के अनुसार, Vision के अस्तित्व के 7 वर्षों में, उपलब्ध VNRequest उपवर्गों की संख्या 8 (iOS 11) से बढ़कर 25+ (iOS 18) हो गई, जो मोबाइल उपकरणों पर सभी प्रमुख कंप्यूटर विज़न कार्यों को कवर करती है।
Vision में 25 से अधिक VNRequest उपवर्ग शामिल हैं जो श्रेणियों में विभाजित हैं: पहचान, रिकॉग्निशन, ट्रैकिंग और वर्गीकरण। प्रत्येक उपवर्ग VNRequest से प्राप्त होता है और कार्य-विशिष्ट गुण जोड़ता है।
VNDetectFaceRectanglesRequest — इमेज में चेहरे की पहचान। बाउंडिंग बॉक्स निर्देशांक और कॉन्फिडेंस के साथ VNFaceObservation लौटाता है। VNDetectHumanRectanglesRequest — लोगों के लिए समान। VNDetectHumanBodyPoseRequest — मानव मुद्रा अनुमान (कंकाल बिंदु)।
VNRecognizeTextRequest — 13 भाषाओं और दो सटीकता स्तरों के समर्थन के साथ टेक्स्ट रिकॉग्निशन। VNReadCodeRequest — विशिष्ट कोड के लिए। VNDetectTextRectanglesRequest — बिना रिकॉग्निशन के टेक्स्ट क्षेत्रों की खोज (तेज़, लेकिन केवल आयत)।
VNClassifyImageRequest — 1,000 ImageNet श्रेणियों में इमेज वर्गीकरण। VNGenerateImageFeaturePrintRequest — इमेज तुलना के लिए फीचर वेक्टर निष्कर्षण। VNDetectContoursRequest — ऑब्जेक्ट कंटूर डिटेक्शन।
| श्रेणी | उदाहरण अनुरोध | परिणाम |
|---|---|---|
| चेहरे की पहचान | VNDetectFaceRectanglesRequest | VNFaceObservation |
| टेक्स्ट रिकॉग्निशन | VNRecognizeTextRequest | VNRecognizedTextObservation |
| बारकोड | VNDetectBarcodesRequest | VNBarcodeObservation |
| वर्गीकरण | VNClassifyImageRequest | VNClassificationObservation |
| ट्रैकिंग | VNTrackObjectRequest | VNDetectedObjectObservation |
| कंटूर | VNDetectContoursRequest | VNContoursObservation |
VNImageRequestHandler — स्थिर इमेज के लिए हैंडलर। यह CGImage, CIImage या Data (JPEG/PNG) स्वीकार करता है और एक या अधिक VNRequest इंस्टेंस निष्पादित करता है। फ़ोटो, स्क्रीनशॉट और अपलोड की गई इमेज के लिए Vision का उपयोग करने का यह प्राथमिक तरीका है।
VNSequenceRequestHandler — इमेज अनुक्रमों (वीडियो फ्रेम) के लिए हैंडलर। यह इमेज प्रकारों का वही सेट स्वीकार करता है लेकिन फ्रेमों के बीच स्थिति बनाए रखते हुए फ्रेम-दर-फ्रेम प्रोसेसिंग के लिए डिज़ाइन किया गया है (ऑब्जेक्ट ट्रैकिंग के लिए आवश्यक)।
// एकल इमेज के लिए VNImageRequestHandler
let imageHandler = VNImageRequestHandler(
cgImage: cgImage,
orientation: orientation,
options: [:])
// वीडियो के लिए VNSequenceRequestHandler
let sequenceHandler = VNSequenceRequestHandler()
try sequenceHandler.perform([trackingRequest],
on: cgImage)
महत्वपूर्ण अंतर: VNSequenceRequestHandler कई अनुरोधों के समानांतर निष्पादन का समर्थन नहीं करता — प्रत्येक perform() कॉल एक फ्रेम के लिए अनुरोधों के एक सेट को प्रोसेस करता है। मल्टी-थ्रेडेड वीडियो प्रोसेसिंग के लिए, विभिन्न थ्रेड के लिए अलग-अलग हैंडलर इंस्टेंस बनाएं।
VNImageRequestHandler पृष्ठभूमि कतार पर चल सकता है। Apple इंटरैक्टिव परिदृश्यों (उपयोगकर्ता परिणामों की प्रतीक्षा करता है) के लिए DispatchQueue.global(qos: .userInitiated) और बैच प्रोसेसिंग के लिए .background (उदाहरण के लिए, संपूर्ण फ़ोटो लाइब्रेरी का विश्लेषण) की अनुशंसा करता है।
VNObservation — सभी Vision अनुरोध परिणामों के लिए बेस क्लास। VNObservation का प्रत्येक उपवर्ग विश्लेषण प्रकार के लिए विशिष्ट डेटा रखता है: बाउंडिंग बॉक्स निर्देशांक, पहचाना गया टेक्स्ट, कॉन्फिडेंस, अद्वितीय पहचानकर्ता (uuid) और टाइमस्टैंप (timeRange)।
VNObservation के मुख्य उपवर्ग: VNFaceObservation (बाउंडिंग बॉक्स और लैंडमार्क के साथ चेहरे की पहचान परिणाम), VNRecognizedTextObservation (उम्मीदवारों के साथ पहचाना गया टेक्स्ट), VNBarcodeObservation (पेलोड और सिम्बोलॉजी के साथ डिकोड किया गया बारकोड), VNClassificationObservation (कॉन्फिडेंस के साथ वर्गीकरण श्रेणी)।
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)")
}
}
कॉन्फिडेंस गुण (0.0 से 1.0 तक) सभी VNObservation इंस्टेंस में मौजूद है और परिणाम में मॉडल के कॉन्फिडेंस को इंगित करता है। Apple अधिकांश कार्यों के लिए कॉन्फिडेंस < 0.5 वाले अवलोकनों को हटाने की अनुशंसा करता है। महत्वपूर्ण अनुप्रयोगों (चिकित्सा, सुरक्षा) के लिए, सीमा को 0.8–0.9 तक बढ़ाया जाना चाहिए।
VNObservation में timeRange (वीडियो अनुरोधों के लिए) और uuid (क्रॉस-फ्रेम मिलान के लिए अद्वितीय ID) भी शामिल है। यह वीडियो फ्रेम के अनुक्रम में एक ही ऑब्जेक्ट (उदाहरण के लिए, एक चेहरा) को ट्रैक करने की अनुमति देता है।
VNRequest के मुख्य लाभों में से एक एक ही handler.perform() कॉल में एक ही इमेज पर कई अलग-अलग अनुरोध निष्पादित करने की क्षमता है। Vision आंतरिक रूप से निष्पादन क्रम को अनुकूलित करता है और सामान्य गणनाओं (जैसे, इमेज प्रीप्रोसेसिंग) का पुन: उपयोग करता है।
यह एक पास में इमेज के बारे में डेटा का एक पूरा सेट प्राप्त करने की अनुमति देता है: एक साथ चेहरे का पता लगाना, टेक्स्ट पहचानना, बारकोड ढूंढना और सामग्री को वर्गीकृत करना। यह दृष्टिकोण प्रत्येक अनुरोध को क्रमिक रूप से कॉल करने की तुलना में काफी अधिक कुशल है।
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 प्रकार (पहचान, रिकॉग्निशन, वर्गीकरण) के अनुसार अनुरोधों को समूहित करने और लक्ष्य उपकरणों पर संयोजनों का परीक्षण करने की अनुशंसा करता है।
प्रदर्शन: एक perform() में 3–4 अनुरोधों को संयोजित करना अनुक्रमिक निष्पादन की तुलना में 30–40% तेज़ है क्योंकि Vision साझा ML गणनाओं और इमेज प्रीप्रोसेसिंग (स्केलिंग, रंग सुधार) का पुन: उपयोग करता है।
VNCoreMLRequest Core ML और Vision के बीच एक पुल है, जो किसी भी Core ML मॉडल को Vision अनुरोध के रूप में चलाने की अनुमति देता है। मॉडल को VNCoreMLModel में लपेटा जाता है, VNCoreMLRequest को पास किया जाता है, और Vision स्वचालित रूप से इमेज प्रीप्रोसेसिंग (स्केलिंग, मॉडल इनपुट आकार में क्रॉप करना) को संभालता है।
VNCoreMLRequest VNRequest से प्राप्त होता है, इसलिए यह सभी मानक सुविधाओं का समर्थन करता है: regionOfInterest, completion handler, कई अनुरोध। यह एक कस्टम ML मॉडल को एक ही पाइपलाइन में बिल्ट-इन Vision डिटेक्टरों के साथ संयोजित करने की अनुमति देता है।
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() में दो अनुरोधों को संयोजित करके, आप एक पास में एक पूर्ण चेहरा विश्लेषण पाइपलाइन प्राप्त करते हैं।
अक्सर पूछे जाने वाले प्रश्न
हाँ, प्रत्येक VNRequest में cancel() गुण होता है जो अनुरोध के निष्पादन को रद्द करता है। हालांकि, रद्दीकरण केवल प्रोसेसिंग शुरू होने से पहले काम करता है — यदि ML मॉडल पहले ही शुरू हो चुका है, तो रद्दीकरण गणना को बाधित नहीं करेगा। विश्वसनीय रद्दीकरण के लिए, completion handler में DispatchWorkItem.cancel() का उपयोग VNRequest.cancel() के साथ करें।
VNDetectFaceRectanglesRequest केवल चेहरे के बाउंडिंग आयत ढूंढता है। VNDetectFaceLandmarksRequest अतिरिक्त रूप से 68 चेहरे के मुख्य बिंदुओं (आंखें, भौहें, नाक, मुंह, रूपरेखा) की पहचान करता है। VNDetectFaceLandmarksRequest धीमा है लेकिन एनीमेशन, मास्क और AR प्रभावों के लिए अधिक डेटा प्रदान करता है। सरल चेहरे की गिनती के लिए, VNDetectFaceRectanglesRequest पर्याप्त है।
हाँ, VNDetectBarcodesRequest सभी प्रकार के बारकोड और QR कोड के लिए सही अनुरोध है। यह EAN, UPC, Code 39, Code 128, PDF417, Aztec, QR और अन्य प्रारूपों का समर्थन करता है। परिणाम पेलोड और सिम्बोलॉजी के साथ VNBarcodeObservation में लौटाया जाता है। वीडियो स्ट्रीम के लिए, AVCaptureMetadataOutput का उपयोग करें — यह लाइव स्कैनिंग के लिए तेज़ है।
हाँ, VNImageRequestHandler init(ciImage:options:) इनिशियलाइज़र के माध्यम से CIImage स्वीकार करता है। यह Data (JPEG/PNG) और NSURL (फ़ाइल पथ) का भी समर्थन करता है। CIImage सुविधाजनक है जब इमेज पहले से Core Image पाइपलाइन के माध्यम से लोड की गई हो — यह मेमोरी में अनावश्यक डेटा कॉपी से बचाता है।
संख्या की कोई सीमा नहीं है, लेकिन व्यवहार में 3–5 अनुरोध इष्टतम हैं। 5 से अधिक अनुरोध मेमोरी खपत में वृद्धि का कारण बन सकते हैं, क्योंकि प्रत्येक अनुरोध अपना स्वयं का ML मॉडल लोड करता है। यदि आपको 10+ विभिन्न विश्लेषण चलाने की आवश्यकता है, तो उन्हें 2–3 समूहों में विभाजित करें और क्रमिक रूप से निष्पादित करें।
सारांश
हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे
IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें