QuickStart لنظام التشغيل Android

توضح لك هذه الصفحة كيفية إنشاء تطبيق Android باستخدام TensorFlow Lite لتحليل موجز الكاميرا المباشر وتحديد الكائنات. تسمى حالة استخدام التعلم الآلي هذه باكتشاف الكائنات . يستخدم التطبيق النموذجي مكتبة المهام TensorFlow Lite للرؤية عبر خدمات Google Play لتمكين تنفيذ نموذج التعلم الآلي للكشف عن الكائنات، وهو النهج الموصى به لبناء تطبيق تعلم الآلة باستخدام TensorFlow Lite.

عرض توضيحي للكشف عن الكائنات

الإعداد وتشغيل المثال

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

  • أندرويد ستوديو 4.2 أو أعلى
  • Android SDK الإصدار 21 أو أعلى

احصل على رمز المثال

قم بإنشاء نسخة محلية من رمز المثال حتى تتمكن من إنشائه وتشغيله.

لاستنساخ رمز المثال وإعداده:

  1. استنساخ مستودع git
    git clone https://github.com/tensorflow/examples.git
    
  2. قم بتكوين مثيل git الخاص بك لاستخدام السحب المتفرق، بحيث يكون لديك فقط الملفات الخاصة بتطبيق مثال اكتشاف الكائنات:
    cd examples
    git sparse-checkout init --cone
    git sparse-checkout set lite/examples/object_detection/android_play_services
    

استيراد وتشغيل المشروع

استخدم Android Studio لإنشاء مشروع من رمز المثال الذي تم تنزيله، ثم قم ببناء المشروع وتشغيله.

لاستيراد وإنشاء مشروع التعليمات البرمجية النموذجي:

  1. ابدأ تشغيل أندرويد ستوديو .
  2. من صفحة الترحيب في Android Studio، اختر "استيراد مشروع" أو حدد "ملف" > "جديد" > "استيراد مشروع" .
  3. انتقل إلى دليل التعليمات البرمجية النموذجي الذي يحتوي على ملف build.gradle ( ...examples/lite/examples/object_detection/android_play_services/build.gradle ) وحدد هذا الدليل.

بعد تحديد هذا الدليل، يقوم Android Studio بإنشاء مشروع جديد وإنشائه. عند اكتمال البناء، يعرض Android Studio رسالة BUILD SUCCESSFUL في لوحة حالة إخراج البناء .

لتشغيل المشروع:

  1. من Android Studio، قم بتشغيل المشروع عن طريق تحديد Run > Run… و MainActivity .
  2. حدد جهاز Android متصلاً بكاميرا لاختبار التطبيق.

كيف يعمل التطبيق المثال

يستخدم التطبيق النموذجي نموذج اكتشاف الكائنات الذي تم تدريبه مسبقًا، مثل mobilenetv1.tflite ، بتنسيق TensorFlow Lite للبحث عن الكائنات في دفق فيديو مباشر من كاميرا جهاز Android. رمز هذه الميزة موجود بشكل أساسي في هذه الملفات:

  • ObjectDetectorHelper.kt - تهيئة بيئة وقت التشغيل، وتمكين تسريع الأجهزة، وتشغيل نموذج ML للكشف عن الكائنات.
  • CameraFragment.kt - ينشئ دفق بيانات صورة الكاميرا، ويجهز البيانات للنموذج، ويعرض نتائج اكتشاف الكائنات.

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

قم ببناء التطبيق

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

إضافة تبعيات المشروع

في تطبيق Android الأساسي لديك، أضف تبعيات المشروع لتشغيل نماذج التعلم الآلي TensorFlow Lite والوصول إلى وظائف الأداة المساعدة لبيانات ML. تعمل وظائف الأداة المساعدة هذه على تحويل البيانات مثل الصور إلى تنسيق بيانات موتر يمكن معالجته بواسطة النموذج.

يستخدم تطبيق المثال مكتبة TensorFlow Lite Task للرؤية من خدمات Google Play لتمكين تنفيذ نموذج التعلم الآلي للكشف عن الكائنات. تشرح الإرشادات التالية كيفية إضافة تبعيات المكتبة المطلوبة إلى مشروع تطبيق Android الخاص بك.

لإضافة تبعيات الوحدة النمطية:

  1. في وحدة تطبيق Android التي تستخدم TensorFlow Lite، قم بتحديث ملف build.gradle الخاص بالوحدة ليشمل التبعيات التالية. في رمز المثال، يوجد هذا الملف هنا: ...examples/lite/examples/object_detection/android_play_services/app/build.gradle

    ...
    dependencies {
    ...
        // Tensorflow Lite dependencies
        implementation 'org.tensorflow:tensorflow-lite-task-vision-play-services:0.4.2'
        implementation 'com.google.android.gms:play-services-tflite-gpu:16.1.0'
    ...
    }
    
  2. في Android Studio، قم بمزامنة تبعيات المشروع عن طريق تحديد: File > Sync Project with Gradle Files .

تهيئة خدمات جوجل بلاي

عند استخدام خدمات Google Play لتشغيل نماذج TensorFlow Lite، يجب عليك تهيئة الخدمة قبل أن تتمكن من استخدامها. إذا كنت تريد استخدام دعم تسريع الأجهزة مع الخدمة، مثل تسريع GPU، يمكنك أيضًا تمكين هذا الدعم كجزء من هذه التهيئة.

لتهيئة TensorFlow Lite مع خدمات Google Play:

  1. قم بإنشاء كائن TfLiteInitializationOptions وقم بتعديله لتمكين دعم GPU:

    val options = TfLiteInitializationOptions.builder()
        .setEnableGpuDelegateSupport(true)
        .build()
    
  2. استخدم طريقة TfLiteVision.initialize() لتمكين استخدام وقت تشغيل خدمات التشغيل، وقم بتعيين المستمع للتحقق من تحميله بنجاح:

    TfLiteVision.initialize(context, options).addOnSuccessListener {
        objectDetectorListener.onInitialized()
    }.addOnFailureListener {
        // Called if the GPU Delegate is not supported on the device
        TfLiteVision.initialize(context).addOnSuccessListener {
            objectDetectorListener.onInitialized()
        }.addOnFailureListener{
            objectDetectorListener.onError("TfLiteVision failed to initialize: "
                    + it.message)
        }
    }
    

تهيئة مترجم نموذج ML

قم بتهيئة مترجم نموذج التعلم الآلي TensorFlow Lite عن طريق تحميل ملف النموذج وتعيين معلمات النموذج. يتضمن نموذج TensorFlow Lite ملف .tflite يحتوي على رمز النموذج. يجب عليك تخزين نماذجك في دليل src/main/assets لمشروع التطوير الخاص بك، على سبيل المثال:

