VNCoreMLRequest — এটি কি, iOS এ Core ML এর জন্য Vision অনুরোধ

লেখক: IT Sectr প্রকাশিত: 2026-07-20 পড়ার সময়: 8 মিনিট

VNCoreMLRequest — এটি VNRequest এর একটি উপবর্গ যা Vision পাইপলাইনের মধ্যে Core ML মডেল চালানোর অনুমতি দেয়, Vision এর প্রস্তুত ডিটেক্টরগুলির (মুখ, টেক্সট, বস্তু) সুবিধাগুলিকে শ্রেণিকরণ এবং রিগ্রেশনের জন্য কাস্টম ML মডেলের সাথে সংযুক্ত করে। Apple Machine Learning Documentation (2024) এর মতে, VNCoreMLRequest স্বচালিতভাবে ছবি প্রাক-প্রক্রিয়া সম্পাদন করে — স্কেলিং, ক্রপ এবং রঙ স্থান রূপান্তর — Core ML মডেলের প্রয়োজনীয়তা অনুযায়ী।

মূখ্য বিষয়সমূহ

  • VNCoreMLRequest — Core ML এবং Vision এর মধ্যে সেতু: ML মডেলটি Vision অনুরোধ হিসাবে কাজ করে।
  • স্বচালিত ছবি প্রাক-প্রক্রিয়া: মডেলের প্রয়োজনীয়তা অনুযায়ী স্কেলিং, ক্রপ এবং রঙ সংশোধন।
  • পাইপলাইন তৈরির জন্য একটি perform() এ অন্য VNRequest এর সাথে সংযুক্ত হয়।
  • VNCoreMLModel সমর্থন করে — ছবি এবং FeatureValue এর সাথে কাজ করার জন্য MLModel এর উপর একটি র্যাপার।
  • সর্বাধিক কর্মক্ষমতার জন্য Neural Engine এবং GPU এ চালে।

VNCoreMLRequest কি?

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 এর জন্য সমর্থন।

swift
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: Core ML মডেলের উপর র্যাপার

VNCoreMLModel এটি একটি র্যাপার যা Vision এ ব্যবহারের জন্য Core ML মডেলকে (MLModel) অনুকূলিত করে। এটি মডেলের ইনপুট এবং আউটপুট ডেটাকে Vision এর জন্য বোঝানো যোগ্য ফরম্যাটে রূপান্তর করে: ছবি → CVPixelBuffer, ফলাফল → VNObservation।

VNCoreMLModel ইনিশিয়ালাইজেশন Vision এর সাথে মডেলের সামঞ্জস্য যাচাই করে: মডেলটিকে ইনপুট হিসাবে একটি ছবি (Image Feature) গ্রহণ করতে হবে এবং শ্রেণিকরণ (MLMultiArray বা Dictionary) ফেরত দিতে হবে। যদি মডেলটি অসামঞ্জস্যপূর্ণ হয়, তবে ইনিশিয়ালাইজার একটি ত্রুটি ছুড়ে দেয়।

swift
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 কনফিগার করা

imageCropAndScaleOption এটি VNCoreMLRequest এর একটি চাবিকাঠামো বৈশিষ্ট্য যা নির্ধারণ করে যে কিভাবে Vision উৎস ছবিটিকে Core ML মডেল ইনপুট আকারের সাথে মেলানোর জন্য রূপান্তর করে। সঠিক বিকল্প নির্বাচন সরাসরি শ্রেণিকরণ সত্যতাকে প্রভাবিত করে।

.centerCrop ছবিটিকে কেন্দ্র থেকে একটি বর্গে কাটে, তারপর এটিকে মডেল ইনপুট আকারে স্কেল করে। কেন্দ্রীভূত বস্তুতে প্রশিক্ষিত মডেলের জন্য উপযুক্ত (অধিকাংশ ImageNet শ্রেণিবিন্যাসকারী)। .scaleFill অনুপাত সংরক্ষণ ছাড়াই ছবিটিকে ইনপুট আকারে প্রসারিত করে। দ্রুত, কিন্তু জ্যামিতি বিকৃত করে। .scaleFit অনুপাত সংরক্ষণ সহ স্কেল করে, কানাগুলিতে letterbox (কালো দাগ) যোগ করে।

