VNCoreMLRequest — এটি VNRequest এর একটি উপবর্গ যা Vision পাইপলাইনের মধ্যে Core ML মডেল চালানোর অনুমতি দেয়, Vision এর প্রস্তুত ডিটেক্টরগুলির (মুখ, টেক্সট, বস্তু) সুবিধাগুলিকে শ্রেণিকরণ এবং রিগ্রেশনের জন্য কাস্টম ML মডেলের সাথে সংযুক্ত করে। Apple Machine Learning Documentation (2024) এর মতে, VNCoreMLRequest স্বচালিতভাবে ছবি প্রাক-প্রক্রিয়া সম্পাদন করে — স্কেলিং, ক্রপ এবং রঙ স্থান রূপান্তর — Core ML মডেলের প্রয়োজনীয়তা অনুযায়ী।
মূখ্য বিষয়সমূহ
VNCoreMLRequest এটি VNRequest এর একটি উপবর্গ, যা iOS 11 এ Vision এর সাথে যোগ করা হয়েছিল, যা Vision এর প্রাকৃতিকে Core ML মডেল চালানোর অনুমতি দেয়। এটি Core ML মডেলের প্রয়োজনীয় সমস্ত ছবি প্রাক-প্রক্রিয়া সম্পাদন করে: আকার পরিবর্তন, ক্রপিং, নর্মালাইজেশন এবং রঙ স্থান রূপান্তর।
VNCoreMLRequest ছাড়া, একজন ডিভেলপারকে UIImage/CGImage কে প্রয়োজনীয় আকারের MultiArray (MLMultiArray) বা PixelBuffer (CVPixelBuffer) এ ম্যানুয়ালি রূপান্তর করতে হবে। VNCoreMLRequest এই প্রক্রিয়াটিকে স্বচালিত করে: আপনি VNImageRequestHandler এর মাধ্যমে CGImage পাশ করেন, এবং VNCoreMLRequest এটিকে মডেল ইনপুটে নিজেই স্কেল করে।
VNCoreMLRequest সকল VNRequest ক্ষমতা উত্তরাধিকার করে: সম্পূর্ণ হ্যানডলার, regionOfInterest, একটি perform() এ একাধিক অনুরোধ চালানোর ক্ষমতা, VNImageRequestHandler এবং VNSequenceRequestHandler এর জন্য সমর্থন।
import Vision
import CoreML
// 1. মডেল লোড এবং মুড়ে নিন
guard let model = try VNCoreMLModel(
for: MobileNetV2().model)
else { return }
// 2. VNCoreMLRequest তৈরি করুন
let request = VNCoreMLRequest(model: model) { req, _ in
guard let results = req.results
as? [VNClassificationObservation]
else { return }
for r in results.prefix(3) {
print("\\(r.identifier): \\(r.confidence)")
}
}
// 3. হ্যানডলারের মাধ্যমে চালান
let handler = VNImageRequestHandler(cgImage: image, options: [:])
try handler.perform([request])
VNCoreMLRequest বিভিন্ন ইনপুট ধরনের মডেল সমর্থন করে: ছবি (Image Feature), MultiArray এবং Double। ছবির জন্য, Vision স্বচালিতভাবে CGImage কে প্রয়োজনীয় আকার এবং রঙ স্থানের CVPixelBuffer এ রূপান্তর করে। অন্য ইনপুট ডেটা ধরনের জন্য, Vision ছাড়া সরাসরি Core ML ব্যবহার করা উচিত।
Apple WWDC 2023 এর মতে, VNCoreMLRequest সকল iOS অ্যাপ্লিকেশনের 40% এ ব্যবহৃত হয় যা ছবি প্রক্রিয়ার জন্য Core ML ব্যবহার করে। এটি iOS অ্যাপ্লিকেশনে ML মডেল সংহত করার সবচেয়ে জনপ্রিয় উপায়।
VNCoreMLModel এটি একটি র্যাপার যা Vision এ ব্যবহারের জন্য Core ML মডেলকে (MLModel) অনুকূলিত করে। এটি মডেলের ইনপুট এবং আউটপুট ডেটাকে Vision এর জন্য বোঝানো যোগ্য ফরম্যাটে রূপান্তর করে: ছবি → CVPixelBuffer, ফলাফল → VNObservation।
VNCoreMLModel ইনিশিয়ালাইজেশন Vision এর সাথে মডেলের সামঞ্জস্য যাচাই করে: মডেলটিকে ইনপুট হিসাবে একটি ছবি (Image Feature) গ্রহণ করতে হবে এবং শ্রেণিকরণ (MLMultiArray বা Dictionary) ফেরত দিতে হবে। যদি মডেলটি অসামঞ্জস্যপূর্ণ হয়, তবে ইনিশিয়ালাইজার একটি ত্রুটি ছুড়ে দেয়।
import Vision
import CoreML
// বিকল্প 1: .mlmodel থেকে (বিল্ড টাইমে কম্পাইলকৃত)
let model1 = try VNCoreMLModel(
for: MyVisionModel().model)
// বিকল্প 2: .mlmodelc থেকে (ডিভাইসে কম্পাইলকৃত)
let compiledURL = Bundle.main.url(
forResource: "MyVisionModel",
withExtension: "mlmodelc")!
let model2 = try VNCoreMLModel(
for: MLModel(contentsOf: compiledURL))
VNCoreMLModel প্রথম লোডের পর মডেলটিকে মেমরিতে কেশ করে। একই মডেল পুনরায় লোড করলে কেশের ইনস্টেন্স ফেরত আসে, যা পরবর্তী অনুরোধগুলিকে তবরান্বিত করে। যদি মডেলটির আয়তন 100 MB এর বেশি হয়, তবে iOS সংশ্লিষ্টি সংকুল হলে এটিকে মেমরি থেকে অনলোড করতে পারে — এই ক্ষেত্রে, VNCoreMLModel স্বচালিতভাবে মডেলটি পুনরায় লোড করবে।
Create ML এর মাধ্যমে প্রশিক্ষিত মডেলের জন্য, VNCoreMLModel অতিরিক্ত কনফিগারেশন ছাড়াই কাজ করে। Create ML সঠিক মেটাডেটা সহ মডেল এক্সপোর্ট করে যা Vision স্বচালিতভাবে চিনতে পারে — শুধু মডেলটি VNCoreMLModel(model:) এ পাশ করুন।
imageCropAndScaleOption এটি VNCoreMLRequest এর একটি চাবিকাঠামো বৈশিষ্ট্য যা নির্ধারণ করে যে কিভাবে Vision উৎস ছবিটিকে Core ML মডেল ইনপুট আকারের সাথে মেলানোর জন্য রূপান্তর করে। সঠিক বিকল্প নির্বাচন সরাসরি শ্রেণিকরণ সত্যতাকে প্রভাবিত করে।
.centerCrop ছবিটিকে কেন্দ্র থেকে একটি বর্গে কাটে, তারপর এটিকে মডেল ইনপুট আকারে স্কেল করে। কেন্দ্রীভূত বস্তুতে প্রশিক্ষিত মডেলের জন্য উপযুক্ত (অধিকাংশ ImageNet শ্রেণিবিন্যাসকারী)। .scaleFill অনুপাত সংরক্ষণ ছাড়াই ছবিটিকে ইনপুট আকারে প্রসারিত করে। দ্রুত, কিন্তু জ্যামিতি বিকৃত করে। .scaleFit অনুপাত সংরক্ষণ সহ স্কেল করে, কানাগুলিতে letterbox (কালো দাগ) যোগ করে।
import Vision
let request = VNCoreMLRequest(model: model)
// .centerCrop — কেন্দ্রীভূত বস্তুর জন্য (ডিফল্ট)
request.imageCropAndScaleOption = .centerCrop
// .scaleFill — একক টেক্সচার জন্য (কোনও বিকৃতি নেই)
request.imageCropAndScaleOption = .scaleFill
// .scaleFit — যখন বস্তুর অনুপাত গুরুত্বপূর্ণ
request.imageCropAndScaleOption = .scaleFit
সুপারিশাগুলি: অধিকাংশ শ্রেণিকরণ মডেলের জন্য, .centerCrop ব্যবহার করুন — এটি সত্যতা এবং কর্মক্ষমতার সর্বোত্তম সমন্বয় প্রদান করে। যদি মডেলটি সংরক্ষিত অনুপাতের ছবিতে প্রশিক্ষিত হয় (যেমন ডকুমেন্ট ছবিতে অসামান্য ধরা পড়া), তবে letterbox সহ .scaleFit নির্বাচন করুন।
Apple Developer Documentation 2024 এর মতে, imageCropAndScaleOption এর ভুল নির্বাচন মডেলের সত্যতা 15–25% কমিয়ে দিতে পারে। উদাহরণস্বরূপ, ফ্রেমের কানায় অবস্থিত একটি মুখের জন্য .scaleFill, .centerCrop এর সাথে এর একটি অংশ কেটে ফেলতে পারে বা .scaleFill এর সাথে অনুপাত বিকৃত করতে পারে।
প্রধান শক্তি VNCoreMLRequest এর একটি perform() কলে এটিকে অন্য VNRequest এর সাথে সম্মিলিত করার ক্ষমতা। এটি পাইপলাইন তৈরির অনুমতি দেয়: প্রথমে মুখ শনাক্ত করুন (VNDetectFaceRectanglesRequest), তারপর একটি কাস্টম Core ML মডেল (VNCoreMLRequest) এর মাধ্যমে প্রতিটি মুখ শ্রেণিবদ্ধ করুন।
VNCoreMLRequest regionOfInterest ও সমর্থন করে — যদি আপনি এই অঞ্চলটি সেট করেন, তবে Vision Core ML মডেলে পাশ করার আগে ছবিটিকে নির্দিষ্ট আয়তক্ষেত্রে কাটবে। এটি পাইপলাইনের জন্য অত্যন্ত গুরুত্বপূর্ণ: মুখ শনাক্তের পর, আপনি VNCoreMLRequest এর জন্য regionOfInterest হিসাবে এর বাউন্ডিং বক্স পাশ করেন।
import Vision
// 1. মুখ শনাক্তি
let faceRequest = VNDetectFaceRectanglesRequest()
// 2. Core ML এর মাধ্যমে আবেগ শ্রেণিকরণ
guard let emotionModel = try VNCoreMLModel(
for: EmotionClassifier().model)
else { return }
let emotionRequest = VNCoreMLRequest(model: emotionModel)
try handler.perform([faceRequest, emotionRequest])
// 3. প্রতিটি মুখের জন্য regionOfInterest সেট করুন
for face in faceRequest.results as? [VNFaceObservation] ?? [] {
emotionRequest.regionOfInterest = face.boundingBox
try handler.perform([emotionRequest])
// আবেগ শ্রেণিকরণ ফলাফল প্রক্রিয়া করুন
}
সীমাবদ্ধতা: VNCoreMLRequest এর জন্য regionOfInterest তখন অর্থবহ হয় যখন মডেলটি একই আকার এবং অনুপাতের ছবিতে প্রশিক্ষিত হয়। যদি মডেলটি কঠোরভাবে একটি বর্গ ইনপুট (224x224) আশা করে, তবে regionOfInterest এর সাথে .centerCrop সর্বোত্তম ফলাফল দবে।
Apple ML Research এর মতে, regionOfInterest এর মাধ্যমে «ডিটেক্শন → শ্রেণিকরণ» পাইপলাইন সম্পূর্ণ ছবি শ্রেণিকরণের তুলনায় 20–30% সত্যতা উন্নতি প্রদান করে, কারণ ML মডেল পশ্চাত্বূমির গোলমাল ছাড়া শুধু প্রাসঙ্গিক অঞ্চলটি পায়।
| পাইপলাইন ধরন | অনুরোধ 1 (ডিটেক্শন) | অনুরোধ 2 (ML) | উদাহরণ |
|---|---|---|---|
| মুখ → আবেগ | VNDetectFaceRectanglesRequest | VNCoreMLRequest | মুড শনাক্তি |
| বস্তু → ব্রান্ড | VNDetectObjectAtPointRequest | VNCoreMLRequest | লোগো চিনিতে |
| টেক্সট → ভাষা | VNRecognizeTextRequest | VNCoreMLRequest | টেক্সট ভাষা শ্রেণিকরণ |
| দৃশ্য → বর্ণনা | VNClassifyImageRequest | VNCoreMLRequest | ট্যাগ উত্পাদন |
VNCoreMLRequest ফলাফল হিসাবে VNClassificationObservation (শ্রেণিকরণ মডেলের জন্য) বা VNCoreMLFeatureValueObservation (রিগ্রেশন এবং অন্যান্য ধরনের জন্য) ফেরত দেয়। ফলাফলের ধরন Core ML মডেলের আউটপুট ডেটার উপর নির্ভর করে।
VNClassificationObservation এ identifier (শ্রেণীর নাম) এবং confidence থাকে। softmax আউটপুট সহ মডেলগুলি অবরোহী confidence ক্রমে সাজানো এরকম পর্যবেক্ষণের একটি অ্যারে ফেরত দেয়। VNCoreMLFeatureValueObservation এ একটি ইচ্ছামতো MLFeatureValue থাকে — এটি MultiArray, Double, String বা Dictionary হতে পারে।
// শ্রেণিকরণ মডেলের জন্য
if let classificationResults = request.results
as? [VNClassificationObservation] {
for result in classificationResults
where result.confidence > 0.5 {
print("\\(result.identifier): \\(result.confidence)")
}
}
// রিগ্রেশন মডেলের জন্য (ফিচার মান)
if let featureResults = request.results
as? [VNCoreMLFeatureValueObservation] {
for result in featureResults {
let value = result.featureValue
print("\\(result.featureName): \\(value)")
}
}
Confidence ফিল্টারিং: Apple সাধারণ শ্রেণিবিন্যাসকারীর জন্য confidence < 0.3 এবং গুরুতর্পূর্ণ অ্যাপ্লিকেশনের জন্য < 0.7 সহ ফলাফল বাতিল করার পরামর্শ দেয়। সাময়সাম্য ডেটাসেটে প্রশিক্ষিত মডেলের জন্য, confidence সঠিক উত্তরের সম্ভাব্যতার সাথে সম্পর্কিত কিন্তু এর গারণ্টি দেয় না।
VNCoreMLFeatureValueObservation.featureName মডেলের আউটপুট লেয়ারের নামের (যেমন «classLabel» বা «features») সাথে মেলে। এটি একাধিক আউটপুট সহ মডেল পরিচালনার অনুমতি দেয় — প্রতিটি আউটপুট একটি অনন্য featureName সহ একটি পৃথক পর্যবেক্ষণ দ্বারা উপস্থাপিত হয়।
VNCoreMLRequest Neural Engine (A12+), GPU এবং CPU এ কাজ করার জন্য অপ্টিমাইজড। Vision মডেলের ধরন এবং আকারের উপর ভিত্তি করে স্বচালিতভাবে সর্বোত্তম ডিভাইস নির্বাচন করে। তবে উপযুক্ত কনফিগারেশনের মাধ্যমে কর্মক্ষমতা আরও উন্নত করা যায়।
Core ML মডেলগুলি প্রথম VNCoreMLRequest এ মেমরিতে লোড হয় এবং অ্যাপ্লিকেশন অনলোড না হোওয়া পর্যন্ত সেখানে থাকে। 200 MB এর বেশি মডেলের জন্য, Apple প্রয়োজনে লোড করার এবং MLModel.release() এর মাধ্যমে অনলোড করার পরামর্শ দেয়। VNCoreMLModel নিজেই কেশিং পরিচালনা করে, কিন্তু আপনি autoreleasepool এর মাধ্যমে এটি নিয়ন্ত্রণ করতে পারেন।
ব্যাচ প্রক্রিয়ার জন্য একটি VNCoreMLRequest তৈরি করুন এবং এটিকে বিভিন্ন VNImageRequestHandler এর সাথে পুনরায় ব্যবহার করুন। প্রতিটি ছবির জন্য একটি নতুন VNCoreMLRequest তৈরি করবেন না — এটি বারবার মডেল লোডিং এর কারণে প্রক্রিয়া ধীম করবে। 10+ ছবি প্রক্রিয়া করার সময় অনুরোধ পুনরায় ব্যবহার 40% পর্যন্ত কর্মক্ষমতা লাভ প্রদান করে।
// সঠিক: সকল ছবির জন্য একটি অনুরোধ
let batchSize = 20
let batchRequest = VNCoreMLRequest(model: model)
for i in 0..<batchSize {
let handler = VNImageRequestHandler(
cgImage: images[i],
options: [:])
try handler.perform([batchRequest])
// প্রতিটি কলে batchRequest.results আপডেট
}
ডিভাইস নির্বাচন: ডিফল্ট হিসাবে, Vision A12+ ডিভাইসে সংগত মডেলের জন্য Neural Engine নির্বাচন করে। যদি মডেলটি Neural Engine সমর্থন না করে, তবে Vision GPU বা CPU ব্যবহার করে। আপনি MLModelConfiguration.computeUnits এর মাধ্যমে জোরকরে ডিভাইস নির্দিষ্ট করতে পারেন, কিন্তু Apple স্বচালিত নির্বাচন ছাড়ার পরামর্শ দেয়।
Apple Performance Benchmarks 2024 এর মতে, Neural Engine (iPhone 15 Pro) এ VNCoreMLRequest MobileNetV2 শ্রেণিকরণ 3–5 ms এ প্রক্রিয়া করে, GPU এ — 8–12 ms, CPU এ — 20–30 ms। পার্থক্যটি রিয়াল-টাইম অ্যাপ্লিকেশনের জন্য গুরুতর্পূর্ণ হয় যা 30+ ফ্রেম প্রতি সেকেন্ড প্রক্রিয়া করে।
সাধারণ প্রশ্নাবলী
হ্যাঁ, Core ML Vision ছাড়া সরাসরি MLModel.prediction() এর মাধ্যমে ব্যবহার করা যায়। তবে, VNCoreMLRequest ছবি প্রাক-প্রক্রিয়া (স্কেলিং, ক্রপিং, CVPixelBuffer এ রূপান্তর) স্বচালিত করে। যদি মডেলটি ছবি নয় বরং MultiArray বা Double গ্রহণ করে — সরাসরি Core ML ব্যবহার করুন। VNCoreMLRequest শুধু Image Feature ইনপুট সহ মডেলের জন্য।
আপডেটেড MLModel থেকে একটি নতুন VNCoreMLModel এবং একটি নতুন VNCoreMLRequest তৈরি করুন। পুরানো অনুরোধটি মডেলের পুরানো সংস্করণ ব্যবহার করতে থাকবে। দূরবর্তী মডেল আপডেটের জন্য, সর্ভার থেকে ডাউনলোড করা .mlmodelc ফাইল থেকে ডিভাইসে মডেল কম্পাইল করতে MLModel.compileModel(at:) ব্যবহার করুন।
VNCoreMLRequest শুধু একটি Image Feature ইনপুট সহ মডেল সমর্থন করে। যদি মডেলের একাধিক ইনপুট থাকে (যেমন ছবি + টেক্সট), তবে MLModel এর মাধ্যমে সরাসরি Core ML ব্যবহার করুন। Vision ছবি ছাড়া অতিরিক্ত প্যারামিটার পাশ করতে পারে না।
VNImageRequestHandler এ পাশ করা CGImage এর জন্য সীমা হল 8192 x 8192 পিক্সেল। তবে, Core ML মডেলগুলি সাধারণত 224x224, 299x299 বা 512x512 ইনপুট আশা করে। Vision স্বচালিতভাবে বড় ছবিকে ইনপুট আকারে স্কেল করে। যদি মূল ছবিটি অতি বড় হয়, তবে মেমরি বঞ্চনের জন্য CGImage এর মাধ্যমে এটিকে আগে ছোট করে নিন।
হ্যাঁ, VNRequest এ preferBackgroundProcessing = true সেট করুন। এটি Vision কে অনুরোধ নিষ্পাদন স্থগিত করার অনুমতি দেয় যদি সিস্টেমটি সংশ্লিষ্টি-ইন্টেনসিভ মোডে থাকে (যেমন কন্টেন্ট লোডিং)। একাই হ্যানডলারের handler.perform() কল করার জন্য DispatchQueue.global(qos: .background) ব্যবহার করুন।
সারাংশ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন