دليل رصد العناصر في نظام التشغيل Android

تتيح لك مهمة كشف الكائنات اكتشاف وجود وفئات الكائنات. على سبيل المثال، يمكن لأداة رصد الكائنات تحديد مكان الكلاب في . توضح لك هذه التعليمات كيفية استخدام مهمة كشف الكائنات في Android يتوفر نموذج التعليمة البرمجية الموضح في هذه التعليمات على GitHub. يمكنك رؤية هذه المهمة وهي قيد التنفيذ من خلال عرض هذه العرض التوضيحي للويب مزيد من المعلومات حول الإمكانات والنماذج وخيارات الضبط هذه المهمة، راجع نظرة عامة.

مثال على الرمز البرمجي

رمز مثال "مهام MediaPipe" هو تنفيذ بسيط لمكتشف الكائنات تطبيق Android. يستخدم هذا المثال الكاميرا على جهاز Android فعلي بشكلٍ مستمر، ويمكنها أيضًا استخدام الصور والفيديوهات من معرض الجهاز لاكتشاف الكائنات بشكل ثابت.

يمكنك استخدام التطبيق كنقطة بداية لتطبيق Android الخاص بك، أو الرجوع إليه عند تعديل تطبيق حالي. تتم استضافة نموذج الرمز البرمجي لأداة كشف الكائنات على GitHub.

تنزيل الرمز

توضّح لك التعليمات التالية كيفية إنشاء نسخة على الجهاز من هذا المثال. باستخدام أداة سطر الأوامر git.

لتنزيل نموذج الرمز:

  1. استنساخ مستودع git باستخدام الأمر التالي:
    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. يمكنك اختياريًا ضبط مثيل git لاستخدام عملية الدفع المتناثر لذا، لديك فقط ملفات تطبيق أداة كشف الكائنات كمثال:
    cd mediapipe
    git sparse-checkout init --cone
    git sparse-checkout set examples/object_detection/android
    

بعد إنشاء نسخة محلية من نموذج الرمز، يمكنك استيراد المشروع. إلى استوديو Android وتشغيل التطبيق. للحصول على التعليمات، يُرجى الاطّلاع على دليل إعداد Android

المكوّنات الرئيسية

تشتمل الملفات التالية على التعليمات البرمجية المهمة لكشف الكائنات مثال للتطبيق:

  • ObjectDetectorHelper.kt - يؤدي هذا الإعداد إلى إعداد أداة رصد الكائنات والتعامل مع النموذج والتفويض. الاختيار
  • MainActivity.kt - تنفيذ التطبيق وتجميع مكونات واجهة المستخدم
  • OverlayView.kt - التعامل مع النتائج وعرضها

ضبط إعدادات الجهاز

يصف هذا القسم الخطوات الرئيسية لإعداد بيئة التطوير مشاريع الرموز البرمجية لاستخدام أداة رصد الكائنات. للحصول على معلومات عامة عن إعداد بيئة التطوير الخاصة بك لاستخدام مهام MediaPipe، بما في ذلك متطلبات إصدار نظام التشغيل، راجع دليل إعداد Android

التبعيات

تستخدم ميزة "رصد الكائنات" مكتبة "com.google.mediapipe:tasks-vision". إضافة هذا التبعية إلى ملف build.gradle الخاص مشروع تطوير تطبيق Android. قم باستيراد التبعيات المطلوبة باستخدام التعليمة البرمجية التالية:

dependencies {
    implementation 'com.google.mediapipe:tasks-vision:latest.release'
}

الطراز

تتطلب مهمة أداة الكشف عن عناصر MediaPipe نموذجًا مدرَّبًا متوافقًا مع هذه المهمة. لمزيد من المعلومات عن النماذج المدرَّبة المتاحة لأداة رصد العناصر، يُرجى الاطّلاع على نظرة عامة على المهمة قسم النماذج.

حدد النموذج ونزّله ثم خزّنه في دليل المشروع:

<dev-project-root>/src/main/assets

