Membuat antarmuka model menggunakan metadata

Dengan Metadata LiteRT, developer dapat membuat kode wrapper untuk mengaktifkan integrasi di Android. Bagi sebagian besar developer, antarmuka grafis Android Studio ML Model Binding adalah paling mudah digunakan. Jika Anda memerlukan penyesuaian lebih lanjut atau menggunakan command line alat LiteRT Codegen juga tersedia.

Menggunakan Binding Model ML Android Studio

Untuk model LiteRT yang ditingkatkan dengan metadata, developer dapat menggunakan Model Binding ML Android Studio untuk mengonfigurasi setelan untuk project dan menghasilkan class wrapper berdasarkan model {i>metadata<i}. Kode wrapper menghilangkan kebutuhan untuk berinteraksi langsung dengan ByteBuffer. Sebagai gantinya, developer dapat berinteraksi dengan model LiteRT dengan objek yang diketik seperti Bitmap dan Rect.

Mengimpor model LiteRT di Android Studio

  1. Klik kanan pada modul yang ingin Anda gunakan dengan model TFLite atau klik File, lalu New > Other LiteRT Model

  2. Pilih lokasi file TFLite Anda. Perhatikan bahwa alat ini akan mengonfigurasi dependensi modul atas nama Anda dengan binding Model ML dan semua dependensi otomatis dimasukkan ke dalam metode File build.gradle.

    Opsional: Pilih kotak centang kedua untuk mengimpor GPU TensorFlow jika Anda ingin menggunakan akselerasi GPU.

  3. Klik Finish.

  4. Layar berikut akan muncul setelah impor berhasil. Untuk memulai menggunakan model, pilih Kotlin atau Java, salin dan tempel kode di bagian Sample Code. Anda dapat kembali ke layar ini dengan mengklik dua kali model TFLite pada direktori ml di Android Studio.

Mempercepat inferensi model

ML Model Binding menyediakan cara bagi developer untuk mempercepat kode mereka melalui penggunaan delegasi dan jumlah {i>thread<i}.

Langkah 1. Periksa file modul build.gradle yang berisi hal berikut dependensi:

    dependencies {
        ...
        // TFLite GPU delegate 2.3.0 or above is required.
        implementation 'com.google.ai.edge.litert:litert-gpu:2.3.0'
    }

Langkah 2. Mendeteksi apakah GPU yang berjalan di perangkat kompatibel dengan TensorFlow GPU delegasi, jika tidak menjalankan model menggunakan beberapa thread CPU:

Kotlin

    import org.tensorflow.lite.gpu.CompatibilityList
    import org.tensorflow.lite.gpu.GpuDelegate

    val compatList = CompatibilityList()

    val options = if(compatList.isDelegateSupportedOnThisDevice) {
        // if the device has a supported GPU, add the GPU delegate
        Model.Options.Builder().setDevice(Model.Device.GPU).build()
    } else {
        // if the GPU is not supported, run on 4 threads
        Model.Options.Builder().setNumThreads(4).build()
    }

    // Initialize the model as usual feeding in the options object
    val myModel = MyModel.newInstance(context, options)

    // Run inference per sample code
      

Java

    import org.tensorflow.lite.support.model.Model
    import org.tensorflow.lite.gpu.CompatibilityList;
    import org.tensorflow.lite.gpu.GpuDelegate;

    // Initialize interpreter with GPU delegate
    Model.Options options;
    CompatibilityList compatList = CompatibilityList();

    if(compatList.isDelegateSupportedOnThisDevice()){
        // if the device has a supported GPU, add the GPU delegate
        options = Model.Options.Builder().setDevice(Model.Device.GPU).build();
    } else {
        // if the GPU is not supported, run on 4 threads
        options = Model.Options.Builder().setNumThreads(4).build();
    }

    MyModel myModel = new MyModel.newInstance(context, options);

    // Run inference per sample code
      

Membuat antarmuka model dengan generator kode LiteRT

Untuk model LiteRT yang ditingkatkan dengan metadata, developer dapat menggunakan generator kode wrapper Android LiteRT untuk membuat kode wrapper khusus platform. Kode wrapper menghilangkan kebutuhan untuk berinteraksi secara langsung dengan ByteBuffer. Sebagai gantinya, developer bisa berinteraksi dengan TensorFlow Model ringan dengan objek yang diketik seperti Bitmap dan Rect.