.../src/main/assets/mobilenetv1.tflite`

لتهيئة النموذج:

  1. أضف ملف نموذج .tflite إلى دليل src/main/assets لمشروع التطوير الخاص بك، مثل ssd_mobilenet_v1 .
  2. قم بتعيين متغير modelName لتحديد اسم ملف نموذج ML الخاص بك:

    val modelName = "mobilenetv1.tflite"
    
  3. قم بتعيين خيارات النموذج، مثل عتبة التنبؤ وحجم مجموعة النتائج:

    val optionsBuilder =
        ObjectDetector.ObjectDetectorOptions.builder()
            .setScoreThreshold(threshold)
            .setMaxResults(maxResults)
    
  4. قم بتمكين تسريع GPU باستخدام الخيارات والسماح للرمز بالفشل بأمان إذا لم يكن التسريع مدعومًا على الجهاز:

    try {
        optionsBuilder.useGpu()
    } catch(e: Exception) {
        objectDetectorListener.onError("GPU is not supported on this device")
    }
    
    
  5. استخدم الإعدادات من هذا الكائن لإنشاء كائن TensorFlow Lite ObjectDetector الذي يحتوي على النموذج:

    objectDetector =
        ObjectDetector.createFromFileAndOptions(
            context, modelName, optionsBuilder.build())
    

لمزيد من المعلومات حول استخدام مندوبي تسريع الأجهزة مع TensorFlow Lite، راجع مندوبي TensorFlow Lite .

تحضير البيانات للنموذج

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

لإعداد البيانات للمعالجة بواسطة النموذج:

  1. أنشئ كائن ImageAnalysis لاستخراج الصور بالتنسيق المطلوب:

    imageAnalyzer =
        ImageAnalysis.Builder()
            .setTargetAspectRatio(AspectRatio.RATIO_4_3)
            .setTargetRotation(fragmentCameraBinding.viewFinder.display.rotation)
            .setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST)
            .setOutputImageFormat(OUTPUT_IMAGE_FORMAT_RGBA_8888)
            .build()
            ...
    
  2. قم بتوصيل المحلل بالنظام الفرعي للكاميرا وإنشاء مخزن مؤقت للصورة النقطية لاحتواء البيانات الواردة من الكاميرا:

            .also {
            it.setAnalyzer(cameraExecutor) { image ->
                if (!::bitmapBuffer.isInitialized) {
                    bitmapBuffer = Bitmap.createBitmap(
                        image.width,
                        image.height,
                        Bitmap.Config.ARGB_8888
                    )
                }
                detectObjects(image)
            }
        }
    
  3. قم باستخراج بيانات الصورة المحددة التي يحتاجها النموذج، وقم بتمرير معلومات تدوير الصورة:

    private fun detectObjects(image: ImageProxy) {
        // Copy out RGB bits to the shared bitmap buffer
        image.use { bitmapBuffer.copyPixelsFromBuffer(image.planes[0].buffer) }
        val imageRotation = image.imageInfo.rotationDegrees
        objectDetectorHelper.detect(bitmapBuffer, imageRotation)
    }    
    
  4. أكمل أي تحويلات نهائية للبيانات وأضف بيانات الصورة إلى كائن TensorImage ، كما هو موضح في طريقة ObjectDetectorHelper.detect() للتطبيق المثال:

    val imageProcessor = ImageProcessor.Builder().add(Rot90Op(-imageRotation / 90)).build()
    
    // Preprocess the image and convert it into a TensorImage for detection.
    val tensorImage = imageProcessor.process(TensorImage.fromBitmap(image))
    

تشغيل التوقعات

بمجرد إنشاء كائن TensorImage ببيانات الصورة بالتنسيق الصحيح، يمكنك تشغيل النموذج مقابل تلك البيانات لإنتاج تنبؤ أو استنتاج . في التطبيق المثال، تم تضمين هذا الرمز في أسلوب ObjectDetectorHelper.detect() .

لتشغيل النموذج وإنشاء تنبؤات من بيانات الصورة:

  • قم بتشغيل التنبؤ عن طريق تمرير بيانات الصورة إلى وظيفة التنبؤ الخاصة بك:

    val results = objectDetector?.detect(tensorImage)
    

التعامل مع إخراج النموذج

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

للتعامل مع نتائج التنبؤ بالنموذج:

  1. استخدم نمط المستمع لتمرير النتائج إلى رمز التطبيق الخاص بك أو كائنات واجهة المستخدم. يستخدم تطبيق المثال هذا النمط لتمرير نتائج الكشف من كائن ObjectDetectorHelper إلى كائن CameraFragment :

    objectDetectorListener.onResults( // instance of CameraFragment
        results,
        inferenceTime,
        tensorImage.height,
        tensorImage.width)
    
  2. التصرف بناءً على النتائج، مثل عرض التنبؤ للمستخدم. يرسم تطبيق المثال تراكبًا على كائن CameraPreview لإظهار النتيجة:

    override fun onResults(
      results: MutableList<Detection>?,
      inferenceTime: Long,
      imageHeight: Int,
      imageWidth: Int
    ) {
        activity?.runOnUiThread {
            fragmentCameraBinding.bottomSheetLayout.inferenceTimeVal.text =
                String.format("%d ms", inferenceTime)
    
            // Pass necessary information to OverlayView for drawing on the canvas
            fragmentCameraBinding.overlay.setResults(
                results ?: LinkedList<Detection>(),
                imageHeight,
                imageWidth
            )
    
            // Force a redraw
            fragmentCameraBinding.overlay.invalidate()
        }
    }
    

الخطوات التالية