TensorFlow Lite Destek Kitaplığı ile giriş ve çıkış verilerini işleyin

Mobil uygulama geliştiricileri tipik olarak bitmapler gibi yazılı nesnelerle veya tamsayılar gibi temel öğelerle etkileşime girer. Bununla birlikte, cihaz üzerinde makine öğrenimi modelini çalıştıran TensorFlow Lite Yorumlayıcısı, hata ayıklaması ve manipüle edilmesi zor olabilen ByteBuffer formundaki tensörleri kullanır. TensorFlow Lite Android Destek Kitaplığı , TensorFlow Lite modellerinin giriş ve çıkışlarını işlemeye yardımcı olmak ve TensorFlow Lite yorumlayıcının kullanımını kolaylaştırmak için tasarlanmıştır.

Başlarken

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

.tflite model dosyasını, modelin çalıştırılacağı Android modülünün varlıklar dizinine kopyalayın. Dosyanın sıkıştırılmaması gerektiğini belirtin ve TensorFlow Lite kitaplığını modülün build.gradle dosyasına build.gradle :

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 'org.tensorflow:tensorflow-lite-gpu:0.0.0-nightly-SNAPSHOT'
    implementation 'org.tensorflow:tensorflow-lite-support:0.0.0-nightly-SNAPSHOT'
}

Destek Kitaplığının farklı sürümleri için MavenCentral'da barındırılan TensorFlow Lite Destek Kitaplığı AAR'yi keşfedin.

Temel görüntü işleme ve dönüştürme

TensorFlow Lite Destek Kitaplığı, kırpma ve yeniden boyutlandırma gibi bir dizi temel görüntü işleme yöntemlerine sahiptir. Kullanmak için bir ImagePreprocessor oluşturun ve gerekli işlemleri ekleyin. Görüntüyü TensorFlow Lite yorumlayıcısının gerektirdiği tensör biçimine dönüştürmek için, girdi olarak kullanılacak bir TensorImage oluşturun:

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 TensorFlow Lite 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 , meta veri çıkarıcı kitaplığı ve diğer model bilgileri aracılığıyla okunabilir.

Baisc ses verisi işleme

TensorFlow Lite Destek Kitaplığı ayrıca bazı temel ses verisi işleme yöntemlerini saran bir TensorAudio sınıfını da tanımlar. Çoğunlukla AudioRecord ile birlikte kullanılır ve bir halka arabelleğinde ses örneklerini yakalar.

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

Çıktı nesneleri oluşturun ve modeli çalıştırın

Modeli çalıştırmadan önce, sonucu saklayacak konteyner nesnelerini oluşturmamız gerekiyor:

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 yapma:

import org.tensorflow.lite.support.model.Model;

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

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

Sonuca ulaşmak

Geliştiriciler çıktıya doğrudan probabilityBuffer.getFloatArray() aracılığıyla erişebilirler. Model nicelleştirilmiş bir çıktı üretirse, sonucu dönüştürmeyi unutmayın. MobileNet nicelleştirilmiş model için geliştiricinin, her kategori için 0 (en az olası) ile 1 (büyük olasılıkla) arasında değişen olasılık elde etmek için her çıktı değerini 255'e bölmesi gerekir.

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

Geliştiriciler ayrıca isteğe bağlı olarak sonuçları etiketlerle eşleyebilir. İlk olarak, etiketleri içeren metin dosyasını modülün varlıklar dizinine kopyalayın. Ardından, aşağıdaki kodu kullanarak etiket 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 kod parçası, olasılıkların kategori etiketleriyle nasıl ilişkilendirileceğini gösterir:

import org.tensorflow.lite.support.common.TensorProcessor;
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 durumu kapsamı

TensorFlow Lite Destek Kitaplığının mevcut sürümü şunları kapsar:

  • tflite modellerinin girdi ve çıktıları olarak yaygın veri türleri (float, uint8, görüntüler, ses ve bu nesnelerin dizisi).
  • temel görüntü işlemleri (görüntüyü kırpma, yeniden boyutlandırma ve döndürme).
  • normalleştirme ve niceleme
  • dosya araçları

Gelecek sürümler, metinle ilgili uygulamalar için desteği geliştirecek.

Görüntü İşlemci Mimarisi

ImageProcessor tasarımı, görüntü işleme işlemlerinin önceden tanımlanmasına ve oluşturma işlemi sırasında optimize edilmesine izin verdi. Görüntü ImageProcessor şu anda üç temel ön işleme işlemini desteklemektedir:

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

Normalleştirme ve niceleme hakkında daha fazla ayrıntıya buradan bakın.

Destek kitaplığının nihai amacı, tüm tf.image dönüşümlerini desteklemektir. Bu, dönüşümün TensorFlow ile aynı olacağı ve uygulamanın işletim sisteminden bağımsız olacağı anlamına gelir.

Geliştiriciler ayrıca özel işlemciler oluşturabilirler. Bu durumlarda eğitim süreciyle uyumlu olmak önemlidir - yani aynı ön işleme, tekrarlanabilirliği artırmak için hem eğitim hem de çıkarım için geçerli olmalıdır.

Niceleme

TensorImage veya TensorBuffer gibi girdi veya çıktı nesnelerini TensorImage , 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 nicelemek veya çıkış tensörlerini TensorProcessor için kullanılabilir. Örneğin, nicelleştirilmiş bir çıktı TensorBuffer , geliştirici, sonucu 0 ile 1 arasında bir kayan nokta olasılığına DequantizeOp için DequantizeOp kullanabilir:

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 çıkarıcı kitaplığı aracılığıyla okunabilir.