الدليل التفاعلي للصور في Android

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

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

مثال الرمز البرمجي لمهام MediaPipe هو تنفيذ بسيط لتطبيق أداة تقسيم الصور التفاعلية لنظام التشغيل 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/interactive_segmentation/android
    

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

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

تحتوي الملفات التالية على التعليمات البرمجية الهامة لتطبيق مثال تقسيم الصور هذا:

  • InteractiveSegmentationHelper.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() لتحديد المسار الذي يستخدمه النموذج يتم عرض هذه الطريقة في مثال الرمز في القسم التالي.

في مثال رمز تقسيم الصور التفاعلية، يتم تعريف النموذج في الفئة InteractiveSegmenterHelper.kt في الدالة setupInteractiveSegmenter().

إنشاء المهمة

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

InteractiveSegmenterOptions options =
  InteractiveSegmenterOptions.builder()
    .setBaseOptions(
      BaseOptions.builder().setModelAssetPath("model.tflite").build())
    .setOutputCategoryMask(true)
    .setOutputConfidenceMasks(false)
    .setResultListener((result, inputImage) -> {
         // Process the segmentation result here.
    })
    .setErrorListener((result, inputImage) -> {
         // Process the segmentation errors here.
    })    .build();
interactivesegmenter = InteractiveSegmenter.createFromOptions(context, options);

للاطّلاع على مثال أكثر تفصيلاً لإعداد هذه المهمة، راجِع دالة setupInteractiveSegmenter() للفئة InteractiveSegmenterHelper.

خيارات الضبط

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

اسم الخيار الوصف نطاق القيمة القيمة التلقائية
outputCategoryMask في حال ضبط هذه السمة على True، ستتضمّن الناتج قناع تقسيم على شكل صورة uint8، حيث تشير كل قيمة بكسل إلى ما إذا كان البكسل جزءًا من العنصر الواقع في المنطقة محط الاهتمام. {True, False} False
outputConfidenceMasks في حال ضبط هذه القيمة على True، يشتمل الناتج على قناع تصنيف على أنّه صورة ذات قيمة عائمة، حيث تمثل كل قيمة عائمة مستوى الثقة بأنّ وحدة البكسل هي جزء من الكائن في المنطقة محط الاهتمام. {True, False} True
displayNamesLocale تحدِّد هذه السياسة لغة التصنيفات التي سيتم استخدامها للأسماء المعروضة في البيانات الوصفية لنموذج المهمة، إذا كان ذلك متاحًا. الإعداد التلقائي هو en للغة الإنجليزية. يمكنك إضافة تصنيفات مترجَمة إلى البيانات الوصفية لنموذج مخصّص باستخدام TensorFlow Lite Metadata Scriptr API. رمز اللغة en
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 user’s device as a Bitmap object using BitmapFactory.

// Convert an Android’s Bitmap object to a MediaPipe’s Image object.
Image mpImage = new BitmapImageBuilder(bitmap).build();

في الرمز البرمجي المثالي لأداة تقسيم الصور التفاعلية، تتم معالجة عملية إعداد البيانات في الفئة InteractiveSegmenterHelper من خلال الدالة segment().

تنفيذ المهمة

يمكنك استدعاء الدالة segment لتشغيل التوقع وإنشاء الشرائح. تعرض مهمة "أداة تقسيم الصور التفاعلية" مناطق الأجزاء المحددة داخل صورة الإدخال.

RegionOfInterest roi = RegionOfInterest.create(
    NormalizedKeypoint.create(
        normX * it.width,
        normY * it.height
    )
);

ImageSegmenterResult segmenterResult = interactivesegmenter.segment(image, roi);

في الرمز المثالي لأداة تقسيم الصور التفاعلية، يتم تحديد دوال segment في الملف InteractiveSegmenterHelper.kt.

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

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

تشرح الأقسام التالية بيانات الإخراج من هذه المهمة:

قناع الفئة

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

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

قناع الثقة

تحتوي نتيجة قناع الثقة على قيم عائمة بين [0, 1] لكل قناة إدخال صورة. وتشير القيم الأعلى إلى درجة ثقة أكبر بأن بكسل الصورة هو جزء من الكائن الموجود في المنطقة محل الاهتمام.