TensorFlow Lite di Java API layanan Google Play

TensorFlow Lite di layanan Google Play juga dapat diakses menggunakan Java API, selain Native API. Secara khusus, TensorFlow Lite di layanan Google Play tersedia melalui TensorFlow Lite Interpreter API.

Menggunakan Interpreter API

TensorFlow Lite Interpreter API, yang disediakan oleh runtime TensorFlow, menyediakan antarmuka serbaguna untuk membangun dan menjalankan model ML. Gunakan langkah-langkah berikut untuk menjalankan inferensi dengan Interpreter API menggunakan TensorFlow Lite di runtime layanan Google Play.

1. Menambahkan dependensi project

Tambahkan dependensi berikut ke kode project aplikasi Anda untuk mengakses Play Services API untuk 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. Menambahkan inisialisasi TensorFlow Lite

Lakukan inisialisasi komponen TensorFlow Lite dari API layanan Google Play sebelum menggunakan TensorFlow Lite API:

Kotlin

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

Java

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

3. Membuat Penerjemah dan menetapkan opsi runtime

Buat penafsir menggunakan InterpreterApi.create() dan konfigurasikan untuk menggunakan runtime layanan Google Play, dengan memanggil InterpreterApi.Options.setRuntime(), seperti yang ditunjukkan pada kode contoh berikut:

Kotlin

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

Java

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

Anda harus menggunakan implementasi di atas karena akan menghindari pemblokiran thread antarmuka pengguna Android. Jika perlu mengelola eksekusi thread dengan lebih cermat, Anda dapat menambahkan panggilan Tasks.await() ke pembuatan penafsir:

Kotlin

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

Java

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

4. Menjalankan inferensi

Dengan menggunakan objek interpreter yang Anda buat, panggil metode run() untuk menghasilkan inferensi.

Kotlin

interpreter.run(inputBuffer, outputBuffer)

Java

interpreter.run(inputBuffer, outputBuffer);

Akselerasi hardware

TensorFlow Lite memungkinkan Anda mempercepat performa model menggunakan prosesor hardware khusus, seperti unit pemrosesan grafis (GPU). Anda dapat memanfaatkan prosesor khusus ini menggunakan driver hardware yang disebut delegasi.

Delegasi GPU disediakan melalui layanan Google Play dan dimuat secara dinamis, seperti versi layanan Play dari Interpreter API.

Memeriksa kompatibilitas perangkat

Tidak semua perangkat mendukung akselerasi hardware GPU dengan TFLite. Untuk mengurangi error dan potensi error, gunakan metode TfLiteGpu.isGpuDelegateAvailable untuk memeriksa apakah perangkat kompatibel dengan delegasi GPU.

Gunakan metode ini untuk mengonfirmasi apakah perangkat kompatibel dengan GPU, dan menggunakan CPU sebagai penggantian saat GPU tidak didukung.

useGpuTask = TfLiteGpu.isGpuDelegateAvailable(context)

Setelah memiliki variabel seperti useGpuTask, Anda dapat menggunakannya untuk menentukan apakah perangkat menggunakan delegasi GPU atau tidak.

Kotlin

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

Java

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 dengan Interpreter API

Untuk menggunakan delegasi GPU dengan Interpreter API:

  1. Update dependensi project untuk menggunakan delegasi GPU dari layanan Play:

    implementation 'com.google.android.gms:play-services-tflite-gpu:16.1.0'
    
  2. Aktifkan opsi delegasi GPU dalam inisialisasi TFlite:

    Kotlin

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

    Java

        TfLite.initialize(context,
          TfLiteInitializationOptions.builder()
           .setEnableGpuDelegateSupport(true)
           .build());
        
  3. Aktifkan delegasi GPU dalam opsi penafsir: tetapkan factory delegasi ke GpuDelegateFactory dengan memanggil addDelegateFactory() withinInterpreterApi.Options()`:

    Kotlin

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

    Java

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

Bermigrasi dari TensorFlow Lite yang berdiri sendiri

Jika Anda berencana memigrasikan aplikasi dari TensorFlow Lite mandiri ke API layanan Play, tinjau panduan tambahan berikut untuk memperbarui kode project aplikasi Anda:

  1. Tinjau bagian Batasan di halaman ini untuk memastikan kasus penggunaan Anda didukung.
  2. Sebelum memperbarui kode, lakukan pemeriksaan performa dan akurasi untuk model Anda, terutama jika menggunakan versi TensorFlow Lite yang lebih awal dari versi 2.1, sehingga Anda memiliki dasar pengukuran untuk dibandingkan dengan implementasi baru.
  3. Jika telah memigrasikan semua kode agar dapat menggunakan Play Services API untuk TensorFlow Lite, Anda harus menghapus dependensi library runtime TensorFlow Lite yang ada (entri dengan org.tensorflow:tensorflow-lite:*) dari file build.gradle agar Anda dapat mengurangi ukuran aplikasi.
  4. Identifikasi semua kemunculan objek new Interpreter dalam kode Anda, dan ubah setiap kemunculannya sehingga menggunakan panggilan InterpreterApi.create(). TfLite.initialize baru bersifat asinkron, yang berarti dalam sebagian besar kasus, ini bukan pengganti drop-in: Anda harus mendaftarkan pemroses saat panggilan selesai. Lihat cuplikan kode di kode Langkah 3.
  5. Menambahkan import org.tensorflow.lite.InterpreterApi; dan import org.tensorflow.lite.InterpreterApi.Options.TfLiteRuntime; ke file sumber apa pun menggunakan class org.tensorflow.lite.Interpreter atau org.tensorflow.lite.InterpreterApi.
  6. Jika salah satu panggilan yang dihasilkan ke InterpreterApi.create() hanya memiliki satu argumen, tambahkan new InterpreterApi.Options() ke daftar argumen.
  7. Tambahkan .setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY) ke argumen terakhir dari panggilan apa pun ke InterpreterApi.create().
  8. Ganti semua kemunculan lain dari class org.tensorflow.lite.Interpreter dengan org.tensorflow.lite.InterpreterApi.

Jika ingin menggunakan TensorFlow Lite mandiri dan API layanan Play secara berdampingan, Anda harus menggunakan TensorFlow Lite 2.9 (atau yang lebih baru). TensorFlow Lite 2.8 dan versi yang lebih lama tidak kompatibel dengan versi API layanan Play.