TensorFlow Lite في خدمات Google Play Java API

يمكن أيضًا الوصول إلى TensorFlow Lite في خدمات Google Play باستخدام Java APIs، بالإضافة إلى Native API. على وجه الخصوص، يتوفر TensorFlow Lite في خدمات Google Play من خلال TensorFlow Lite Task API و TensorFlow Lite Interpreter API . توفر مكتبة المهام واجهات نموذجية محسنة جاهزة لمهام التعلم الآلي الشائعة باستخدام البيانات المرئية والصوتية والنصية. توفر واجهة برمجة التطبيقات TensorFlow Lite Interpreter API، التي يوفرها وقت تشغيل TensorFlow، واجهة أكثر عمومية لبناء نماذج تعلم الآلة وتشغيلها.

توفر الأقسام التالية إرشادات حول كيفية استخدام واجهات برمجة التطبيقات للمترجم الفوري ومكتبة المهام مع TensorFlow Lite في خدمات Google Play. على الرغم من أنه من الممكن أن يستخدم التطبيق كلاً من واجهات برمجة تطبيقات Interpreter وواجهات برمجة تطبيقات مكتبة المهام، إلا أنه يجب على معظم التطبيقات استخدام مجموعة واحدة فقط من واجهات برمجة التطبيقات.

استخدام واجهات برمجة تطبيقات مكتبة المهام

تغطي واجهة برمجة تطبيقات TensorFlow Lite Task API واجهة Interpreter API وتوفر واجهة برمجة عالية المستوى لمهام التعلم الآلي الشائعة التي تستخدم البيانات المرئية والصوتية والنصية. يجب عليك استخدام Task API إذا كان تطبيقك يتطلب إحدى المهام المدعومة .

1. أضف تبعيات المشروع

تعتمد تبعية مشروعك على حالة استخدام التعلم الآلي لديك. تحتوي واجهات برمجة تطبيقات المهام على المكتبات التالية:

  • مكتبة الرؤية: org.tensorflow:tensorflow-lite-task-vision-play-services
  • المكتبة الصوتية: org.tensorflow:tensorflow-lite-task-audio-play-services
  • مكتبة النصوص: org.tensorflow:tensorflow-lite-task-text-play-services

أضف إحدى التبعيات إلى رمز مشروع التطبيق الخاص بك للوصول إلى واجهة برمجة تطبيقات خدمات التشغيل لـ TensorFlow Lite. على سبيل المثال، استخدم ما يلي لتنفيذ مهمة الرؤية:

dependencies {
...
    implementation 'org.tensorflow:tensorflow-lite-task-vision-play-services:0.4.2'
...
}

2. أضف تهيئة TensorFlow Lite

قم بتهيئة مكون TensorFlow Lite في واجهة برمجة تطبيقات خدمات Google Play قبل استخدام واجهات برمجة التطبيقات TensorFlow Lite. يقوم المثال التالي بتهيئة مكتبة الرؤية:

كوتلين

init {
  TfLiteVision.initialize(context)
}

3. تشغيل الاستدلالات

بعد تهيئة مكون TensorFlow Lite، قم باستدعاء طريقة detect() لإنشاء الاستدلالات. يختلف الكود الدقيق داخل طريقة detect() وفقًا للمكتبة وحالة الاستخدام. ما يلي هو حالة استخدام بسيطة للكشف عن الكائنات مع مكتبة TfLiteVision :

كوتلين

fun detect(...) {
  if (!TfLiteVision.isInitialized()) {
    Log.e(TAG, "detect: TfLiteVision is not initialized yet")
    return
  }

  if (objectDetector == null) {
    setupObjectDetector()
  }

  ...

}

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

val imageProcessor = ImageProcessor.Builder().add(Rot90Op(-imageRotation / 90)).build()
val tensorImage = imageProcessor.process(TensorImage.fromBitmap(image))
val results = objectDetector?.detect(tensorImage)

استخدام واجهات برمجة التطبيقات للمترجم الفوري