Kegunaan generator kode bergantung pada kelengkapan Entri metadata model LiteRT. Lihat bagian <Codegen usage> di kolom yang relevan di metadata_schema.fbs, untuk melihat cara alat codegen mengurai setiap kolom.

Buat Kode wrapper

Anda harus menginstal alat berikut di terminal Anda:

pip install tflite-support

Setelah selesai, generator kode dapat digunakan menggunakan sintaks berikut:

tflite_codegen --model=./model_with_metadata/mobilenet_v1_0.75_160_quantized.tflite \
    --package_name=org.tensorflow.lite.classify \
    --model_class_name=MyClassifierModel \
    --destination=./classify_wrapper

Kode yang dihasilkan akan ditempatkan di direktori tujuan. Jika Anda menggunakan Google Colab atau kontrol jarak jauh lainnya lingkungan yang lebih baik, mungkin lebih mudah untuk memaketkan hasilnya ke dalam arsip {i>zip<i} dan mengunduhnya ke project Android Studio Anda:

# Zip up the generated code
!zip -r classify_wrapper.zip classify_wrapper/

# Download the archive
from google.colab import files
files.download('classify_wrapper.zip')

Menggunakan kode yang dihasilkan

Langkah 1: Impor kode yang dibuat

Jika perlu, ekstrak kode yang dihasilkan ke dalam struktur direktori. Akar dari kode yang dihasilkan diasumsikan sebagai SRC_ROOT.

Buka project Android Studio tempat Anda ingin menggunakan LiteRT model dan impor modul yang dihasilkan dengan: Dan File -> Baru -> Impor Modul -> pilih SRC_ROOT

Dengan menggunakan contoh di atas, direktori dan modul yang diimpor akan dipanggil classify_wrapper.

Langkah 2: Perbarui file build.gradle aplikasi

Dalam modul aplikasi yang akan menggunakan modul library yang dihasilkan:

Di bagian Android, tambahkan kode berikut:

aaptOptions {
   noCompress "tflite"
}

Di bagian dependensi, tambahkan kode berikut:

implementation project(":classify_wrapper")

Langkah 3: Menggunakan model

// 1. Initialize the model
MyClassifierModel myImageClassifier = null;

try {
    myImageClassifier = new MyClassifierModel(this);
} catch (IOException io){
    // Error reading the model
}

if(null != myImageClassifier) {

    // 2. Set the input with a Bitmap called inputBitmap
    MyClassifierModel.Inputs inputs = myImageClassifier.createInputs();
    inputs.loadImage(inputBitmap));

    // 3. Run the model
    MyClassifierModel.Outputs outputs = myImageClassifier.run(inputs);

    // 4. Retrieve the result
    Map<String, Float> labeledProbability = outputs.getProbability();
}

Mempercepat inferensi model

Kode yang dihasilkan memberikan cara bagi developer untuk mempercepat pembuatan kode melalui penggunaan delegasi dan jumlah . Metode ini dapat ditetapkan saat melakukan inisialisasi objek model karena diperlukan tiga parameter:

  • Context: Konteks dari Aktivitas atau Layanan Android
  • (Opsional) Device: Delegasi akselerasi TFLite. Contoh: GPUDelegate
  • (Opsional) numThreads: Jumlah thread yang digunakan untuk menjalankan model - defaultnya adalah satu.

Misalnya, untuk menggunakan delegasi GPU dan hingga tiga thread, Anda dapat melakukan inisialisasi model seperti ini:

try {
    myImageClassifier = new MyClassifierModel(this, Model.Device.GPU, 3);
} catch (IOException io){
    // Error reading the model
}

Pemecahan masalah

Jika Anda mendapatkan pesan 'java.io.FileNotFoundException: File ini tidak dapat dibuka sebagai deskriptor file; gambar tersebut mungkin terkompresi' error, sisipkan baris berikut di bagian android pada modul aplikasi yang akan menggunakan modul library:

aaptOptions {
   noCompress "tflite"
}