Google Play hizmetleri Java API'sinde TensorFlow Lite

Google Play hizmetlerinde TensorFlow Lite'a Native API'nin yanı sıra Java API'leri kullanılarak da erişilebilir. Özellikle, Google Play hizmetlerinde TensorFlow Lite , TensorFlow Lite Görev API'si ve TensorFlow Lite Interpreter API aracılığıyla edinilebilir. Görev Kitaplığı, görsel, işitsel ve metin verilerini kullanan yaygın makine öğrenimi görevleri için optimize edilmiş, kullanıma hazır model arayüzleri sağlar. TensorFlow çalışma zamanı tarafından sağlanan TensorFlow Lite Interpreter API, ML modellerini oluşturmak ve çalıştırmak için daha genel amaçlı bir arayüz sağlar.

Aşağıdaki bölümlerde, Google Play hizmetlerinde Tercüman ve Görev Kitaplığı API'lerinin TensorFlow Lite ile nasıl kullanılacağına ilişkin talimatlar verilmektedir. Bir uygulamanın hem Yorumlayıcı API'lerini hem de Görev Kitaplığı API'lerini kullanması mümkün olsa da çoğu uygulama yalnızca bir API kümesi kullanmalıdır.

Görev Kitaplığı API'lerini kullanma

TensorFlow Lite Görev API'si, Interpreter API'yi sarar ve görsel, işitsel ve metin verilerini kullanan yaygın makine öğrenimi görevleri için üst düzey bir programlama arayüzü sağlar. Uygulamanız desteklenen görevlerden birini gerektiriyorsa Görev API'sini kullanmalısınız.

1. Proje bağımlılıklarını ekleyin

Proje bağımlılığınız makine öğrenimi kullanım senaryonuza bağlıdır. Görev API'leri aşağıdaki kitaplıkları içerir:

  • Görüntü kitaplığı: org.tensorflow:tensorflow-lite-task-vision-play-services
  • Ses kitaplığı: org.tensorflow:tensorflow-lite-task-audio-play-services
  • Metin kitaplığı: org.tensorflow:tensorflow-lite-task-text-play-services

TensorFlow Lite için Play hizmetleri API'sine erişmek için bağımlılıklardan birini uygulama proje kodunuza ekleyin. Örneğin, bir vizyon görevini uygulamak için aşağıdakileri kullanın:

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

2. TensorFlow Lite'ın başlatılmasını ekleyin

TensorFlow Lite API'lerini kullanmadan önce Google Play hizmetleri API'sinin TensorFlow Lite bileşenini başlatın. Aşağıdaki örnek vizyon kitaplığını başlatır:

Kotlin

init {
  TfLiteVision.initialize(context)
}

3. Çıkarımları çalıştırın

TensorFlow Lite bileşenini başlattıktan sonra çıkarımlar oluşturmak için detect() yöntemini çağırın. detect() yöntemindeki tam kod, kitaplığa ve kullanım durumuna göre değişir. Aşağıdakiler, TfLiteVision kitaplığıyla basit bir nesne algılama kullanım durumu içindir:

Kotlin

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

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

  ...

}

Veri formatına bağlı olarak, çıkarımlar oluşturmadan önce detect() yöntemi dahilinde verilerinizi ön işlemeniz ve dönüştürmeniz de gerekebilir. Örneğin, bir nesne dedektörünün görüntü verileri aşağıdakileri gerektirir:

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

Tercüman API'lerini kullanma

Yorumlayıcı API'leri, Görev Kitaplığı API'lerine göre daha fazla kontrol ve esneklik sunar. Makine öğrenimi göreviniz Görev kitaplığı tarafından desteklenmiyorsa veya ML modelleri oluşturmak ve çalıştırmak için daha genel amaçlı bir arayüze ihtiyacınız varsa Yorumlayıcı API'lerini kullanmalısınız.

1. Proje bağımlılıklarını ekleyin

TensorFlow Lite için Play hizmetleri API'sine erişmek üzere uygulama proje kodunuza aşağıdaki bağımlılıkları ekleyin:

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'ın başlatılmasını ekleyin