استخدام الطريقة BaseOptions.Builder.setModelAssetPath() لتحديد المسار الذي يستخدمه النموذج. للاطّلاع على مثال على الرمز البرمجي، يُرجى مراجعة القسم التالي.

إنشاء المهمة

يمكنك استخدام الدالة createFromOptions لإنشاء المهمة. تشير رسالة الأشكال البيانية تقبل الدالة createFromOptions خيارات الإعداد، بما في ذلك خيارات التشغيل الوضع، لغة الأسماء المعروضة، الحد الأقصى لعدد النتائج، الحد الأدنى للثقة، القائمة المسموح بها للفئات وقائمة الحظر. إذا لم يتم تحديد خيار ضبط، فسيتم استخدام القيمة الافتراضية. لمزيد من المعلومات حول خيارات الضبط، راجِع نظرة عامة على الإعدادات.

تتوافق مهمة أداة رصد العناصر مع 3 أنواع من بيانات الإدخال: الصور الثابتة وملفات الفيديو. وأحداث الفيديو المباشرة يجب تحديد وضع التشغيل المتوافق نوع بيانات الإدخال عند إنشاء المهمة. اختر علامة التبويب المقابلة نوع بيانات الإدخال لمعرفة كيفية إنشاء المهمة وتنفيذ الاستنتاج.

صورة

ObjectDetectorOptions options =
  ObjectDetectorOptions.builder()
    .setBaseOptions(BaseOptions.builder().setModelAssetPath(‘model.tflite’).build())
    .setRunningMode(RunningMode.IMAGE)
    .setMaxResults(5)
    .build();
objectDetector = ObjectDetector.createFromOptions(context, options);
    

فيديو

ObjectDetectorOptions options =
  ObjectDetectorOptions.builder()
    .setBaseOptions(BaseOptions.builder().setModelAssetPath(‘model.tflite’).build())
    .setRunningMode(RunningMode.VIDEO)
    .setMaxResults(5)
    .build();
objectDetector = ObjectDetector.createFromOptions(context, options);
    

بث مباشر

ObjectDetectorOptions options =
  ObjectDetectorOptions.builder()
    .setBaseOptions(BaseOptions.builder().setModelAssetPath(model.tflite).build())
    .setRunningMode(RunningMode.LIVE_STREAM)
    .setMaxResults(5)
    .setResultListener((result, inputImage) -> {
      // Process the detection result here.
    })
    .setErrorListener((result, inputImage) -> {
      // Process the classification errors here.
    })
   .build();
objectDetector = ObjectDetector.createFromOptions(context, options);
    

يسمح تنفيذ رمز نموذج أداة كشف الكائنات للمستخدم بالتبديل بين أوضاع المعالجة. تجعل هذه الطريقة رمز إنشاء المهمة أكثر تعقيدًا قد لا تكون مناسبة لحالة الاستخدام لديك. يمكنك رؤية هذا الرمز في ObjectDetectorHelper الفئة setupObjectDetector().

خيارات الإعداد

تتضمّن هذه المهمة خيارات الضبط التالية لتطبيقات Android:

اسم الخيار الوصف نطاق القيمة القيمة الافتراضية
runningMode لضبط وضع التشغيل للمهمة. هناك ثلاثة وسائل النقل:

IMAGE: وضع إدخالات الصورة الفردية

فيديو: وضع الإطارات التي تم فك ترميزها لفيديو معيّن

