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

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

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

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

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

  • Android Studio 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. ابدأ Android Studio .
  2. من صفحة ترحيب Android Studio ، اختر استيراد مشروع ، أو حدد ملف> جديد> استيراد مشروع .
  3. انتقل إلى دليل التعليمات البرمجية المثال الذي يحتوي على ملف build.gradle ( ...examples/lite/examples/object_detection/android_play_services/build.gradle ) وحدد هذا الدليل.

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

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

  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

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

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

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

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

    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()
        }
    }
    

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