Android'de özel TensorFlow Lite modeli kullanma

Uygulamanızda TensorFlow Basit modeller kullanıyorsanız modellerinizi dağıtmak için Firebase ML kullanabilirsiniz. Ölçüt Firebase ile modelleri dağıttığınızda, uygulamanızın başlangıçtaki indirme boyutunu uygulamanızı ve uygulamanızın makine öğrenimi modellerini en iyi şekilde yararlanabilirsiniz. Ayrıca Remote Config ve A/B Testing ile, reklamlarınızı farklı kullanıcı gruplarına farklı modeller sunar.

TensorFlow Lite modelleri

TensorFlow Lite modelleri, mobil cihazlarda çalışmak için optimize edilmiş makine öğrenimi modelleridir cihazlar. TensorFlow Lite modeli edinmek için:

Başlamadan önce

  1. Henüz yapmadıysanız Firebase'i Android projenize ekleyin.
  2. Modül (uygulama düzeyinde) Gradle dosyanızda (genellikle <project>/<app-module>/build.gradle.kts veya <project>/<app-module>/build.gradle), Android için Firebase ML model indirme aracı kitaplığının bağımlılığını ekleyin. Şunu kullanmanızı öneririz: Firebase Android BoM Kitaplık'ta sürüm oluşturmayı kontrol etmek için

    Ayrıca, Firebase ML model indirme aracını kurmanın bir parçası olarak TensorFlow Lite SDK'sını uygulamanıza ekleyin.

    dependencies {
        // Import the BoM for the Firebase platform
        implementation(platform("com.google.firebase:firebase-bom:33.5.1"))
    
        // Add the dependency for the Firebase ML model downloader library
        // When using the BoM, you don't specify versions in Firebase library dependencies
        implementation("com.google.firebase:firebase-ml-modeldownloader")
    // Also add the dependency for the TensorFlow Lite library and specify its version implementation("org.tensorflow:tensorflow-lite:2.3.0")
    }

    Firebase Android BoM kullanıldığında, Uygulamanız her zaman Firebase Android kitaplıklarının uyumlu sürümlerini kullanacaktır.

    (Alternatif) Firebase kitaplığı bağımlılıklarını kullanmadanBoM

    Firebase BoM kullanmamayı seçerseniz her Firebase kitaplığı sürümünü belirtmeniz gerekir değerini alır.

    Uygulamanızda birden çok Firebase kitaplığı kullanıyorsanız, kitaplık sürümlerini yönetmek için BoM kullanmanızı öneririz. Bu, tüm sürümlerin uyumlu olduğundan emin olun.

    dependencies {
        // Add the dependency for the Firebase ML model downloader library
        // When NOT using the BoM, you must specify versions in Firebase library dependencies
        implementation("com.google.firebase:firebase-ml-modeldownloader:25.0.1")
    // Also add the dependency for the TensorFlow Lite library and specify its version implementation("org.tensorflow:tensorflow-lite:2.3.0")
    }
    Kotlin'e özel bir kitaplık modülü mü arıyorsunuz? Başlamak için kalan süre: Ekim 2023 (Firebase BoM 32.5.0), hem Kotlin hem de Java geliştiricileri (ayrıntılar için bkz. Bu girişimle ilgili SSS).
  3. Uygulamanızın manifest dosyasında, INTERNET izninin gerekli olduğunu beyan edin:
    <uses-permission android:name="android.permission.INTERNET" />

1. Modelinizi dağıtma

Özel TensorFlow modellerinizi Firebase konsolunu ya da Firebase Admin Python ve Node.js SDK'ları. Görüntüleyin Özel modelleri dağıtın ve yönetin.

Firebase projenize özel model ekledikten sonra, modeliniz olmalıdır. İstediğiniz zaman dağıtabilirsiniz yeni bir TensorFlow Lite modeli kullanıyor ve yeni modeli kullanıcıların cihazları getModel() aranıyor (aşağıya bakın).

2. Modeli cihaza indirin ve TensorFlow Lite çevirmenini başlatın

Uygulamanızda TensorFlow Lite modelinizi kullanmak için önce Firebase ML SDK'sını kullanın modelin en son sürümünü cihaza indirin. Ardından, Modelle birlikte TensorFlow Lite çevirmeni.

Model indirme işlemini başlatmak için model indirme aracının getModel() yöntemini çağırın. ister modelinizi isterken, modeli yüklerken atadığınız adı, almak istediğiniz her zaman en son modeli ve bu modele indirmeye izin vermek istiyorsunuz.

Üç indirme davranışı arasından seçim yapabilirsiniz:

İndirme türü Açıklama
YEREL_MODEL Cihazdan yerel modeli alın. Yerel model yoksa LATEST_MODEL gibi davranır. Bunu kullan ilginizi çekmiyorsa indirme türü model güncellemeleri kontrol ediliyor. Örneğin, geri almak için Remote Config’i ve modelleri her zaman (önerilir).
LOCAL_MODEL_UPDATE_IN_BACKGROUND Cihazdan yerel modeli alın ve modeli arka planda güncellemeye başlayın. Yerel model yoksa LATEST_MODEL gibi davranır.
SON_MODEL En son modeli edinin. Yerel model en son sürüm, yerel modeli. Aksi durumda en yeni modeli. Bu davranış, en son sürüm indirildiğinde (yalnızca önerilir). Bu davranışı yalnızca sahip olmanız gereken en güncel sürümünü değil.

Modelle ilgili işlevleri (ör. devre dışı bırakma veya devre dışı bırakma) kullanıcı arayüzünüzün bir kısmını gizleyin (modelin indirildiğini onaylayana kadar).

Kotlin+KTX

val conditions = CustomModelDownloadConditions.Builder()
        .requireWifi()  // Also possible: .requireCharging() and .requireDeviceIdle()
        .build()
FirebaseModelDownloader.getInstance()
        .getModel("your_model", DownloadType.LOCAL_MODEL_UPDATE_IN_BACKGROUND,
            conditions)
        .addOnSuccessListener { model: CustomModel? ->
            // Download complete. Depending on your app, you could enable the ML
            // feature, or switch from the local model to the remote model, etc.

            // The CustomModel object contains the local path of the model file,
            // which you can use to instantiate a TensorFlow Lite interpreter.
            val modelFile = model?.file
            if (modelFile != null) {
                interpreter = Interpreter(modelFile)
            }
        }

Java

CustomModelDownloadConditions conditions = new CustomModelDownloadConditions.Builder()
    .requireWifi()  // Also possible: .requireCharging() and .requireDeviceIdle()
    .build();
FirebaseModelDownloader.getInstance()
    .getModel("your_model", DownloadType.LOCAL_MODEL_UPDATE_IN_BACKGROUND, conditions)
    .addOnSuccessListener(new OnSuccessListener<CustomModel>() {
      @Override
      public void onSuccess(CustomModel model) {
        // Download complete. Depending on your app, you could enable the ML
        // feature, or switch from the local model to the remote model, etc.

        // The CustomModel object contains the local path of the model file,
        // which you can use to instantiate a TensorFlow Lite interpreter.
        File modelFile = model.getFile();
        if (modelFile != null) {
            interpreter = new Interpreter(modelFile);
        }
      }
    });

Birçok uygulama, indirme görevini başlatma kodunda başlatır ancak Bu nedenle, herhangi bir noktada modeli kullanmanız gerekir.

3. Giriş verilerinde çıkarım yap

Modelinizin giriş ve çıkış şekillerini alın

TensorFlow Lite model yorumlayıcısı girdi olarak alır ve çıktı olarak üretir çok boyutlu diziyi inceleyebilirsiniz. Bu diziler byte, int, long veya float değerler. Bir modele veri iletmeden veya sonucunu kullanmadan önce şunları bilmeniz gerekir: modelinizin kullandığı dizilerin sayısı ve boyutları ("şekil")

Modeli kendiniz oluşturduysanız veya modelin giriş ve çıkış biçimi veya dokümanlara aşina değilseniz bu bilgilere zaten sahip olabilirsiniz. şeklini ve veri türünü öğrenmek için Modelinizi incelemek için TensorFlow Lite yorumlayıcısı. Örneğin:

Python

import tensorflow as tf

interpreter = tf.lite.Interpreter(model_path="your_model.tflite")
interpreter.allocate_tensors()

# Print input shape and type
inputs = interpreter.get_input_details()
print('{} input(s):'.format(len(inputs)))
for i in range(0, len(inputs)):
    print('{} {}'.format(inputs[i]['shape'], inputs[i]['dtype']))

# Print output shape and type
outputs = interpreter.get_output_details()
print('\n{} output(s):'.format(len(outputs)))
for i in range(0, len(outputs)):
    print('{} {}'.format(outputs[i]['shape'], outputs[i]['dtype']))

Örnek çıkış:

1 input(s):
[  1 224 224   3] <class 'numpy.float32'>

1 output(s):
[1 1000] <class 'numpy.float32'>

Çevirmeni çalıştırma

Modelinizin giriş ve çıkışının biçimini belirledikten sonra ve gerekli tüm veriler üzerinde dönüşüm gerçekleştirebilirsiniz. modeliniz için doğru şekli sağlayan bir giriştir.

Örneğin, giriş şekli [1 224 224 3] kayan nokta değeri varsa giriş oluşturabilirsiniz ByteBuffer aşağıdaki örnekte gösterildiği gibi bir Bitmap nesnesinden:

Kotlin+KTX

