رصد العناصر في الصور باستخدام نموذج مدرَّب على 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) في نموذج تطبيق Quickstart كمثال.
  • إذا كنت تستخدم مخرجات أداة تصنيف الصور لتراكب الرسومات على الصورة المدخلة، احصل أولاً على النتيجة، ثم تعرض الصورة وتراكبها في خطوة واحدة. ومن خلال القيام بذلك، يمكنك العرض على سطح الشاشة مرة واحدة فقط لكل إطار إدخال يمكنك الاطّلاع على CameraSourcePreview و GraphicOverlay صف في نموذج تطبيق البدء السريع مثال.
  • في حال استخدام واجهة برمجة التطبيقات Camera2 API، يمكنك التقاط الصور في تنسيق ImageFormat.YUV_420_888

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