رصد العناصر في الصور باستخدام نموذج مدرَّب على 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

    إذا كنت تستخدم واجهة برمجة التطبيقات للكاميرا القديمة، يمكنك التقاط الصور في تنسيق ImageFormat.NV21