Meta verileri kullanarak model arayüzleri oluşturma

Geliştiriciler, LiteRT Metadata'yı kullanarak Android'de entegrasyonu etkinleştirmek için sarmalayıcı kodu oluşturabilir. Çoğu geliştirici için Android Studio ML Model Binding'in grafik arayüzü en kolay kullanılan arayüzdür. Daha fazla özelleştirmeye ihtiyacınız varsa veya komut satırı araçlarını kullanıyorsanız LiteRT Codegen de kullanılabilir.

Android Studio ML Model Binding'i kullanma

Meta verilerle geliştirilmiş LiteRT modellerinde geliştiriciler, proje ayarlarını otomatik olarak yapılandırmak ve model meta verilerine göre sarmalayıcı sınıflar oluşturmak için Android Studio ML Model Binding'i kullanabilir. Sarmalayıcı kod, ByteBuffer ile doğrudan etkileşim kurma ihtiyacını ortadan kaldırır. Bunun yerine geliştiriciler, Bitmap ve Rect gibi türü belirlenmiş nesnelerle LiteRT modeliyle etkileşimde bulunabilir.

yüklenmesi gerekir.

Android Studio'ya LiteRT modeli içe aktarma

  1. TFLite modelini kullanmak istediğiniz modülü sağ tıklayın veya File, ardından New > Other > LiteRT Model'ü tıklayın.

  2. TFLite dosyanızın konumunu seçin. Araçların, modülün bağımlılığını sizin adınıza ML Model bağlama ile yapılandıracağını ve tüm bağımlılıkların Android modülünüzün build.gradle dosyasına otomatik olarak ekleneceğini unutmayın.

    İsteğe bağlı: GPU hızlandırmayı kullanmak istiyorsanız TensorFlow GPU'yu içe aktarmak için ikinci onay kutusunu işaretleyin.

  3. Finish simgesini tıklayın.

  4. İçe aktarma işlemi başarılı olduktan sonra aşağıdaki ekran görünür. Modeli kullanmaya başlamak için Kotlin veya Java'yı seçin, kodu kopyalayıp Sample Code bölümünün altına yapıştırın. Android Studio'da ml dizinindeki TFLite modelini çift tıklayarak bu ekrana geri dönebilirsiniz.

Model çıkarımını hızlandırma

ML Model Binding, temsilciler ve iş parçacığı sayısı kullanılarak geliştiricilerin kodlarını hızlandırmasına olanak tanır.

1. Adım: Modül build.gradle dosyasının aşağıdaki bağımlılığı içerip içermediğini kontrol edin:

    dependencies {
        ...
        // For the LiteRT GPU delegate, we need
        // 'com.google.ai.edge.litert:litert-gpu' version 1.*.
        implementation 'com.google.ai.edge.litert:litert-gpu:1.4.1'
    }

2. adım: Cihazda çalışan GPU'nun TensorFlow GPU temsilcisiyle uyumlu olup olmadığını algılayın. Uyumlu değilse modeli birden fazla CPU iş parçacığı kullanarak çalıştırın:

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
      

LiteRT kod oluşturucu ile model arayüzleri oluşturma

Meta verilerle geliştirilmiş LiteRT modeli için geliştiriciler, platforma özel sarmalayıcı kodu oluşturmak üzere LiteRT Android sarmalayıcı kodu oluşturucuyu kullanabilir. Sarmalayıcı kod, doğrudan ByteBuffer ile etkileşim kurma ihtiyacını ortadan kaldırır. Bunun yerine geliştiriciler, Bitmap ve Rect gibi türü belirtilmiş nesnelerle TensorFlow Lite modeliyle etkileşimde bulunabilir.

Kod oluşturucunun kullanışlılığı, LiteRT modelinin meta veri girişinin eksiksiz olmasına bağlıdır. Kod oluşturma aracının her alanı nasıl ayrıştırdığını görmek için metadata_schema.fbs dosyasındaki ilgili alanlar altındaki <Codegen usage> bölümüne bakın.

Sarmalayıcı kodu oluşturma

Terminalinize aşağıdaki araçları yüklemeniz gerekir:

pip install tflite-support

Tamamlandıktan sonra kod oluşturucu aşağıdaki söz dizimi kullanılarak kullanılabilir:

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

Elde edilen kod, hedef dizinde yer alır. Google Colab veya başka bir uzak ortam kullanıyorsanız sonucu bir ZIP arşivinde sıkıştırıp Android Studio projenize indirmeniz daha kolay olabilir:

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

Oluşturulan kodu kullanma

1. adım: Oluşturulan kodu içe aktarın

Gerekirse oluşturulan kodu bir dizin yapısında açın. Oluşturulan kodun kökünün SRC_ROOT olduğu varsayılır.

LiteRT modelini kullanmak istediğiniz Android Studio projesini açın ve oluşturulan modülü şu şekilde içe aktarın: Dosya -> Yeni -> Modülü İçe Aktar -> SRC_ROOT seçeneğini belirleyin.

Yukarıdaki örnekte, dizin ve içe aktarılan modül classify_wrapper olarak adlandırılır.

2. adım: Uygulamanın build.gradle dosyasını güncelleyin

Oluşturulan kitaplık modülünü kullanacak uygulama modülünde:

Android bölümüne aşağıdakileri ekleyin:

aaptOptions {
   noCompress "tflite"
}

Bağımlılıklar bölümüne aşağıdakileri ekleyin:

implementation project(":classify_wrapper")

3. adım: Modeli kullanma

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

Model çıkarımını hızlandırma

Oluşturulan kod, geliştiricilerin yetki verilmiş kullanıcılar ve iş parçacığı sayısı kullanarak kodlarını hızlandırmalarına olanak tanır. Üç parametre aldığından, model nesnesi başlatılırken bunlar ayarlanabilir:

  • Context: Android Etkinliği veya Hizmeti'nden alınan bağlam
  • (İsteğe bağlı) Device: TFLite hızlandırma yetkilisi. Örneğin: GPUDelegate
  • (İsteğe bağlı) numThreads: Modeli çalıştırmak için kullanılan iş parçacığı sayısı. Varsayılan değer birdir.

Örneğin, bir GPU temsilcisi ve en fazla üç iş parçacığı kullanmak için modeli şu şekilde başlatabilirsiniz:

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

Sorun giderme

"java.io.FileNotFoundException: This file can not be opened as a file descriptor; it is probably compressed" (java.io.FileNotFoundException: Bu dosya, dosya tanımlayıcısı olarak açılamaz; büyük olasılıkla sıkıştırılmıştır) hatası alırsanız kitaplık modülünü kullanacak uygulama modülünün android bölümüne aşağıdaki satırları ekleyin:

aaptOptions {
   noCompress "tflite"
}