val bitmap = Bitmap.createScaledBitmap(yourInputImage, 224, 224, true)
val input = ByteBuffer.allocateDirect(224*224*3*4).order(ByteOrder.nativeOrder())
for (y in 0 until 224) {
    for (x in 0 until 224) {
        val px = bitmap.getPixel(x, y)

        // Get channel values from the pixel value.
        val r = Color.red(px)
        val g = Color.green(px)
        val b = Color.blue(px)

        // Normalize channel values to [-1.0, 1.0]. This requirement depends on the model.
        // For example, some models might require values to be normalized to the range
        // [0.0, 1.0] instead.
        val rf = (r - 127) / 255f
        val gf = (g - 127) / 255f
        val bf = (b - 127) / 255f

        input.putFloat(rf)
        input.putFloat(gf)
        input.putFloat(bf)
    }
}

Java

Bitmap bitmap = Bitmap.createScaledBitmap(yourInputImage, 224, 224, true);
ByteBuffer input = ByteBuffer.allocateDirect(224 * 224 * 3 * 4).order(ByteOrder.nativeOrder());
for (int y = 0; y < 224; y++) {
    for (int x = 0; x < 224; x++) {
        int px = bitmap.getPixel(x, y);

        // Get channel values from the pixel value.
        int r = Color.red(px);
        int g = Color.green(px);
        int b = Color.blue(px);

        // Normalize channel values to [-1.0, 1.0]. This requirement depends
        // on the model. For example, some models might require values to be
        // normalized to the range [0.0, 1.0] instead.
        float rf = (r - 127) / 255.0f;
        float gf = (g - 127) / 255.0f;
        float bf = (b - 127) / 255.0f;

        input.putFloat(rf);
        input.putFloat(gf);
        input.putFloat(bf);
    }
}

Ardından, modelin çıkışını içerecek kadar büyük bir ByteBuffer ve giriş arabelleğini ve çıkış arabelleğini TensorFlow Lite yorumlayıcısının run() yöntemini çağırın. Örneğin, [1 1000] kayan nokta şeklinde bir çıktı şekli için değerleri:

Kotlin+KTX

val bufferSize = 1000 * java.lang.Float.SIZE / java.lang.Byte.SIZE
val modelOutput = ByteBuffer.allocateDirect(bufferSize).order(ByteOrder.nativeOrder())
interpreter?.run(input, modelOutput)

Java

int bufferSize = 1000 * java.lang.Float.SIZE / java.lang.Byte.SIZE;
ByteBuffer modelOutput = ByteBuffer.allocateDirect(bufferSize).order(ByteOrder.nativeOrder());
interpreter.run(input, modelOutput);

Sonucu nasıl kullanacağınız, kullandığınız modele bağlıdır.

Örneğin, sınıflandırma yapıyorsanız, bir sonraki adım olarak sonuç dizinlerini, temsil ettikleri etiketlerle eşler:

Kotlin+KTX

modelOutput.rewind()
val probabilities = modelOutput.asFloatBuffer()
try {
    val reader = BufferedReader(
            InputStreamReader(assets.open("custom_labels.txt")))
    for (i in probabilities.capacity()) {
        val label: String = reader.readLine()
        val probability = probabilities.get(i)
        println("$label: $probability")
    }
} catch (e: IOException) {
    // File not found?
}

Java

modelOutput.rewind();
FloatBuffer probabilities = modelOutput.asFloatBuffer();
try {
    BufferedReader reader = new BufferedReader(
            new InputStreamReader(getAssets().open("custom_labels.txt")));
    for (int i = 0; i < probabilities.capacity(); i++) {
        String label = reader.readLine();
        float probability = probabilities.get(i);
        Log.i(TAG, String.format("%s: %1.4f", label, probability));
    }
} catch (IOException e) {
    // File not found?
}

Ek: Model güvenliği

TensorFlow Lite modellerinizi kullanıcılara nasıl sunduğunuz fark etmeksizin Firebase ML, Firebase ML bunları standart serileştirilmiş protobuf biçiminde şurada depolar: yerel depolama.

Teoride bu, herkesin modelinizi kopyalayabileceği anlamına gelir. Ancak, pratikte çoğu model, uygulamaya özgüdür ve her bir model rakiplerin parçalarının parçalarının sökülüp parçalarının parçalarının kodunuzu tekrarlamanız gerekir. Yine de, anahtar kelimeleri kullanmadan önce bu riskin farkında olmalısınız. bir model oluşturabilirsiniz.

Android API düzey 21 (Lollipop) ve daha yeni sürümlerde model dizini hariç tutulur.

Android API düzeyi 20 ve daha eski sürümlerde model bir dizine indirilir. Uygulama gizli modunda com.google.firebase.ml.custom.models olarak adlandırıldı dahili depolama. BackupAgent kullanarak dosya yedeklemeyi etkinleştirdiyseniz bu dizini hariç tutabilirsiniz.