LIVE_STREAM: وضع البث المباشر للإدخال البيانات، مثل تلك الواردة من الكاميرا. في هذا الوضع، يجب أن يكون resultListener يتم استدعاءها لإعداد مستمع للحصول على النتائج بشكل غير متزامن.
{IMAGE, VIDEO, LIVE_STREAM} IMAGE
displayNamesLocales لتعيين لغة التسميات لاستخدامها في الأسماء المعروضة المقدمة في بيانات التعريف لنموذج المهمة، إن وجد. القيمة التلقائية هي en لمدة الإنجليزية. يمكنك إضافة تصنيفات مترجَمة إلى البيانات الوصفية لنموذج مخصّص. باستخدام TensorFlow Lite Metadata Writer API رمز اللغة en
maxResults يتم ضبط الحد الأقصى الاختياري لنتائج رصد أعلى الدرجات على إرجاع. أي أرقام موجبة -1 (تمّ عرض جميع النتائج)
scoreThreshold لتعيين الحد الأدنى لنتيجة التنبؤ الذي يلغي الحد المقدم في بيانات التعريف للنموذج (إن وجدت). يتم رفض النتائج التي تكون أدنى من هذه القيمة. أي عدد عائم لم يتم ضبط الوضع
categoryAllowlist تضبط هذه السياسة القائمة الاختيارية لأسماء الفئات المسموح بها. إذا لم تكن فارغة، نتائج الكشف التي ليس فيها اسم الفئة في هذه المجموعة بفلترته. ويتم تجاهل أسماء الفئات المكرّرة أو غير المعروفة. لا يمكن لأحد الطرفين استخدام هذا الخيار إلا بعد استخدام categoryDenylist. يؤدي كلا الخيارين إلى خطأ. أي سلاسل لم يتم ضبط الوضع
categoryDenylist تحدِّد هذه السياسة القائمة الاختيارية لأسماء الفئات غير المسموح بها. في حال حذف نتائج الكشف غير الفارغة، التي يوجد اسم فئته بها في هذه المجموعة ستتم تصفيتها . ويتم تجاهل أسماء الفئات المكرّرة أو غير المعروفة. يتوفّر هذا الخيار حصرية مع categoryAllowlist واستخدام النتيجتين معًا إلى حدوث خطأ. أي سلاسل لم يتم ضبط الوضع
resultListener تعيين أداة معالجة النتيجة لتلقي نتائج الرصد بشكل غير متزامن عندما تكون أداة رصد الكائنات في البث المباشر الحالي. لا يمكنك استخدام هذا الخيار إلا عند ضبط runMode على LIVE_STREAM. غير منطبق لم يتم ضبط الوضع

تجهيز البيانات

يجب تحويل الصورة المدخلة أو الإطار إلى com.google.mediapipe.framework.image.MPImage قبل تمريره إلى أداة رصد العناصر

توضّح الأمثلة التالية كيفية إعداد البيانات للمعالجة وتوضّحها. لكل نوع من أنواع البيانات المتاحة:

صورة

import com.google.mediapipe.framework.image.BitmapImageBuilder;
import com.google.mediapipe.framework.image.MPImage;

// Load an image on the users device as a Bitmap object using BitmapFactory.

// Convert an Androids Bitmap object to a MediaPipes Image object.
Image mpImage = new BitmapImageBuilder(bitmap).build();
    

فيديو

import com.google.mediapipe.framework.image.BitmapImageBuilder;
import com.google.mediapipe.framework.image.MPImage;

// Load a video file on the user's device using MediaMetadataRetriever

// From the videos metadata, load the METADATA_KEY_DURATION and
// METADATA_KEY_VIDEO_FRAME_COUNT values. Use these values
// to calculate the timestamp of each frame later.

// Loop through the video and load each frame as a Bitmap object.

// Convert the Androids Bitmap object to a MediaPipes Image object.
Image mpImage = new BitmapImageBuilder(frame).build();
    

بث مباشر

import com.google.mediapipe.framework.image.MediaImageBuilder;
import com.google.mediapipe.framework.image.MPImage;

// Create a CameraXs ImageAnalysis to continuously receive frames
// from the devices camera. Configure it to output frames in RGBA_8888
// format to match with what is required by the model.

// For each Androids ImageProxy object received from the ImageAnalysis,
// extract the encapsulated Androids Image object and convert it to
// a MediaPipes Image object.
android.media.Image mediaImage = imageProxy.getImage()
MPImage mpImage = new MediaImageBuilder(mediaImage).build();
    

