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

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

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

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

قبل البدء

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

  2. أضِف التبعيات لمكتبة مهام TensorFlow Lite إلى ملف 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.