توفر واجهات برمجة تطبيقات المترجم الفوري مزيدًا من التحكم والمرونة مقارنة بواجهات برمجة تطبيقات مكتبة المهام. يجب عليك استخدام Interpreter APIs إذا كانت مهمة التعلم الآلي الخاصة بك غير مدعومة من مكتبة المهام، أو إذا كنت تحتاج إلى واجهة أكثر عمومية لإنشاء نماذج ML وتشغيلها.

1. أضف تبعيات المشروع

أضف التبعيات التالية إلى رمز مشروع التطبيق الخاص بك للوصول إلى Play Services API لـ TensorFlow Lite:

dependencies {
...
    // Tensorflow Lite dependencies for Google Play services
    implementation 'com.google.android.gms:play-services-tflite-java:16.0.1'
    // Optional: include Tensorflow Lite Support Library
    implementation 'com.google.android.gms:play-services-tflite-support:16.0.1'
...
}

2. أضف تهيئة TensorFlow Lite

قم بتهيئة مكون TensorFlow Lite في واجهة برمجة تطبيقات خدمات Google Play قبل استخدام واجهات برمجة التطبيقات TensorFlow Lite:

كوتلين

val initializeTask: Task<Void> by lazy { TfLite.initialize(this) }

جافا

Task<Void> initializeTask = TfLite.initialize(context);

3. قم بإنشاء مترجم وضبط خيار وقت التشغيل

أنشئ مترجمًا باستخدام InterpreterApi.create() وقم بتكوينه لاستخدام وقت تشغيل خدمات Google Play، عن طريق استدعاء InterpreterApi.Options.setRuntime() ، كما هو موضح في رمز المثال التالي:

كوتلين

import org.tensorflow.lite.InterpreterApi
import org.tensorflow.lite.InterpreterApi.Options.TfLiteRuntime
...
private lateinit var interpreter: InterpreterApi
...
initializeTask.addOnSuccessListener {
  val interpreterOption =
    InterpreterApi.Options().setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY)
  interpreter = InterpreterApi.create(
    modelBuffer,
    interpreterOption
  )}
  .addOnFailureListener { e ->
    Log.e("Interpreter", "Cannot initialize interpreter", e)
  }

جافا

import org.tensorflow.lite.InterpreterApi
import org.tensorflow.lite.InterpreterApi.Options.TfLiteRuntime
...
private InterpreterApi interpreter;
...
initializeTask.addOnSuccessListener(a -> {
    interpreter = InterpreterApi.create(modelBuffer,
      new InterpreterApi.Options().setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY));
  })
  .addOnFailureListener(e -> {
    Log.e("Interpreter", String.format("Cannot initialize interpreter: %s",
          e.getMessage()));
  });

يجب عليك استخدام التنفيذ أعلاه لأنه يتجنب حظر سلسلة واجهة مستخدم Android. إذا كنت بحاجة إلى إدارة تنفيذ سلسلة الرسائل عن كثب، فيمكنك إضافة استدعاء Tasks.await() لإنشاء مترجم:

كوتلين

import androidx.lifecycle.lifecycleScope
...
lifecycleScope.launchWhenStarted { // uses coroutine
  initializeTask.await()
}

جافا

@BackgroundThread
InterpreterApi initializeInterpreter() {
    Tasks.await(initializeTask);
    return InterpreterApi.create(...);
}

4. تشغيل الاستدلالات

باستخدام كائن interpreter الذي قمت بإنشائه، قم باستدعاء الأسلوب run() لإنشاء استنتاج.

كوتلين

interpreter.run(inputBuffer, outputBuffer)

جافا

interpreter.run(inputBuffer, outputBuffer);

تسريع الأجهزة

يتيح لك TensorFlow Lite تسريع أداء النموذج الخاص بك باستخدام معالجات الأجهزة المتخصصة، مثل وحدات معالجة الرسومات (GPUs). يمكنك الاستفادة من هذه المعالجات المتخصصة باستخدام برامج تشغيل الأجهزة التي تسمى المفوضين . يمكنك استخدام مندوبي تسريع الأجهزة التاليين مع TensorFlow Lite في خدمات Google Play:

  • مندوب GPU (مستحسن) - يتم توفير هذا المفوض من خلال خدمات Google Play ويتم تحميله ديناميكيًا، تمامًا مثل إصدارات خدمات Play من Task API وInterpreter API.

  • مندوب NNAPI - يتوفر هذا المفوض باعتباره تبعية مكتبة مضمنة في مشروع تطوير Android الخاص بك، ويتم تجميعه في تطبيقك.

