VNCoreMLRequest — ما هو، طلب Vision لـ Core ML في iOS

المؤلف: IT Sectr نُشر: 2026-07-20 وقت القراءة: 8 دق

VNCoreMLRequest — هو فئة فرعية من VNRequest تسمح بتشغيل نماذج Core ML داخل خط أنابيب Vision، مجمعة بين مزايا كاشفات Vision الجاهزة (الوجوه، النصوص، الكائنات) مع نماذج ML مخصصة للتصنيف والانحدار. وفقًا لوثائق Apple Machine Learning (2024)، يقوم VNCoreMLRequest بمعالجة ما قبل المعالجة للصور تلقائيًا — التحجيم، القصّ وتحويل فضاء اللون — وفقًا لمتطلبات نموذج Core ML.

النقاط الرئيسية

  • VNCoreMLRequest — جسر بين Core ML و Vision: نموذج ML يعمل كطلب Vision.
  • معالجة صور تلقائية: تحجيم، قص وتصحيح لوني حسب متطلبات النموذج.
  • يتحد مع VNRequest أخرى في perform() واحدة لبناء خطوط أنابيب.
  • يدعم VNCoreMLModel — غلاف فوق MLModel للعمل مع الصور و FeatureValue.
  • يعمل على Neural Engine و GPU لأقصى الأداء.

ما هو VNCoreMLRequest؟

VNCoreMLRequest هو فئة فرعية من VNRequest، أضيفت في iOS 11 مع Vision، وتسمح بتشغيل نماذج Core ML في سياق Vision. تتولى جميع معالجات ما قبل المعالجة للصور المطلوبة من قبل نموذج Core ML: تغيير الحجم، القص، التطبيع وتحويل فضاء اللون.

بدون VNCoreMLRequest، سيضطر المطور على تحويل UIImage/CGImage يدويًا إلى MultiArray (MLMultiArray) أو PixelBuffer (CVPixelBuffer) بالحجم المطلوب. VNCoreMLRequest يؤتت هذه العملية: تقوم بتمرير CGImage عبر VNImageRequestHandler، ويقوم VNCoreMLRequest بتحجيمه حسب إدخال النموذج نفسه.

VNCoreMLRequest يرث جميع إمكانيات VNRequest: معالج الاكتمال، regionOfInterest، القدرة على تنفيذ طلبات متعددة في نفس الوقت، دعم 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 بالحجم وفضاء اللون المطلوبين. لأنواع بيانات الإدخال الأخرى، يجب استخدام Core ML مباشرة دون Vision.

وفقًا لـ Apple WWDC 2023، يتم استخدام VNCoreMLRequest في 40% من جميع تطبيقات iOS التي تستخدم Core ML لمعالجة الصور. هذا هو الطريق الأكثر شيوعًا لدمج نماذج ML في تطبيقات iOS.

VNCoreMLModel: غلاف فوق نموذج Core ML

VNCoreMLModel هو غلاف يكيّف نموذج Core ML (MLModel) للاستخدام في Vision. يقوم بتحويل بيانات الإدخال والخرج للنموذج إلى تنسيق مفهوم لدى 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 ميجابايت، قد يقوم 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 — يعطي أفضل توازن بين الدقة والأداء. إذا كان النموذج مدربًا على صور بنسب محفوظة (على سبيل المثال، كشف الشذوذ على صور المستندات)، اختر .scaleFit مع letterbox.

وفقًا لـ Apple Developer Documentation 2024، الاختيار غير الصحيح لـ imageCropAndScaleOption يمكن أن يقلل دقة النموذج بنسبة 15–25%. على سبيل المثال، .scaleFill لوجه يقع على حافة الإطار قد يقطع جزءًا منه مع .centerCrop أو يشوه النسب مع .scaleFill.

الدمج مع VNRequest أخرى

القوة الرئيسية لـ VNCoreMLRequest هي القدرة على دمجه مع VNRequest أخرى في استدعاء perform() واحد. هذا يسمح ببناء خطوط أنابيب: أولًا كشف الوجوه (VNDetectFaceRectanglesRequest)، ثم تصنيف كل وجه من خلال نموذج Core ML مخصص (VNCoreMLRequest).

VNCoreMLRequest يدعم أيضًا regionOfInterest — إذا قمت بتعيين هذه المنطقة، سيقوم Vision بقص الصورة إلى المستطيل المحدد قبل تمريرها إلى نموذج Core ML. هذا أساسي للخطوط الأنابيب: بعد كشف الوجوه، تقوم بتمرير مربع الإحاطة خاصته كـ regionOfInterest لـ VNCoreMLRequest.

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])
    // معالجة نتيجة تصنيف العواطف
}

قيد: regionOfInterest لـ VNCoreMLRequest له معنى عندما يكون النموذج مدربًا على صور من نفس الحجم والنسبة. إذا كان النموذج يتوقع إدخالًا مربعًا بالكامل (224x224)، فإن .centerCrop مع regionOfInterest سيعطي أفضل نتيجة.

وفقًا لأبحاث 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 ميجابايت، توصي Apple بتحميلها حسب الطلب وتفريغها عبر MLModel.release(). يدير VNCoreMLModel التخزين المؤقت بنفسه، ولكن يمكنك التحكم في ذلك عبر autoreleasepool.