في رمز مثال كاشف الكائنات، يتم التعامل مع إعداد البيانات في ObjectDetectorHelper داخل الصف detectImage() وdetectVideoFile() وdetectLivestreamFrame() الأخرى.

تنفيذ المهمة

اعتمادًا على نوع البيانات التي تتعامل معها، استخدم ObjectDetector.detect...() الخاصة بنوع البيانات هذا تحديدًا. استخدام detect() للصور الفردية detectForVideo() للإطارات في ملفات الفيديو detectAsync() للفيديوهات المضمَّنة. عند إجراء عمليات اكتشاف على فيديو مضمّن، تأكَّد من تنفيذ عمليات الرصد في سلسلة محادثات منفصلة لتجنُّب حظر مؤشر ترابط واجهة المستخدم.

تعرض نماذج الرموز التالية أمثلة بسيطة حول كيفية تشغيل أداة رصد الكائنات في أوضاع البيانات المختلفة هذه:

صورة

ObjectDetectorResult detectionResult = objectDetector.detect(image);
    

فيديو

// Calculate the timestamp in milliseconds of the current frame.
long frame_timestamp_ms = 1000 * video_duration * frame_index / frame_count;

// Run inference on the frame.
ObjectDetectorResult detectionResult =
    objectDetector.detectForVideo(image, frameTimestampMs);
    

بث مباشر

// Run inference on the frame. The detection results will be available
// via the `resultListener` provided in the `ObjectDetectorOptions` when
// the object detector was created.
objectDetector.detectAsync(image, frameTimestampMs);
    

يوضّح مثال رمز أداة رصد الكائنات عمليات تنفيذ كلٍ من هذه الإجراءات وسائل النقل بمزيد من التفصيل detect()، detectVideoFile(), وdetectAsync(). يسمح رمز المثال للمستخدم بالتبديل بين أوضاع المعالجة. وقد لا يكون مطلوبًا لحالة الاستخدام لديك.

يُرجى ملاحظة ما يلي:

  • عند تشغيل الفيديو في وضع الفيديو أو في وضع البث المباشر، يجب: توفير الطابع الزمني لإطار الإدخال إلى مهمة أداة كشف الكائنات.
  • عند التشغيل في وضع الصور أو الفيديو، ستتخذ مهمة حظر سلسلة التعليمات الحالية إلى أن تنتهي من معالجة صورة الإدخال أو الإطار. لتجنّب حظر سلسلة المحادثات الحالية، يجب تنفيذ المعالجة في سلسلة محادثات في الخلفية.
  • عند تفعيل "وضع البث المباشر"، لا تحظر "أداة رصد العناصر" سلسلة التعليمات الحالية ولكنها تعود فورًا. سوف يستدعي نتيجته أداة استماع تظهر فيها نتيجة الرصد في كل مرة ينتهي فيها من معالجة إطار الإدخال. وإذا تم استدعاء وظيفة الاكتشاف عند بدء مهمة كشف الكائنات مشغولاً بمعالجة إطار آخر، فسيتم تجاهل إطار الإدخال الجديد.

التعامل مع العملاء وعرض النتائج

عند تشغيل الاستنتاج، تعرض مهمة "اكتشاف الكائنات" عنصر ObjectDetectorResult يصف الكائنات التي تم العثور عليها صورة الإدخال.

في ما يلي مثال على بيانات الإخراج من هذه المهمة:

ObjectDetectorResult:
 Detection #0:
  Box: (x: 355, y: 133, w: 190, h: 206)
  Categories:
   index       : 17
   score       : 0.73828
   class name  : dog
 Detection #1:
  Box: (x: 103, y: 15, w: 138, h: 369)
  Categories:
   index       : 17
   score       : 0.73047
   class name  : dog

تُظهر الصورة التالية تصورًا لنتج المهمة:

يوضّح رمز نموذج أداة رصد العناصر طريقة عرض عنصر الرصد التي تم إرجاعها من المهمة، يمكنك الاطلاع على OverlayView لمزيد من التفاصيل.