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

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

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

مثال التعليمات البرمجية لـ MediaPipe Tasks هو تطبيق بسيط لقسمة الصور التفاعلي على نظام التشغيل Android. يعمل المثال مع الصور التي يتم اختيارها من معرض الصور على الجهاز.

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

تنزيل الرمز

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

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

  1. استنسِخ مستودع git باستخدام الأمر التالي:
    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. يمكنك اختياريًا ضبط مثيل git لاستخدام عملية الفحص الخفيف، لكي لا يتوفّر لديك سوى ملفات مثال تطبيق Interactive Image Segmenter:
    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(exception -> {
         // 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 لعبارة English. يمكنك إضافة تصنيفات مترجَمة إلى البيانات الوصفية لنموذج مخصّص باستخدام واجهة برمجة التطبيقات TensorFlow Lite Metadata Writer 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 users device as a Bitmap object using BitmapFactory.

// Convert an Androids Bitmap object to a MediaPipes Image object.
MPImage 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] لكل قناة إدخال صورة. تشير القيم الأعلى إلى ثقة أكبر بأنّ بكسل الصورة هو جزء من الجسم الواقع في منطقة الاهتمام.