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 অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন