رصد العناصر في الصور باستخدام نموذج مدرَّب على AutoML على Android

بعد تدريب النموذج الخاص بك باستخدام AutoML Vision Edge، يمكنك استخدامه في تطبيقك لرصد الأجسام في الصور.

هناك طريقتان لدمج النماذج المدربة من AutoML Vision Edge: يمكنك تجميع النموذج عن طريق وضعه داخل مجلد مواد عرض تطبيقك، أو يمكنك تنزيله ديناميكيًا من Firebase.

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

قبل البدء

  1. إذا أردت تنزيل نموذج، تأكَّد من إضافة Firebase إلى مشروع Android، إذا لم يسبق لك إجراء ذلك. ولا يُشترط إجراء ذلك عند تجميع النموذج.

  2. أضِف التبعيات لمكتبة TensorFlow Lite Task إلى ملف Gradle على مستوى التطبيق الخاص بالوحدة، والذي يكون عادةً app/build.gradle:

    لتجميع نموذج مع تطبيقك:

    dependencies {
      // ...
      // Object detection with a bundled Auto ML model
      implementation 'org.tensorflow:tensorflow-lite-task-vision:0.0.0-nightly-SNAPSHOT'
    }
    

    لتنزيل نموذج ديناميكيًا من Firebase، أضِف أيضًا التبعية لتكنولوجيا تعلُّم الآلة من Firebase:

    dependencies {
      // ...
      // Object detection with an Auto ML model deployed to Firebase
      implementation platform('com.google.firebase:firebase-bom:26.1.1')
      implementation 'com.google.firebase:firebase-ml-model-interpreter'
    
      implementation 'org.tensorflow:tensorflow-lite-task-vision:0.0.0-nightly'
    }
    

1. تحميل النموذج

ضبط مصدر نموذج على الجهاز

لتجميع النموذج مع تطبيقك:

  1. استخرِج النموذج من أرشيف zip الذي نزّلته من وحدة تحكّم Google Cloud.
  2. أدرِج طراز جهازك في حزمة تطبيقك:
    1. إذا لم يكن لديك مجلد مواد عرض في مشروعك، أنشئ مجلدًا من خلال النقر بزر الماوس الأيمن على مجلد app/، ثم النقر على جديد > مجلد > مجلد مواد العرض.
    2. انسخ ملف التصميم tflite الذي يتضمّن بيانات وصفية مضمّنة إلى مجلد مواد العرض.
  3. أضِف ما يلي إلى ملف build.gradle في تطبيقك لضمان عدم ضغط Gradle لملف التصميم عند إنشاء التطبيق:

    android {
        // ...
        aaptOptions {
            noCompress "tflite"
        }
    }
    

    سيتم تضمين ملف النموذج في حزمة التطبيق وسيكون متاحًا كعنصر خام.

ضبط مصدر نموذج مستضاف على Firebase

لاستخدام النموذج المستضاف عن بُعد، أنشئ عنصرًا من النوع RemoteModel، وحدِّد الاسم الذي منحته للنموذج عند نشره:

جافا

// Specify the name you assigned when you deployed the model.
FirebaseCustomRemoteModel remoteModel =
        new FirebaseCustomRemoteModel.Builder("your_model").build();

Kotlin

// Specify the name you assigned when you deployed the model.
val remoteModel =
    FirebaseCustomRemoteModel.Builder("your_model_name").build()

بعد ذلك، ابدأ مهمة تنزيل النموذج، مع تحديد الشروط التي تريد السماح بالتنزيل بموجبها. إذا لم يكن النموذج متوفّرًا على الجهاز أو إذا كان هناك إصدار أحدث من النموذج، ستنزِّل المهمة النموذج بشكل غير متزامن من Firebase:

جافا

DownloadConditions downloadConditions = new DownloadConditions.Builder()
        .requireWifi()
        .build();
RemoteModelManager.getInstance().download(remoteModel, downloadConditions)
        .addOnSuccessListener(new OnSuccessListener<Void>() {
            @Override
            public void onSuccess(@NonNull Task<Void> task) {
                // Success.
            }
        });

Kotlin

val downloadConditions = DownloadConditions.Builder()
    .requireWifi()
    .build()
RemoteModelManager.getInstance().download(remoteModel, downloadConditions)
    .addOnSuccessListener {
        // Success.
    }

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

إنشاء أداة رصد الأجسام من النموذج

بعد ضبط مصادر النماذج، أنشئ عنصرًا منObjectDetector من أحد هذه المصادر.

إذا كان لديك نموذج مجمّع على الجهاز فقط، ما عليك سوى إنشاء أداة رصد الأجسام منملف النموذج وضبط الحدّ الأدنى لنتيجة الثقة التي تريد فرضها (راجِع تقييم النموذج):

جافا

// Initialization
ObjectDetectorOptions options = ObjectDetectorOptions.builder()
    .setScoreThreshold(0)  // Evaluate your model in the Google Cloud console
                           // to determine an appropriate value.
    .build();