swift
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 এর সাথে অনুপাত বিকৃত করতে পারে।

অন্য VNRequest এর সাথে সম্মিলিত করা

প্রধান শক্তি VNCoreMLRequest এর একটি perform() কলে এটিকে অন্য VNRequest এর সাথে সম্মিলিত করার ক্ষমতা। এটি পাইপলাইন তৈরির অনুমতি দেয়: প্রথমে মুখ শনাক্ত করুন (VNDetectFaceRectanglesRequest), তারপর একটি কাস্টম Core ML মডেল (VNCoreMLRequest) এর মাধ্যমে প্রতিটি মুখ শ্রেণিবদ্ধ করুন।

VNCoreMLRequest regionOfInterest ও সমর্থন করে — যদি আপনি এই অঞ্চলটি সেট করেন, তবে Vision Core ML মডেলে পাশ করার আগে ছবিটিকে নির্দিষ্ট আয়তক্ষেত্রে কাটবে। এটি পাইপলাইনের জন্য অত্যন্ত গুরুত্বপূর্ণ: মুখ শনাক্তের পর, আপনি VNCoreMLRequest এর জন্য regionOfInterest হিসাবে এর বাউন্ডিং বক্স পাশ করেন।

swift
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)উদাহরণ
মুখ → আবেগVNDetectFaceRectanglesRequestVNCoreMLRequestমুড শনাক্তি
বস্তু → ব্রান্ডVNDetectObjectAtPointRequestVNCoreMLRequestলোগো চিনিতে
টেক্সট → ভাষাVNRecognizeTextRequestVNCoreMLRequestটেক্সট ভাষা শ্রেণিকরণ
দৃশ্য → বর্ণনাVNClassifyImageRequestVNCoreMLRequestট্যাগ উত্পাদন

VNCoreMLRequest ফলাফল প্রক্রিয়া

VNCoreMLRequest ফলাফল হিসাবে VNClassificationObservation (শ্রেণিকরণ মডেলের জন্য) বা VNCoreMLFeatureValueObservation (রিগ্রেশন এবং অন্যান্য ধরনের জন্য) ফেরত দেয়। ফলাফলের ধরন Core ML মডেলের আউটপুট ডেটার উপর নির্ভর করে।

VNClassificationObservation এ identifier (শ্রেণীর নাম) এবং confidence থাকে। softmax আউটপুট সহ মডেলগুলি অবরোহী confidence ক্রমে সাজানো এরকম পর্যবেক্ষণের একটি অ্যারে ফেরত দেয়। VNCoreMLFeatureValueObservation এ একটি ইচ্ছামতো MLFeatureValue থাকে — এটি MultiArray, Double, String বা Dictionary হতে পারে।

swift
// শ্রেণিকরণ মডেলের জন্য
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% পর্যন্ত কর্মক্ষমতা লাভ প্রদান করে।

swift
// সঠিক: সকল ছবির জন্য একটি অনুরোধ
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+ ফ্রেম প্রতি সেকেন্ড প্রক্রিয়া করে।

সাধারণ প্রশ্নাবলী

কি VNCoreMLRequest Vision ছাড়া — সরাসরি Core ML এর সাথে ব্যবহার করা যায়?

হ্যাঁ, Core ML Vision ছাড়া সরাসরি MLModel.prediction() এর মাধ্যমে ব্যবহার করা যায়। তবে, VNCoreMLRequest ছবি প্রাক-প্রক্রিয়া (স্কেলিং, ক্রপিং, CVPixelBuffer এ রূপান্তর) স্বচালিত করে। যদি মডেলটি ছবি নয় বরং MultiArray বা Double গ্রহণ করে — সরাসরি Core ML ব্যবহার করুন। VNCoreMLRequest শুধু Image Feature ইনপুট সহ মডেলের জন্য।

মডেলের নতুন সংস্করণ এলে VNCoreMLRequest কিভাবে আপডেট করবেন?