لمزيد من المعلومات حول تسريع الأجهزة باستخدام TensorFlow Lite، راجع صفحة مندوبي TensorFlow Lite .

التحقق من توافق الجهاز

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

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

useGpuTask = TfLiteGpu.isGpuDelegateAvailable(context)

بمجرد أن يكون لديك متغير مثل useGpuTask ، يمكنك استخدامه لتحديد ما إذا كانت الأجهزة تستخدم مندوب GPU. توضح الأمثلة التالية كيف يمكن القيام بذلك باستخدام كل من مكتبة المهام وواجهات برمجة التطبيقات للمترجم الفوري.

مع مهمة API

كوتلين

lateinit val optionsTask = useGpuTask.continueWith { task ->
  val baseOptionsBuilder = BaseOptions.builder()
  if (task.result) {
    baseOptionsBuilder.useGpu()
  }
 ObjectDetectorOptions.builder()
          .setBaseOptions(baseOptionsBuilder.build())
          .setMaxResults(1)
          .build()
}
    

جافا

Task<ObjectDetectorOptions> optionsTask = useGpuTask.continueWith({ task ->
  BaseOptions baseOptionsBuilder = BaseOptions.builder();
  if (task.getResult()) {
    baseOptionsBuilder.useGpu();
  }
  return ObjectDetectorOptions.builder()
          .setBaseOptions(baseOptionsBuilder.build())
          .setMaxResults(1)
          .build()
});
    

مع مترجم API

كوتلين

val interpreterTask = useGpuTask.continueWith { task ->
  val interpreterOptions = InterpreterApi.Options()
      .setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY)
  if (task.result) {
      interpreterOptions.addDelegateFactory(GpuDelegateFactory())
  }
  InterpreterApi.create(FileUtil.loadMappedFile(context, MODEL_PATH), interpreterOptions)
}
    

جافا

Task<InterpreterApi.Options> interpreterOptionsTask = useGpuTask.continueWith({ task ->
  InterpreterApi.Options options =
      new InterpreterApi.Options().setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY);
  if (task.getResult()) {
     options.addDelegateFactory(new GpuDelegateFactory());
  }
  return options;
});
    

GPU مع واجهات برمجة تطبيقات مكتبة المهام

لاستخدام مندوب GPU مع واجهات برمجة تطبيقات المهام:

  1. قم بتحديث تبعيات المشروع لاستخدام مندوب GPU من خدمات Play:

    implementation 'com.google.android.gms:play-services-tflite-gpu:16.1.0'
    
  2. قم بتهيئة مندوب GPU باستخدام setEnableGpuDelegateSupport . على سبيل المثال، يمكنك تهيئة مندوب GPU لـ TfLiteVision بما يلي:

    كوتلين

        TfLiteVision.initialize(context, TfLiteInitializationOptions.builder().setEnableGpuDelegateSupport(true).build())
        

    جافا

        TfLiteVision.initialize(context, TfLiteInitializationOptions.builder().setEnableGpuDelegateSupport(true).build());
        
  3. قم بتمكين خيار تفويض GPU باستخدام BaseOptions :

    كوتلين

        val baseOptions = BaseOptions.builder().useGpu().build()
        

    جافا

        BaseOptions baseOptions = BaseOptions.builder().useGpu().build();
        
  4. قم بتكوين الخيارات باستخدام .setBaseOptions . على سبيل المثال، يمكنك إعداد GPU في ObjectDetector باستخدام ما يلي:

    كوتلين

        val options =
            ObjectDetectorOptions.builder()
                .setBaseOptions(baseOptions)
                .setMaxResults(1)
                .build()
        

    جافا

        ObjectDetectorOptions options =
            ObjectDetectorOptions.builder()
                .setBaseOptions(baseOptions)
                .setMaxResults(1)
                .build();
        

GPU مع واجهات برمجة التطبيقات للمترجم