TensorFlow Lite API'lerini kullanmadan önce Google Play hizmetleri API'sinin TensorFlow Lite bileşenini başlatın:

Kotlin

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

Java

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

3. Bir Tercüman oluşturun ve çalışma zamanı seçeneğini ayarlayın

InterpreterApi.create() kullanarak bir tercüman oluşturun ve aşağıdaki örnek kodda gösterildiği gibi InterpreterApi.Options.setRuntime() öğesini çağırarak bunu Google Play hizmetleri çalışma zamanını kullanacak şekilde yapılandırın:

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

Yukarıdaki uygulamayı kullanmalısınız çünkü Android kullanıcı arayüzü iş parçacığının engellenmesini önler. İş parçacığı yürütmeyi daha yakından yönetmeniz gerekiyorsa, yorumlayıcı oluşturmaya bir Tasks.await() çağrısı ekleyebilirsiniz:

Kotlin

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

Java

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

4. Çıkarımları çalıştırın

Oluşturduğunuz interpreter nesneyi kullanarak bir çıkarım oluşturmak için run() yöntemini çağırın.

Kotlin

interpreter.run(inputBuffer, outputBuffer)

Java

interpreter.run(inputBuffer, outputBuffer);

Donanım ivmesi

TensorFlow Lite, grafik işlem birimleri (GPU'lar) gibi özel donanım işlemcilerini kullanarak modelinizin performansını artırmanıza olanak tanır. Temsilci adı verilen donanım sürücülerini kullanarak bu özel işlemcilerden yararlanabilirsiniz. Google Play hizmetlerinde TensorFlow Lite ile aşağıdaki donanım hızlandırma temsilcilerini kullanabilirsiniz:

  • GPU temsilcisi (önerilir) - Bu temsilci, Google Play hizmetleri aracılığıyla sağlanır ve tıpkı Görev API'sinin ve Yorumlayıcı API'sinin Play hizmetleri sürümleri gibi dinamik olarak yüklenir.

  • NNAPI temsilcisi - Bu temsilci, Android geliştirme projenize dahil edilen bir kitaplık bağımlılığı olarak mevcuttur ve uygulamanızda paketlenir.

TensorFlow Lite ile donanım hızlandırma hakkında daha fazla bilgi için TensorFlow Lite Temsilcileri sayfasına bakın.

Cihaz uyumluluğunu kontrol etme

Tüm cihazlar TFLite ile GPU donanım hızlandırmayı desteklemez. Hataları ve olası çökmeleri azaltmak amacıyla bir cihazın GPU temsilcisiyle uyumlu olup olmadığını kontrol etmek için TfLiteGpu.isGpuDelegateAvailable yöntemini kullanın.

Bir aygıtın GPU ile uyumlu olup olmadığını doğrulamak için bu yöntemi kullanın ve GPU'nun desteklenmediği durumlarda geri dönüş olarak CPU'yu veya NNAPI temsilcisini kullanın.

useGpuTask = TfLiteGpu.isGpuDelegateAvailable(context)

useGpuTask gibi bir değişkene sahip olduğunuzda, bunu cihazların GPU temsilcisini kullanıp kullanmadığını belirlemek için kullanabilirsiniz. Aşağıdaki örneklerde bunun hem Görev Kitaplığı hem de Yorumlayıcı API'leri ile nasıl yapılabileceği gösterilmektedir.

Görev API'si ile

Kotlin

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

Java

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

Tercüman API'si ile

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

Görev Kitaplığı API'lerine sahip GPU

GPU temsilcisini Görev API'leriyle kullanmak için:

  1. Play hizmetlerinden GPU temsilcisini kullanmak için proje bağımlılıklarını güncelleyin:

    implementation 'com.google.android.gms:play-services-tflite-gpu:16.1.0'
    
  2. GPU temsilcisini setEnableGpuDelegateSupport ile başlatın. Örneğin, TfLiteVision için GPU temsilcisini aşağıdakilerle başlatabilirsiniz:

    Kotlin

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

    Java

        TfLiteVision.initialize(context, TfLiteInitializationOptions.builder().setEnableGpuDelegateSupport(true).build());
        
  3. BaseOptions ile GPU temsilci seçeneğini etkinleştirin:

    Kotlin

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

    Java

        BaseOptions baseOptions = BaseOptions.builder().useGpu().build();
        
  4. Seçenekleri .setBaseOptions kullanarak yapılandırın. Örneğin, ObjectDetector GPU'yu aşağıdakilerle ayarlayabilirsiniz:

    Kotlin

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

    Java

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

Tercüman API'lerine sahip GPU

GPU temsilcisini Yorumlayıcı API'leriyle kullanmak için:

  1. Play hizmetlerinden GPU temsilcisini kullanmak için proje bağımlılıklarını güncelleyin:

    implementation 'com.google.android.gms:play-services-tflite-gpu:16.1.0'
    
  2. TFlite başlatma işleminde GPU temsilci seçeneğini etkinleştirin:

    Kotlin

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

    Java

        TfLite.initialize(context,
          TfLiteInitializationOptions.builder()
           .setEnableGpuDelegateSupport(true)
           .build());
        
  3. Yorumlayıcı seçeneklerinde GPU temsilcisini etkinleştirin: InterpreterApi.Options()` addDelegateFactory() within çağırarak temsilci fabrikasını GpuDelegateFactory olarak ayarlayın:

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

Bağımsız TensorFlow Lite'tan geçiş

Uygulamanızı bağımsız TensorFlow Lite'tan Play hizmetleri API'sine taşımayı planlıyorsanız uygulama proje kodunuzu güncellemeye yönelik aşağıdaki ek kılavuzu inceleyin:

  1. Kullanım senaryonuzun desteklendiğinden emin olmak için bu sayfanın Sınırlamalar bölümünü inceleyin.
  2. Kodunuzu güncellemeden önce, özellikle TensorFlow Lite'ın sürüm 2.1'den önceki sürümlerini kullanıyorsanız, modelleriniz için performans ve doğruluk kontrolleri yapın, böylece yeni uygulamayla karşılaştırabileceğiniz bir temele sahip olursunuz.
  3. TensorFlow Lite için Play hizmetleri API'sini kullanmak üzere kodunuzun tamamını taşıdıysanız, mevcut TensorFlow Lite çalışma zamanı kitaplığı bağımlılıklarını ( org.tensorflow: tensorflow-lite :* içeren girişler) build.gradle dosyanızdan kaldırmalısınız. uygulamanızın boyutunu küçültebilir.
  4. Kodunuzda new Interpreter nesnesi oluşturmanın tüm oluşumlarını tanımlayın ve her birini InterpreterApi.create() çağrısını kullanacak şekilde değiştirin. Yeni TfLite.initialize eşzamansızdır; bu, çoğu durumda bunun hemen değiştirilemeyeceği anlamına gelir: çağrı tamamlandığında bir dinleyici kaydetmeniz gerekir. 3. Adım kodundaki kod pasajına bakın.
  5. import org.tensorflow.lite.InterpreterApi; ve import org.tensorflow.lite.InterpreterApi.Options.TfLiteRuntime; org.tensorflow.lite.Interpreter veya org.tensorflow.lite.InterpreterApi sınıflarını kullanarak herhangi bir kaynak dosyaya.
  6. Sonuçta InterpreterApi.create() çağrısından herhangi birinin yalnızca tek bir argümanı varsa, argüman listesine new InterpreterApi.Options() ekleyin.
  7. InterpreterApi.create() çağrısının son argümanına .setRuntime(TfLiteRuntime.FROM_SYSTEM_ONLY) ekleyin.
  8. org.tensorflow.lite.Interpreter sınıfının diğer tüm oluşumlarını org.tensorflow.lite.InterpreterApi ile değiştirin.

Bağımsız TensorFlow Lite ile Play hizmetleri API'sini yan yana kullanmak istiyorsanız TensorFlow Lite 2.9 (veya üzeri) kullanmanız gerekir. TensorFlow Lite 2.8 ve önceki sürümleri, Play hizmetleri API sürümüyle uyumlu değildir.