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ığı.