لاستخدام مندوب GPU مع واجهات برمجة التطبيقات للمترجم الفوري:

  1. قم بتحديث تبعيات المشروع لاستخدام مندوب GPU من خدمات Play:

    implementation 'com.google.android.gms:play-services-tflite-gpu:16.1.0'
    
  2. قم بتمكين خيار مندوب GPU في تهيئة TFlite:

    كوتلين

        TfLite.initialize(context,
          TfLiteInitializationOptions.builder()
           .setEnableGpuDelegateSupport(true)
           .build())
        

    جافا

        TfLite.initialize(context,
          TfLiteInitializationOptions.builder()
           .setEnableGpuDelegateSupport(true)
           .build());
        
  3. تمكين مندوب GPU في خيارات المترجم: قم بتعيين المصنع المفوض على GpuDelegateFactory عن طريق استدعاء addDelegateFactory() within InterpreterApi.Options()`:

    كوتلين

        val interpreterOption = InterpreterApi.Options()
         .setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY)
         .addDelegateFactory(GpuDelegateFactory())
        

    جافا

        Options interpreterOption = InterpreterApi.Options()
          .setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY)
          .addDelegateFactory(new GpuDelegateFactory());
        

الترحيل من TensorFlow Lite المستقل

إذا كنت تخطط لترحيل تطبيقك من TensorFlow Lite المستقل إلى واجهة برمجة تطبيقات خدمات Play، فراجع الإرشادات الإضافية التالية لتحديث رمز مشروع تطبيقك:

  1. راجع قسم القيود في هذه الصفحة للتأكد من دعم حالة الاستخدام الخاصة بك.
  2. قبل تحديث التعليمات البرمجية الخاصة بك، قم بإجراء فحوصات الأداء والدقة لنماذجك، خاصة إذا كنت تستخدم إصدارات TensorFlow Lite أقدم من الإصدار 2.1، بحيث يكون لديك خط أساس للمقارنة مع التنفيذ الجديد.
  3. إذا قمت بترحيل جميع التعليمات البرمجية الخاصة بك لاستخدام واجهة برمجة تطبيقات خدمات Play لـ TensorFlow Lite، فيجب عليك إزالة تبعيات مكتبة وقت تشغيل TensorFlow Lite الحالية (الإدخالات مع org.tensorflow: tensorflow-lite :* ) من ملف build.gradle الخاص بك حتى تتمكن من يمكن أن تقلل من حجم التطبيق الخاص بك.
  4. حدد كافة تكرارات إنشاء كائن new Interpreter في التعليمات البرمجية الخاصة بك، وقم بتعديل كل تكرار بحيث يستخدم استدعاء InterpreterApi.create() . إن TfLite.initialize الجديد غير متزامن، مما يعني أنه في معظم الحالات ليس بديلاً مباشرًا: يجب عليك تسجيل مستمع عند اكتمال المكالمة. ارجع إلى مقتطف الكود في كود الخطوة 3 .
  5. إضافة import org.tensorflow.lite.InterpreterApi; import org.tensorflow.lite.InterpreterApi.Options.TfLiteRuntime; إلى أي ملفات مصدر باستخدام فئات org.tensorflow.lite.Interpreter أو org.tensorflow.lite.InterpreterApi .
  6. إذا كان أي من الاستدعاءات الناتجة إلى InterpreterApi.create() تحتوي على وسيطة واحدة فقط، فقم بإلحاق new InterpreterApi.Options() بقائمة الوسائط.
  7. ألحق .setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY) بالوسيطة الأخيرة لأي استدعاءات لـ InterpreterApi.create() .
  8. استبدل كافة التكرارات الأخرى للفئة org.tensorflow.lite.Interpreter بـ org.tensorflow.lite.InterpreterApi .

إذا كنت تريد استخدام TensorFlow Lite المستقل وواجهة برمجة التطبيقات لخدمات Play جنبًا إلى جنب، فيجب عليك استخدام TensorFlow Lite 2.9 (أو الأحدث). TensorFlow Lite 2.8 والإصدارات السابقة غير متوافقة مع إصدار Play Services API.