Ikuti semua informasi yang diumumkan di Firebase Summit, dan pelajari bagaimana Firebase dapat membantu Anda mempercepat pengembangan aplikasi dan menjalankan aplikasi dengan percaya diri. Pelajari Lebih Lanjut

Gunakan model TensorFlow Lite khusus di Android

Tetap teratur dengan koleksi Simpan dan kategorikan konten berdasarkan preferensi Anda.

Jika aplikasi Anda menggunakan model TensorFlow Lite kustom, Anda dapat menggunakan Firebase ML untuk menerapkan model Anda. Dengan menerapkan model dengan Firebase, Anda dapat mengurangi ukuran unduhan awal aplikasi Anda dan memperbarui model ML aplikasi Anda tanpa merilis versi baru aplikasi Anda. Dan, dengan Remote Config dan Pengujian A/B, Anda dapat menyajikan model yang berbeda secara dinamis ke kumpulan pengguna yang berbeda.

Model TensorFlow Lite

Model TensorFlow Lite adalah model ML yang dioptimalkan untuk berjalan di perangkat seluler. Untuk mendapatkan model TensorFlow Lite:

Sebelum kamu memulai

  1. Jika Anda belum melakukannya, tambahkan Firebase ke proyek Android Anda .
  2. Dalam file Gradle modul (tingkat aplikasi) Anda (biasanya <project>/<app-module>/build.gradle ), tambahkan dependensi untuk library Android pengunduh model Firebase ML. Sebaiknya gunakan Firebase Android BoM untuk mengontrol pembuatan versi library.

    Selain itu, sebagai bagian dari penyiapan pengunduh model Firebase ML, Anda perlu menambahkan TensorFlow Lite SDK ke aplikasi Anda.

    Java

    dependencies {
        // Import the BoM for the Firebase platform
        implementation platform('com.google.firebase:firebase-bom:31.1.0')
    
        // 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'
    }

    Dengan menggunakan Firebase Android BoM , aplikasi Anda akan selalu menggunakan versi library Firebase Android yang kompatibel.

    (Alternatif) Tambahkan dependensi library Firebase tanpa menggunakan BoM

    Jika Anda memilih untuk tidak menggunakan Firebase BoM, Anda harus menentukan setiap versi pustaka Firebase di baris dependensinya.

    Perhatikan bahwa jika Anda menggunakan beberapa pustaka Firebase di aplikasi Anda, kami sangat menyarankan penggunaan BoM untuk mengelola versi pustaka, yang memastikan bahwa semua versi kompatibel.

    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:24.1.1'
    // Also add the dependency for the TensorFlow Lite library and specify its version implementation 'org.tensorflow:tensorflow-lite:2.3.0'
    }

    Kotlin+KTX

    dependencies {
        // Import the BoM for the Firebase platform
        implementation platform('com.google.firebase:firebase-bom:31.1.0')
    
        // 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-ktx'
    // Also add the dependency for the TensorFlow Lite library and specify its version implementation 'org.tensorflow:tensorflow-lite:2.3.0'
    }

    Dengan menggunakan Firebase Android BoM , aplikasi Anda akan selalu menggunakan versi library Firebase Android yang kompatibel.

    (Alternatif) Tambahkan dependensi library Firebase tanpa menggunakan BoM

    Jika Anda memilih untuk tidak menggunakan Firebase BoM, Anda harus menentukan setiap versi pustaka Firebase di baris dependensinya.

    Perhatikan bahwa jika Anda menggunakan beberapa pustaka Firebase di aplikasi Anda, kami sangat menyarankan penggunaan BoM untuk mengelola versi pustaka, yang memastikan bahwa semua versi kompatibel.

    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-ktx:24.1.1'
    // Also add the dependency for the TensorFlow Lite library and specify its version implementation 'org.tensorflow:tensorflow-lite:2.3.0'
    }
  3. Dalam manifes aplikasi Anda, nyatakan bahwa izin INTERNET diperlukan:
    <uses-permission android:name="android.permission.INTERNET" />

1. Terapkan model Anda

Deploy model TensorFlow kustom Anda menggunakan Firebase console atau Firebase Admin Python dan Node.js SDK. Lihat Menerapkan dan mengelola model khusus .

Setelah menambahkan model kustom ke proyek Firebase, Anda dapat mereferensikan model di aplikasi menggunakan nama yang Anda tentukan. Kapan saja, Anda dapat menerapkan model TensorFlow Lite baru dan mengunduh model baru ke perangkat pengguna dengan memanggil getModel() (lihat di bawah).

2. Unduh model ke perangkat dan inisialisasi penerjemah TensorFlow Lite

Untuk menggunakan model TensorFlow Lite di aplikasi Anda, pertama-tama gunakan Firebase ML SDK untuk mendownload model versi terbaru ke perangkat. Kemudian, buat instance interpreter TensorFlow Lite dengan model tersebut.

Untuk memulai pengunduhan model, panggil metode getModel() pengunduh model, tentukan nama yang Anda tetapkan untuk model saat Anda mengunggahnya, apakah Anda ingin selalu mengunduh model terbaru, dan kondisi di mana Anda ingin mengizinkan pengunduhan.

Anda dapat memilih dari tiga perilaku unduhan:

Jenis unduhan Keterangan
LOCAL_MODEL Dapatkan model lokal dari perangkat. Jika tidak ada model lokal yang tersedia, ini berperilaku seperti LATEST_MODEL . Gunakan jenis unduhan ini jika Anda tidak tertarik untuk memeriksa pembaruan model. Misalnya, Anda menggunakan Remote Config untuk mengambil nama model dan Anda selalu mengunggah model dengan nama baru (disarankan).
LOCAL_MODEL_UPDATE_IN_BACKGROUND Dapatkan model lokal dari perangkat dan mulai perbarui model di latar belakang. Jika tidak ada model lokal yang tersedia, ini berperilaku seperti LATEST_MODEL .
MODEL TERBARU Dapatkan model terbaru. Jika model lokal adalah versi terbaru, kembalikan model lokal. Jika tidak, unduh model terbaru. Perilaku ini akan diblokir hingga versi terbaru diunduh (tidak disarankan). Gunakan perilaku ini hanya jika Anda secara eksplisit membutuhkan versi terbaru.

Anda harus menonaktifkan fungsionalitas terkait model—misalnya, menghilangkan atau menyembunyikan sebagian UI—sampai Anda mengonfirmasi bahwa model telah diunduh.

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

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

Banyak aplikasi memulai tugas pengunduhan dalam kode inisialisasinya, tetapi Anda dapat melakukannya kapan saja sebelum Anda perlu menggunakan model tersebut.

3. Lakukan inferensi pada input data

Dapatkan bentuk input dan output model Anda

Penerjemah model TensorFlow Lite mengambil sebagai input dan menghasilkan satu atau beberapa array multidimensi sebagai output. Array ini berisi nilai byte , int , long , atau float . Sebelum Anda dapat meneruskan data ke model atau menggunakan hasilnya, Anda harus mengetahui jumlah dan dimensi ("bentuk") dari larik yang digunakan model Anda.

Jika Anda membuat model sendiri, atau jika format input dan output model didokumentasikan, Anda mungkin sudah memiliki informasi ini. Jika Anda tidak mengetahui bentuk dan tipe data dari input dan output model Anda, Anda dapat menggunakan interpreter TensorFlow Lite untuk memeriksa model Anda. Sebagai contoh:

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']))

Contoh keluaran:

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

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

Jalankan penerjemah

Setelah Anda menentukan format input dan output model Anda, dapatkan data input Anda dan lakukan transformasi apa pun pada data yang diperlukan untuk mendapatkan input dengan bentuk yang tepat untuk model Anda.

Misalnya, jika Anda memiliki model klasifikasi gambar dengan bentuk input nilai floating-point [1 224 224 3] , Anda bisa menghasilkan input ByteBuffer dari objek Bitmap seperti yang ditunjukkan dalam contoh berikut:

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

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

Kemudian, alokasikan ByteBuffer yang cukup besar untuk menampung output model dan meneruskan buffer input dan buffer output ke metode run() interpreter TensorFlow Lite. Misalnya, untuk bentuk keluaran [1 1000] nilai floating-point:

Java

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

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)

Bagaimana Anda menggunakan output tergantung pada model yang Anda gunakan.

Misalnya, jika Anda melakukan klasifikasi, sebagai langkah berikutnya, Anda dapat memetakan indeks hasil ke label yang diwakilinya:

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

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

Lampiran: Keamanan model

Terlepas dari cara Anda membuat model TensorFlow Lite tersedia untuk Firebase ML, Firebase ML menyimpannya dalam format protobuf serial standar di penyimpanan lokal.

Secara teori, ini berarti siapa pun dapat menyalin model Anda. Namun, dalam praktiknya, sebagian besar model sangat spesifik untuk aplikasi dan dikaburkan oleh pengoptimalan sehingga risikonya mirip dengan risiko pembongkaran dan penggunaan kembali kode pesaing Anda. Namun demikian, Anda harus menyadari risiko ini sebelum menggunakan model khusus di aplikasi Anda.

Pada Android API level 21 (Lollipop) dan yang lebih baru, model diunduh ke direktori yang dikecualikan dari pencadangan otomatis .

Pada Android API level 20 dan yang lebih lama, model diunduh ke direktori bernama com.google.firebase.ml.custom.models di penyimpanan internal pribadi aplikasi. Jika Anda mengaktifkan pencadangan file menggunakan BackupAgent , Anda dapat memilih untuk mengecualikan direktori ini.