Giriş ve çıkış verilerini LiteRT Destek Kitaplığı ile işleyin

Mobil uygulama geliştiricileri genellikle bit eşlemler veya tamsayılar gibi temel öğeler. Ancak LiteRT çevirmeni Cihaz üzerinde makine öğrenimi modelini çalıştıran API, tensörleri ByteBuffer, hata ayıklaması ve müdahale edilmesi zor olabilir. İlgili içeriği oluşturmak için kullanılan LiteRT Android Destek Kitaplığı LiteRT modellerinin giriş ve çıkışının işlenmesine yardımcı olmak için tasarlanmıştır ve LiteRT çevirmeninin kullanımını kolaylaştırın.

Başlarken

Gradle bağımlılığını ve diğer ayarları içe aktarma

.tflite model dosyasını Android modülünün öğe dizinine kopyalayın nerede çalıştırılacağına karar verin. Dosyanın sıkıştırılmaması gerektiğini belirtin ve LiteRT kitaplığını modülün build.gradle dosyasına ekleyin:

android {
    // Other settings

    // Specify tflite file should not be compressed for the app apk
    aaptOptions {
        noCompress "tflite"
    }

}

dependencies {
    // Other dependencies

    // Import tflite dependencies
    implementation 'org.tensorflow:tensorflow-lite:0.0.0-nightly-SNAPSHOT'
    // The GPU delegate library is optional. Depend on it as needed.
    implementation 'com.google.ai.edge.litert:litert-gpu:0.0.0-nightly-SNAPSHOT'
    implementation 'com.google.ai.edge.litert:litert-support:0.0.0-nightly-SNAPSHOT'
}

Şurayı keşfedin: MavenCentral'da barındırılan LiteRT Destek Kitaplığı AAR sürümlerinden faydalanabilirsiniz.

Temel resim değiştirme ve dönüştürme

LiteRT Destek Kitaplığı'nda bir temel resim işleme paketi bulunur farklı yöntemler deniyor. Kullanmak için bir ImagePreprocessor oluşturun ve gerekli işlemleri ekleyin. Resmi tensör biçimine dönüştürmek için LiteRT çevirmeni tarafından zorunlu tutuluyorsa kullanılacak bir TensorImage oluşturun giriş olarak:

import org.tensorflow.lite.DataType;
import org.tensorflow.lite.support.image.ImageProcessor;
import org.tensorflow.lite.support.image.TensorImage;
import org.tensorflow.lite.support.image.ops.ResizeOp;

// Initialization code
// Create an ImageProcessor with all ops required. For more ops, please
// refer to the ImageProcessor Architecture section in this README.
ImageProcessor imageProcessor =
    new ImageProcessor.Builder()
        .add(new ResizeOp(224, 224, ResizeOp.ResizeMethod.BILINEAR))
        .build();

// Create a TensorImage object. This creates the tensor of the corresponding
// tensor type (uint8 in this case) that the LiteRT interpreter needs.
TensorImage tensorImage = new TensorImage(DataType.UINT8);

// Analysis code for every frame
// Preprocess the image
tensorImage.load(bitmap);
tensorImage = imageProcessor.process(tensorImage);

Bir tensörün DataType kadarı meta veri ayıklayıcı kitaplığı gibi başka model bilgilerini de kullanabilirsiniz.

Temel ses verilerini işleme

LiteRT Destek Kitaplığı ayrıca bir TensorAudio sınıf sarmalama tanımlar. temel ses verisi işleme yöntemlerinden bazılarıdır. Çoğunlukla birlikte kullanılır AudioRecord ve halka arabellekte ses örneklerini yakalar.

import android.media.AudioRecord;
import org.tensorflow.lite.support.audio.TensorAudio;

// Create an `AudioRecord` instance.
AudioRecord record = AudioRecord(...)

// Create a `TensorAudio` object from Android AudioFormat.
TensorAudio tensorAudio = new TensorAudio(record.getFormat(), size)

// Load all audio samples available in the AudioRecord without blocking.
tensorAudio.load(record)

// Get the `TensorBuffer` for inference.
TensorBuffer buffer = tensorAudio.getTensorBuffer()

Çıkış nesneleri oluşturma ve modeli çalıştırma

Modeli çalıştırmadan önce, çalıştırılması gereken container nesnelerini oluşturmamız sonucu sakla:

import org.tensorflow.lite.DataType;
import org.tensorflow.lite.support.tensorbuffer.TensorBuffer;

// Create a container for the result and specify that this is a quantized model.
// Hence, the 'DataType' is defined as UINT8 (8-bit unsigned integer)
TensorBuffer probabilityBuffer =
    TensorBuffer.createFixedSize(new int[]{1, 1001}, DataType.UINT8);

Modeli yükleme ve çıkarımı çalıştırma:

import java.nio.MappedByteBuffer;
import org.tensorflow.lite.InterpreterFactory;
import org.tensorflow.lite.InterpreterApi;

// Initialise the model
try{
    MappedByteBuffer tfliteModel
        = FileUtil.loadMappedFile(activity,
            "mobilenet_v1_1.0_224_quant.tflite");
    InterpreterApi tflite = new InterpreterFactory().create(
        tfliteModel, new InterpreterApi.Options());
} catch (IOException e){
    Log.e("tfliteSupport", "Error reading model", e);
}

// Running inference
if(null != tflite) {
    tflite.run(tImage.getBuffer(), probabilityBuffer.getBuffer());
}

Sonuca erişme

