دليل تصنيف الصور إلى شرائح لنظام التشغيل Android

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

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

يحتوي مثال التعليمة البرمجية MediaPipe Tasks على عمليتين تنفيذيتين بسيطتين تطبيق Image Segmenter لنظام التشغيل Android:

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

تشير الأقسام التالية إلى أداة تقسيم الصور مع قناع فئة التطبيق.

تنزيل الرمز

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

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

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

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

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

تحتوي الملفات التالية على الرمز المهم لهذه الصورة مثال على تطبيق التصنيف إلى قطاعات أو شرائح:

  • ImageSegmenterHelper.kt - يقوم بتهيئة مهمة أداة تقسيم الصور والتعامل مع النموذج والتفويض التحديد.
  • CameraFragment.kt - يتم توفير واجهة المستخدم ورمز التحكم الخاص بالكاميرا.
  • GalleryFragment.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() لتحديد المسار الذي يستخدمه النموذج. يُشار إلى هذه الطريقة في مثال التعليمة البرمجية في المثال التالي .

في أداة تقسيم الصور مثال الرمز، يتم تحديد النموذج في ImageSegmenterHelper.kt الفئة في الدالة setupImageSegmenter().

إنشاء المهمة

يمكنك استخدام الدالة createFromOptions لإنشاء المهمة. تشير رسالة الأشكال البيانية تقبل الدالة createFromOptions خيارات الإعداد، بما في ذلك إخراج القناع. الأنواع. لمزيد من المعلومات حول تهيئة المهمة، راجع خيارات الإعداد:

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

صورة

ImageSegmenterOptions options =
  ImageSegmenterOptions.builder()
    .setBaseOptions(
      BaseOptions.builder().setModelAssetPath("model.tflite").build())
    .setRunningMode(RunningMode.IMAGE)
    .setOutputCategoryMask(true)
    .setOutputConfidenceMasks(false)
    .build();
imagesegmenter = ImageSegmenter.createFromOptions(context, options);
    

فيديو

ImageSegmenterOptions options =
  ImageSegmenterOptions.builder()
    .setBaseOptions(
      BaseOptions.builder().setModelAssetPath("model.tflite").build())
    .setRunningMode(RunningMode.VIDEO)
    .setOutputCategoryMask(true)
    .setOutputConfidenceMasks(false)
    .build();
imagesegmenter = ImageSegmenter.createFromOptions(context, options);
    

بث مباشر

ImageSegmenterOptions options =
  ImageSegmenterOptions.builder()
    .setBaseOptions(
      BaseOptions.builder().setModelAssetPath("model.tflite").build())
    .setRunningMode(RunningMode.LIVE_STREAM)
    .setOutputCategoryMask(true)
    .setOutputConfidenceMasks(false)
    .setResultListener((result, inputImage) -> {
         // Process the segmentation result here.
    })
    .setErrorListener((result, inputImage) -> {
         // Process the segmentation errors here.
    })
    .build()
imagesegmenter = ImageSegmenter.createFromOptions(context, options)
    

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

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

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

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

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

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

LIVE_STREAM: وضع البث المباشر للإدخال البيانات، مثل تلك الواردة من الكاميرا. في هذا الوضع، يجب أن يكون resultListener يتم استدعاءها لإعداد مستمع للحصول على النتائج بشكل غير متزامن.
{IMAGE, VIDEO, LIVE_STREAM} IMAGE
outputCategoryMask في حال ضبط القيمة على True، سيشمل الناتج قناع تصنيف إلى شرائح. كصورة uint8، حيث تشير كل قيمة بكسل إلى الفئة الفائزة {True, False} False
outputConfidenceMasks في حال ضبط القيمة على True، سيشمل الناتج قناع تصنيف إلى شرائح. كصورة قيمة عائمة، حيث تمثل كل قيمة عائمة الثقة خريطة النقاط للفئة. {True, False} True
displayNamesLocale لتعيين لغة التسميات لاستخدامها في الأسماء المعروضة المقدمة في بيانات التعريف لنموذج المهمة، إن وجد. القيمة التلقائية هي en لمدة الإنجليزية. يمكنك إضافة تصنيفات مترجَمة إلى البيانات الوصفية لنموذج مخصّص. باستخدام TensorFlow Lite Metadata Writer API رمز اللغة en
resultListener تعيين أداة معالجة النتائج لتلقّي نتائج التقسيم بشكل غير متزامن عندما يكون أداة تقسيم الصور في وضع LIVE_STREAM. لا يمكن استخدام الإذن إلا عند ضبط "وضع التشغيل" على LIVE_STREAM لا ينطبق لا ينطبق
errorListener تضبط هذه السياسة أداة معالجة للأخطاء اختيارية. لا ينطبق لم يتم ضبط الوضع

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

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

يجب تحويل الصورة المدخلة أو الإطار إلى 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 value. Youll need them
// 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()
Image mpImage = new MediaImageBuilder(mediaImage).build();
    

في رمز مثال أداة تقسيم الصور، يتم التعامل مع إعداد البيانات في ImageSegmenterHelper الفئة على الدالة segmentLiveStreamFrame().

تنفيذ المهمة

يتم استدعاء دالة segment مختلفة بناءً على وضع الجري الذي تستخدمه. تعرض دالة Image Segmenter مناطق المقطع المحددة داخل إدخال صورة أو إطار

صورة

ImageSegmenterResult segmenterResult = imagesegmenter.segment(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.
ImageSegmenterResult segmenterResult =
    imagesegmenter.segmentForVideo(image, frameTimestampMs);
    

بث مباشر

// Run inference on the frame. The segmentations results will be available via
// the `resultListener` provided in the `ImageSegmenterOptions` when the image
// segmenter was created.
imagesegmenter.segmentAsync(image, frameTimestampMs);
    

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

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

في الرمز البرمجي الخاص بأداة تقسيم الصور، يتم تحديد دوال segment في ImageSegmenterHelper.kt الملف.

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

عند تشغيل الاستنتاج، تعرض مهمة أداة تقسيم الصور ImageSegmenterResult الذي يحتوي على نتائج مهمة التصنيف إلى شرائح. يتضمن محتوى تعتمد النتائج على outputType التي تضبطها عند ضبط تم ضبط المهمة.

تعرض الأقسام التالية أمثلة على بيانات الإخراج من هذه المهمة:

ثقة الفئة

تعرض الصور التالية تصورًا لمخرجات المهمة لفئة ما قناع الثقة. يحتوي ناتج قناع الثقة على قيم عائمة بين [0, 1]

نتائج قناع الثقة للصورة الأصلية والفئة: صورة المصدر من Pascal VOC 2012 مجموعة البيانات

قيمة الفئة

تعرض الصور التالية تصورًا لمخرجات المهمة لفئة ما قناع القيمة. نطاق قناع الفئة هو [0, 255] وقيمة كل قيمة بكسل. مؤشر الفئة الفائز لمخرجات النموذج. الفئة الفائزة على أعلى درجة بين الفئات التي يمكن أن يتعرف عليها النموذج.

إخراج قناع الصورة الأصلي والفئة: صورة المصدر من Pascal VOC 2012 مجموعة البيانات