ObjectDetector objectDetector = ObjectDetector.createFromFileAndOptions(context, modelFile, options);

Kotlin

// Initialization
val options = ObjectDetectorOptions.builder()
    .setScoreThreshold(0)  // Evaluate your model in the Google Cloud console
                           // to determine an appropriate value.
    .build()
val objectDetector = ObjectDetector.createFromFileAndOptions(context, modelFile, options)

إذا كان لديك نموذج مستضاف عن بُعد، عليك التأكّد من أنّه تم تنزيله قبل تشغيله. يمكنك التحقّق من حالة مهمة تنزيل النموذج باستخدام طريقة isModelDownloaded() في أداة إدارة النماذج.

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

جافا

FirebaseModelManager.getInstance().isModelDownloaded(remoteModel)
        .addOnSuccessListener(new OnSuccessListener<Boolean>() {
            @Override
            public void onSuccess(Boolean isDownloaded) {
            }
        });

Kotlin

FirebaseModelManager.getInstance().isModelDownloaded(remoteModel)
        .addOnSuccessListener { success ->

        }

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

بعد التأكّد من تنزيل النموذج، أنشئ أداة رصد للأشياء من ملف النموذج:

جافا

FirebaseModelManager.getInstance().getLatestModelFile(remoteModel)
        .addOnCompleteListener(new OnCompleteListener<File>() {
            @Override
            public void onComplete(@NonNull Task<File> task) {
                File modelFile = task.getResult();
                if (modelFile != null) {
                    ObjectDetectorOptions options = ObjectDetectorOptions.builder()
                            .setScoreThreshold(0)
                            .build();
                    objectDetector = ObjectDetector.createFromFileAndOptions(
                            getApplicationContext(), modelFile.getPath(), options);
                }
            }
        });

Kotlin

FirebaseModelManager.getInstance().getLatestModelFile(remoteModel)
        .addOnSuccessListener { modelFile ->
            val options = ObjectDetectorOptions.builder()
                    .setScoreThreshold(0f)
                    .build()
            objectDetector = ObjectDetector.createFromFileAndOptions(
                    applicationContext, modelFile.path, options)
        }

2- تجهيز صورة الإدخال

بعد ذلك، أنشئ كائنًا TensorImage من صورتك لكل صورة تريد تصنيفها. يمكنك إنشاء عنصر TensorImage من Bitmap باستخدام الطريقة fromBitmap:

جافا

TensorImage image = TensorImage.fromBitmap(bitmap);

Kotlin

val image = TensorImage.fromBitmap(bitmap)

إذا لم تكن بيانات الصورة في Bitmap، يمكنك تحميل صفيف بكسل كما هو موضّح في مستندات TensorFlow Lite.

3- تشغيل أداة رصد الأجسام

لرصد الأجسام في صورة، مرِّر عنصر TensorImage إلى detect() في ObjectDetector.

جافا

List<Detection> results = objectDetector.detect(image);

Kotlin

val results = objectDetector.detect(image)

‫4- الحصول على معلومات عن الأجسام المصنَّفة

في حال نجاح عملية رصد الأجسام، يتم عرض قائمة Detection بالأجسام. يمثّل كل عنصر Detection شيئًا تم رصده في الصورة. يمكنك الحصول على مربّع حدود كل كائن وتصنيفاته.

على سبيل المثال:

جافا

for (Detection result : results) {
    RectF bounds = result.getBoundingBox();
    List<Category> labels = result.getCategories();
}

Kotlin

for (result in results) {
    val bounds = result.getBoundingBox()
    val labels = result.getCategories()
}

نصائح لتحسين الأداء في الوقت الفعلي

إذا كنت تريد تصنيف الصور في تطبيق يعمل في الوقت الفعلي، اتّبِع هذه الإرشادات لتحقيق أفضل معدّلات عرض اللقطات:

  • يمكنك الحد من عدد طلبات تصنيف الصور. إذا أصبح إطار فيديو جديد متاحًا أثناء تشغيل أداة وضع التصنيفات على الصور، يمكنك إسقاط الإطار. يمكنك الاطّلاع على فئة VisionProcessorBase في تطبيق نموذج البدء السريع للحصول على مثال.
  • إذا كنت تستخدِم ناتج أداة وضع التصنيفات على الصور لوضع الرسومات على صورة الإدخال، احصل أولاً على النتيجة، ثم اعرض الصورة وطبقها في خطوة واحدة. وبذلك، يتم عرض المحتوى على سطح العرض مرّة واحدة فقط لكل إطار إدخال. يمكنك الاطّلاع على صفوف CameraSourcePreview و GraphicOverlay في تطبيق نموذج البدء السريع للحصول على مثال.
  • إذا كنت تستخدم واجهة برمجة التطبيقات Camera2 API، يمكنك التقاط الصور بتنسيق ImageFormat.YUV_420_888.

    إذا كنت تستخدم الإصدار القديم من Camera API، يمكنك التقاط الصور بتنسيق ImageFormat.NV21.