আপডেটেড MLModel থেকে একটি নতুন VNCoreMLModel এবং একটি নতুন VNCoreMLRequest তৈরি করুন। পুরানো অনুরোধটি মডেলের পুরানো সংস্করণ ব্যবহার করতে থাকবে। দূরবর্তী মডেল আপডেটের জন্য, সর্ভার থেকে ডাউনলোড করা .mlmodelc ফাইল থেকে ডিভাইসে মডেল কম্পাইল করতে MLModel.compileModel(at:) ব্যবহার করুন।

কি VNCoreMLRequest একাধিক ইনপুট সহ মডেল সমর্থন করে?

VNCoreMLRequest শুধু একটি Image Feature ইনপুট সহ মডেল সমর্থন করে। যদি মডেলের একাধিক ইনপুট থাকে (যেমন ছবি + টেক্সট), তবে MLModel এর মাধ্যমে সরাসরি Core ML ব্যবহার করুন। Vision ছবি ছাড়া অতিরিক্ত প্যারামিটার পাশ করতে পারে না।

VNCoreMLRequest এর জন্য সর্বোচ্চ ছবির আকার কত?

VNImageRequestHandler এ পাশ করা CGImage এর জন্য সীমা হল 8192 x 8192 পিক্সেল। তবে, Core ML মডেলগুলি সাধারণত 224x224, 299x299 বা 512x512 ইনপুট আশা করে। Vision স্বচালিতভাবে বড় ছবিকে ইনপুট আকারে স্কেল করে। যদি মূল ছবিটি অতি বড় হয়, তবে মেমরি বঞ্চনের জন্য CGImage এর মাধ্যমে এটিকে আগে ছোট করে নিন।

কি VNCoreMLRequest পর্দায় চালানো যায়?

হ্যাঁ, VNRequest এ preferBackgroundProcessing = true সেট করুন। এটি Vision কে অনুরোধ নিষ্পাদন স্থগিত করার অনুমতি দেয় যদি সিস্টেমটি সংশ্লিষ্টি-ইন্টেনসিভ মোডে থাকে (যেমন কন্টেন্ট লোডিং)। একাই হ্যানডলারের handler.perform() কল করার জন্য DispatchQueue.global(qos: .background) ব্যবহার করুন।

সারাংশ

  • VNCoreMLRequest — স্বচালিত ছবি প্রাক-প্রক্রিয়া সহ Vision পাইপলাইনে Core ML মডেল চালানোর জন্য VNRequest এর একটি উপবর্গ।
  • VNCoreMLModel Vision এর জন্য MLModel কে মুড়ে, স্বচালিতভাবে CGImage কে প্রয়োজনীয় আকার এবং রঙ স্থানের CVPixelBuffer এ রূপান্তর করে।
  • imageCropAndScaleOption (centerCrop, scaleFill, scaleFit) স্কেলিং কৌশল নির্ধারণ করে এবং মডেলের সত্যতাকে 15–25% পর্যন্ত প্রভাবিত করে।
  • VNDetectFaceRectanglesRequest এবং অন্য VNRequest এর সাথে সম্মিলিত করা regionOfInterest এর সাথে «ডিটেক্শন → শ্রেণিকরণ» পাইপলাইন তৈরির অনুমতি দেয়।
  • ফলাফল VNClassificationObservation (শ্রেণিকরণের জন্য) বা VNCoreMLFeatureValueObservation (রিগ্রেশন/অন্যান্য ধরনের জন্য) হিসাবে ফেরত দেওয়া হয়।
  • ব্যাচ প্রক্রিয়ার জন্য একটি VNCoreMLRequest পুনরায় ব্যবহার করা প্রতিটি ছবির জন্য নতুন তৈরির তুলনায় 40% পর্যন্ত কর্মক্ষমতা লাভ দেয়।
  • Neural Engine (MobileNetV2 এ 3–5 ms) এ কর্মক্ষমতা CPU এর তুলনায় 4–6 গুণ অধিক, যা রিয়াল-টাইম অ্যাপ্লিকেশনের জন্য গুরুতর্পূর্ণ।

আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব

IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।

প্রকল্প নিয়ে আলোচনা করুন

আরও পড়ুন