المعالجة دفعية

للمعالجة الدفعية للصور، أنشئ VNCoreMLRequest واحدًا وأعد استخدامه مع VNImageRequestHandler مختلفة. لا تنشئ VNCoreMLRequest جديدًا لكل صورة — هذا سيبطئ المعالجة بسبب تحميل النموذج المتكرر. إعادة استخدام الطلب توفر زيادة في الأداء تصل إلى 40% عند معالجة 10+ صور.

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 Neural Engine للنماذج المتوافقة على أجهزة A12+. إذا كان النموذج لا يدعم Neural Engine، يستخدم Vision GPU أو CPU. يمكنك تحديد الجهاز بإجبار عبر MLModelConfiguration.computeUnits، ولكن Apple توصي بترك الاختيار التلقائي.

وفقًا لمعايير Apple Performance Benchmarks 2024، يعالج VNCoreMLRequest على Neural Engine (iPhone 15 Pro) تصنيف MobileNetV2 في 3–5 مللي ثان، على GPU — 8–12 مللي ثان، على CPU — 20–30 مللي ثان. يصبح الفرق حرجًا للتطبيقات الوقت الحقيقي التي تعالج 30+ إطارًا في الثانية.

الأسئلة الشائعة

هل يمكن استخدام VNCoreMLRequest بدون Vision — مباشرة مع Core ML؟

نعم، يمكن استخدام Core ML مباشرة عبر MLModel.prediction() دون Vision. ولكن VNCoreMLRequest يؤتت معالجة الصور المسبقة (التحجيم، القص، التحويل إلى CVPixelBuffer). إذا كان النموذج يقبل غير صورة بل MultiArray أو Double — استخدم Core ML مباشرة. VNCoreMLRequest هو فقط للنماذج بميزة Image Feature كإدخال.

كيف تحديث VNCoreMLRequest عند إصدار نسخة جديدة من النموذج؟

أنشئ VNCoreMLModel جديدًا من MLModel المحدث و VNCoreMLRequest جديدًا. سيستمر الطلب القديم في استخدام النسخة القديمة من النموذج. للتحديثات البعيدة للنماذج، استخدم MLModel.compileModel(at:) لتجميع النموذج على الجهاز من ملف .mlmodelc تم تنزيله من الخادم.

هل يدعم VNCoreMLRequest نماذج بمدخلات متعددة؟

VNCoreMLRequest يدعم فقط النماذج بمدخل Image Feature واحد. إذا كان للنموذج مدخلات متعددة (على سبيل المثال، صورة + نص)، استخدم Core ML مباشرة عبر MLModel. Vision لا يستطيع تمرير معلمات إضافية بعد الصورة.

ما هو الحجم الأقصى للصورة لـ VNCoreMLRequest؟

الحد هو 8192 × 8192 بكسل لـ CGImage الممرر إلى VNImageRequestHandler. ولكن نماذج Core ML تتوقع عادة إدخال 224x224، 299x299 أو 512x512. Vision يقيس الصور الكبيرة تلقائيًا إلى حجم الإدخال. إذا كانت الصورة الأصلية كبيرة جدًا، قم بتصغيرها مسبقًا عبر CGImage لتوفير الذاكرة.

هل يمكن تشغيل VNCoreMLRequest في الخلفية؟

نعم، قم تعيين preferBackgroundProcessing = true على VNRequest. هذا يسمح لـ Vision بتأجيل تنفيذ الطلب إذا كان النظام في وضع يستهلك الموارد (على سبيل المثال، تحميل المحتوى). أيضًا، تأكد من استخدام DispatchQueue.global(qos: .background) لاستدعاء handler.perform().

الملخص

  • VNCoreMLRequest — فئة فرعية من VNRequest لتشغيل نماذج Core ML في خط أنابيب Vision مع معالجة صور تلقائية.
  • VNCoreMLModel يغلف MLModel لـ Vision، محولًا CGImage تلقائيًا إلى CVPixelBuffer بالحجم وفضاء اللون المطلوبين.
  • imageCropAndScaleOption (centerCrop, scaleFill, scaleFit) تحدد استراتيجية التحجيم وتؤثر على دقة النموذج بنسبة 15–25%.
  • الدمج مع VNDetectFaceRectanglesRequest و VNRequest أخرى يسمح ببناء خطوط أنابيب «كشف → تصنيف» مع regionOfInterest.
  • تعاد النتائج كـ VNClassificationObservation (للتصنيف) أو VNCoreMLFeatureValueObservation (للانحدار/أنواع أخرى).
  • إعادة استخدام VNCoreMLRequest واحد للمعالجة الدفعية توفر زيادة في الأداء تصل إلى 40% مقارنة بإنشاء جديد لكل صورة.
  • الأداء على Neural Engine (3–5 مس على MobileNetV2) أسرع بنسبة 4–6 مرات مقارنة بـ CPU، وهو أمر حرج للتطبيقات الوقت الحقيقي.

سنقوم بتطوير تطبيق جوال جاهز

تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.

مناقشة المشروع

اقرأ أيضًا