TensorFlow Lite در سرویس‌های Google Play Java API

TensorFlow Lite در سرویس‌های Google Play علاوه بر Native API با استفاده از Java API نیز قابل دسترسی است. به طور خاص، TensorFlow Lite در خدمات Google Play از طریق TensorFlow Lite Task API و TensorFlow Lite Interpreter API در دسترس است. Task Library رابط‌های مدل خارج از جعبه بهینه‌سازی شده را برای وظایف رایج یادگیری ماشین با استفاده از داده‌های بصری، صوتی و متنی ارائه می‌کند. TensorFlow Lite Interpreter API که توسط TensorFlow Runtime ارائه شده است، رابط کاربری عمومی تری را برای ساخت و اجرای مدل های ML فراهم می کند.

بخش‌های زیر دستورالعمل‌هایی درباره نحوه استفاده از Interpreter و Task Library API با TensorFlow Lite در خدمات Google Play ارائه می‌دهند. در حالی که ممکن است یک برنامه از هر دو APIهای Interpreter و Task Library استفاده کند، اکثر برنامه‌ها فقط باید از یک مجموعه API استفاده کنند.

استفاده از Task Library API

API TensorFlow Lite Task API Interpreter را می‌پیچد و یک رابط برنامه‌نویسی سطح بالا برای کارهای رایج یادگیری ماشینی که از داده‌های بصری، صوتی و متنی استفاده می‌کنند، فراهم می‌کند. اگر برنامه شما به یکی از وظایف پشتیبانی شده نیاز دارد، باید از Task API استفاده کنید.

1. وابستگی های پروژه را اضافه کنید

وابستگی پروژه شما به مورد استفاده از یادگیری ماشین شما بستگی دارد. Task API ها شامل کتابخانه های زیر هستند:

  • کتابخانه ویژن: org.tensorflow:tensorflow-lite-task-vision-play-services
  • کتابخانه صوتی: org.tensorflow:tensorflow-lite-task-audio-play-services
  • کتابخانه متن: org.tensorflow:tensorflow-lite-task-text-play-services

یکی از وابستگی ها را به کد پروژه برنامه خود اضافه کنید تا به API خدمات Play برای TensorFlow Lite دسترسی داشته باشید. به عنوان مثال، از موارد زیر برای اجرای یک کار چشم انداز استفاده کنید:

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

2. مقداردهی اولیه TensorFlow Lite را اضافه کنید

قبل از استفاده از API های TensorFlow Lite، مؤلفه TensorFlow Lite را در API خدمات Google Play راه اندازی کنید. مثال زیر کتابخانه vision را مقداردهی اولیه می کند:

کاتلین

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 API

APIهای Interpreter کنترل و انعطاف بیشتری نسبت به APIهای Task Library ارائه می دهند. اگر وظیفه یادگیری ماشین شما توسط کتابخانه Task پشتیبانی نمی شود، یا اگر به یک رابط کاربری عمومی تری برای ساخت و اجرای مدل های ML نیاز دارید، باید از API های مترجم استفاده کنید.

1. وابستگی های پروژه را اضافه کنید

برای دسترسی به API خدمات Play برای 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 را اضافه کنید

قبل از استفاده از API های TensorFlow Lite، مؤلفه TensorFlow Lite را در API خدمات Google Play راه اندازی کنید:

کاتلین

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()));
  });

شما باید از پیاده سازی بالا استفاده کنید زیرا از مسدود کردن رشته رابط کاربری اندروید جلوگیری می کند. اگر نیاز به مدیریت دقیق‌تر اجرای رشته دارید، می‌توانید یک فراخوانی 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 به شما امکان می دهد با استفاده از پردازنده های سخت افزاری تخصصی، مانند واحدهای پردازش گرافیکی (GPU) عملکرد مدل خود را تسریع بخشید. شما می توانید با استفاده از درایورهای سخت افزاری به نام delegates از این پردازنده های تخصصی بهره ببرید. می‌توانید از نمایندگان شتاب سخت‌افزار زیر با TensorFlow Lite در خدمات Google Play استفاده کنید:

  • نماینده GPU (توصیه می‌شود) - این نماینده از طریق سرویس‌های Google Play ارائه می‌شود و به صورت پویا بارگیری می‌شود، درست مانند نسخه‌های خدمات Play Task API و Interpreter API.

  • نماینده NNAPI - این نماینده به عنوان یک وابستگی کتابخانه گنجانده شده در پروژه توسعه Android شما موجود است و در برنامه شما همراه است.

برای اطلاعات بیشتر در مورد شتاب سخت افزاری با TensorFlow Lite، به صفحه TensorFlow Lite Delegates مراجعه کنید.

بررسی سازگاری دستگاه

همه دستگاه ها از شتاب سخت افزاری GPU با TFLite پشتیبانی نمی کنند. به منظور کاهش خطاها و خرابی‌های احتمالی، از روش TfLiteGpu.isGpuDelegateAvailable برای بررسی سازگاری دستگاه با نماینده GPU استفاده کنید.

از این روش برای تأیید سازگاری دستگاه با GPU استفاده کنید و از CPU یا نماینده NNAPI به عنوان جایگزین برای زمانی که GPU پشتیبانی نمی شود استفاده کنید.

useGpuTask = TfLiteGpu.isGpuDelegateAvailable(context)

هنگامی که متغیری مانند useGpuTask دارید، می توانید از آن برای تعیین اینکه آیا دستگاه ها از نماینده GPU استفاده می کنند یا خیر استفاده کنید. مثال‌های زیر نشان می‌دهند که چگونه می‌توان این کار را با Task Library و Interpreter API انجام داد.

با Task 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 با APIهای Task Library

برای استفاده از نماینده GPU با Task API:

  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. با BaseOptions گزینه GPU delegate را فعال کنید:

    کاتلین

        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 با Interpreter API

برای استفاده از نماینده GPU با Interpreter API:

  1. برای استفاده از نماینده GPU از خدمات Play، وابستگی های پروژه را به روز کنید:

    implementation 'com.google.android.gms:play-services-tflite-gpu:16.1.0'
    
  2. گزینه GPU delegate را در مقداردهی اولیه TFlite فعال کنید:

    کاتلین

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

    جاوا

        TfLite.initialize(context,
          TfLiteInitializationOptions.builder()
           .setEnableGpuDelegateSupport(true)
           .build());
        
  3. فعال کردن نماینده GPU در گزینه های مفسر: با فراخوانی addDelegateFactory() within InterpreterApi.Options()` کارخانه delegate را روی GpuDelegateFactory تنظیم کنید:

    کاتلین

        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 مستقل به API خدمات Play منتقل کنید، دستورالعمل‌های اضافی زیر را برای به‌روزرسانی کد پروژه برنامه خود مرور کنید:

  1. بخش محدودیت‌ها را در این صفحه مرور کنید تا مطمئن شوید که مورد استفاده شما پشتیبانی می‌شود.
  2. قبل از به‌روزرسانی کد خود، بررسی‌های عملکرد و دقت مدل‌های خود را انجام دهید، به‌ویژه اگر از نسخه‌های TensorFlow Lite زودتر از نسخه ۲.۱ استفاده می‌کنید، بنابراین یک خط پایه برای مقایسه با اجرای جدید دارید.
  3. اگر تمام کد خود را برای استفاده از API خدمات 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 مستقل و API خدمات Play در کنار هم استفاده کنید، باید از TensorFlow Lite 2.9 (یا جدیدتر) استفاده کنید. TensorFlow Lite 2.8 و نسخه های قبلی با نسخه API خدمات Play سازگار نیستند.