Geliştiriciler çıkışa doğrudan probabilityBuffer.getFloatArray() Model nicel bir çıktı üretiyorsa sonucu dönüştürmeyi unutmayın. MobileNet miktarlandırılmış modeli için geliştirici, şu olasılığı elde etmek için her çıktı değerini 255'e bölmesi gerekir: 0 (en az olası) ile 1 (en olası) arasındadır.

İsteğe bağlı: Sonuçları etiketlerle eşleme

Geliştiriciler de isterlerse sonuçları etiketlerle eşleştirebilirler. Önce metni kopyalayın modülün öğe dizinine etiket içeren dosya ekleyin. Sonra, etiketi yükleyin dosyasını yükleyin:

import org.tensorflow.lite.support.common.FileUtil;

final String ASSOCIATED_AXIS_LABELS = "labels.txt";
List<String> associatedAxisLabels = null;

try {
    associatedAxisLabels = FileUtil.loadLabels(this, ASSOCIATED_AXIS_LABELS);
} catch (IOException e) {
    Log.e("tfliteSupport", "Error reading label file", e);
}

Aşağıdaki snippet, olasılıkların kategori etiketleri:

import java.util.Map;
import org.tensorflow.lite.support.common.TensorProcessor;
import org.tensorflow.lite.support.common.ops.NormalizeOp;
import org.tensorflow.lite.support.label.TensorLabel;

// Post-processor which dequantize the result
TensorProcessor probabilityProcessor =
    new TensorProcessor.Builder().add(new NormalizeOp(0, 255)).build();

if (null != associatedAxisLabels) {
    // Map of labels and their corresponding probability
    TensorLabel labels = new TensorLabel(associatedAxisLabels,
        probabilityProcessor.process(probabilityBuffer));

    // Create a map to access the result based on label
    Map<String, Float> floatMap = labels.getMapWithFloatValue();
}

Mevcut kullanım alanı kapsamı

LiteRT Destek Kitaplığı'nın mevcut sürümü şunları kapsar:

  • yaygın veri türleri (float, uint8, görüntüler, ses ve bu nesnelerin dizisi) giriş ve çıkışları olarak yeniden kullanılabilir.
  • temel resim işlemleri (resmi kırpma, yeniden boyutlandırma ve döndürme).
  • normalleştirme ve niceleme
  • dosya yardımcı programları

Gelecekteki sürümler, metinle ilgili uygulamalar için desteği iyileştirecektir.

Görüntü İşlemci Mimarisi

ImageProcessor tasarımı, görüntü manipülasyon işlemlerinin önceden tanımlanması ve geliştirme sürecinin optimize edilmesi gerekir. ImageProcessor şu anda aşağıda açıklandığı gibi üç temel ön işleme işlemini desteklemektedir: aşağıdaki kod snippet'inde üç yorum bulunmaktadır:

import org.tensorflow.lite.support.common.ops.NormalizeOp;
import org.tensorflow.lite.support.common.ops.QuantizeOp;
import org.tensorflow.lite.support.image.ops.ResizeOp;
import org.tensorflow.lite.support.image.ops.ResizeWithCropOrPadOp;
import org.tensorflow.lite.support.image.ops.Rot90Op;

int width = bitmap.getWidth();
int height = bitmap.getHeight();

int size = height > width ? width : height;

ImageProcessor imageProcessor =
    new ImageProcessor.Builder()
        // Center crop the image to the largest square possible
        .add(new ResizeWithCropOrPadOp(size, size))
        // Resize using Bilinear or Nearest neighbour
        .add(new ResizeOp(224, 224, ResizeOp.ResizeMethod.BILINEAR));
        // Rotation counter-clockwise in 90 degree increments
        .add(new Rot90Op(rotateDegrees / 90))
        .add(new NormalizeOp(127.5, 127.5))
        .add(new QuantizeOp(128.0, 1/128.0))
        .build();

Daha fazla ayrıntı göster burada bulabilirsiniz normalleştirme ve niceleme.

Destek kitaplığının nihai hedefi, tf.image dönüşümlerine dahil edilir. Bu, dönüşümün TensorFlow ile aynı olacağı anlamına gelir Ayrıca uygulama, işletim sisteminden bağımsız olur.

Geliştiriciler de özel işlemciler oluşturabilir. Proje yönetiminde eğitim süreciyle uyumlu hale getirilmelidir (örneğin, aynı eğitim hem eğitim hem de çıkarımlarda geçerli olacak şekilde çok işe yarar.

Nicelendirme

TensorImage veya TensorBuffer gibi giriş veya çıkış nesnelerini başlatırken türlerini DataType.UINT8 veya DataType.FLOAT32 olarak belirtmeniz gerekir.

TensorImage tensorImage = new TensorImage(DataType.UINT8);
TensorBuffer probabilityBuffer =
    TensorBuffer.createFixedSize(new int[]{1, 1001}, DataType.UINT8);

TensorProcessor, giriş tensörlerini ölçmek veya çıkışın miktarını azaltmak için kullanılabilir tensörler. Örneğin, miktarlandırılmış bir çıktıyı (TensorBuffer) işlerken, geliştirici, sonucu kayan noktaya dönüştürmek için DequantizeOp kullanabilir olasılık:

import org.tensorflow.lite.support.common.TensorProcessor;

// Post-processor which dequantize the result
TensorProcessor probabilityProcessor =
    new TensorProcessor.Builder().add(new DequantizeOp(0, 1/255.0)).build();
TensorBuffer dequantizedBuffer = probabilityProcessor.process(probabilityBuffer);

Bir tensörün niceleme parametreleri meta veri ayıklayıcı kitaplığı.