Uygulamanızda TensorFlow Basit modeller kullanıyorsanız modellerinizi dağıtmak için Firebase ML kullanabilirsiniz. Ölçüt Firebase ile modelleri dağıttığınızda, uygulamanızın başlangıçtaki indirme boyutunu uygulamanızı ve uygulamanızın makine öğrenimi modellerini en iyi şekilde yararlanabilirsiniz. Ayrıca Remote Config ve A/B Testing ile, reklamlarınızı farklı kullanıcı gruplarına farklı modeller sunar.
TensorFlow Lite modelleri
TensorFlow Lite modelleri, mobil cihazlarda çalışmak için optimize edilmiş makine öğrenimi modelleridir cihazlar. TensorFlow Lite modeli edinmek için:
- Örneğin, resmi TensorFlow Lite modelleri.
- Dönüştür TensorFlow modeli, Keras modeli veya somut bir işlev kullanarak Basit.
Başlamadan önce
- Henüz yapmadıysanız Firebase'i Android projenize ekleyin.
-
Modül (uygulama düzeyinde) Gradle dosyanızda
(genellikle
<project>/<app-module>/build.gradle.kts
veya<project>/<app-module>/build.gradle
), Android için Firebase ML model indirme aracı kitaplığının bağımlılığını ekleyin. Şunu kullanmanızı öneririz: Firebase Android BoM Kitaplık'ta sürüm oluşturmayı kontrol etmek içinAyrıca, Firebase ML model indirme aracını kurmanın bir parçası olarak TensorFlow Lite SDK'sını uygulamanıza ekleyin.
dependencies { // Import the BoM for the Firebase platform implementation(platform("com.google.firebase:firebase-bom:33.5.1")) // Add the dependency for the Firebase ML model downloader library // When using the BoM, you don't specify versions in Firebase library dependencies implementation("com.google.firebase:firebase-ml-modeldownloader")
// Also add the dependency for the TensorFlow Lite library and specify its version implementation("org.tensorflow:tensorflow-lite:2.3.0") }Firebase Android BoM kullanıldığında, Uygulamanız her zaman Firebase Android kitaplıklarının uyumlu sürümlerini kullanacaktır.
(Alternatif) Firebase kitaplığı bağımlılıklarını kullanmadanBoM
Firebase BoM kullanmamayı seçerseniz her Firebase kitaplığı sürümünü belirtmeniz gerekir değerini alır.
Uygulamanızda birden çok Firebase kitaplığı kullanıyorsanız, kitaplık sürümlerini yönetmek için BoM kullanmanızı öneririz. Bu, tüm sürümlerin uyumlu olduğundan emin olun.
dependencies { // Add the dependency for the Firebase ML model downloader library // When NOT using the BoM, you must specify versions in Firebase library dependencies implementation("com.google.firebase:firebase-ml-modeldownloader:25.0.1")
// Also add the dependency for the TensorFlow Lite library and specify its version implementation("org.tensorflow:tensorflow-lite:2.3.0") } - Uygulamanızın manifest dosyasında, INTERNET izninin gerekli olduğunu beyan edin:
<uses-permission android:name="android.permission.INTERNET" />
1. Modelinizi dağıtma
Özel TensorFlow modellerinizi Firebase konsolunu ya da Firebase Admin Python ve Node.js SDK'ları. Görüntüleyin Özel modelleri dağıtın ve yönetin.
Firebase projenize özel model ekledikten sonra,
modeliniz olmalıdır. İstediğiniz zaman dağıtabilirsiniz
yeni bir TensorFlow Lite modeli kullanıyor ve yeni modeli kullanıcıların cihazları
getModel()
aranıyor (aşağıya bakın).
2. Modeli cihaza indirin ve TensorFlow Lite çevirmenini başlatın
Uygulamanızda TensorFlow Lite modelinizi kullanmak için önce Firebase ML SDK'sını kullanın modelin en son sürümünü cihaza indirin. Ardından, Modelle birlikte TensorFlow Lite çevirmeni.Model indirme işlemini başlatmak için model indirme aracının getModel()
yöntemini çağırın.
ister modelinizi isterken, modeli yüklerken atadığınız adı,
almak istediğiniz her zaman en son modeli ve bu modele
indirmeye izin vermek istiyorsunuz.
Üç indirme davranışı arasından seçim yapabilirsiniz:
İndirme türü | Açıklama |
---|---|
YEREL_MODEL | Cihazdan yerel modeli alın.
Yerel model yoksa
LATEST_MODEL gibi davranır. Bunu kullan
ilginizi çekmiyorsa indirme türü
model güncellemeleri kontrol ediliyor. Örneğin,
geri almak için Remote Config’i
ve modelleri her zaman
(önerilir). |
LOCAL_MODEL_UPDATE_IN_BACKGROUND | Cihazdan yerel modeli alın ve
modeli arka planda güncellemeye başlayın.
Yerel model yoksa
LATEST_MODEL gibi davranır. |
SON_MODEL | En son modeli edinin. Yerel model en son sürüm, yerel modeli. Aksi durumda en yeni modeli. Bu davranış, en son sürüm indirildiğinde (yalnızca önerilir). Bu davranışı yalnızca sahip olmanız gereken en güncel sürümünü değil. |
Modelle ilgili işlevleri (ör. devre dışı bırakma veya devre dışı bırakma) kullanıcı arayüzünüzün bir kısmını gizleyin (modelin indirildiğini onaylayana kadar).
Kotlin+KTX
val conditions = CustomModelDownloadConditions.Builder()
.requireWifi() // Also possible: .requireCharging() and .requireDeviceIdle()
.build()
FirebaseModelDownloader.getInstance()
.getModel("your_model", DownloadType.LOCAL_MODEL_UPDATE_IN_BACKGROUND,
conditions)
.addOnSuccessListener { model: CustomModel? ->
// Download complete. Depending on your app, you could enable the ML
// feature, or switch from the local model to the remote model, etc.
// The CustomModel object contains the local path of the model file,
// which you can use to instantiate a TensorFlow Lite interpreter.
val modelFile = model?.file
if (modelFile != null) {
interpreter = Interpreter(modelFile)
}
}
Java
CustomModelDownloadConditions conditions = new CustomModelDownloadConditions.Builder()
.requireWifi() // Also possible: .requireCharging() and .requireDeviceIdle()
.build();
FirebaseModelDownloader.getInstance()
.getModel("your_model", DownloadType.LOCAL_MODEL_UPDATE_IN_BACKGROUND, conditions)
.addOnSuccessListener(new OnSuccessListener<CustomModel>() {
@Override
public void onSuccess(CustomModel model) {
// Download complete. Depending on your app, you could enable the ML
// feature, or switch from the local model to the remote model, etc.
// The CustomModel object contains the local path of the model file,
// which you can use to instantiate a TensorFlow Lite interpreter.
File modelFile = model.getFile();
if (modelFile != null) {
interpreter = new Interpreter(modelFile);
}
}
});
Birçok uygulama, indirme görevini başlatma kodunda başlatır ancak Bu nedenle, herhangi bir noktada modeli kullanmanız gerekir.
3. Giriş verilerinde çıkarım yap
Modelinizin giriş ve çıkış şekillerini alın
TensorFlow Lite model yorumlayıcısı girdi olarak alır ve çıktı olarak üretir
çok boyutlu diziyi inceleyebilirsiniz. Bu diziler
byte
, int
, long
veya float
değerler. Bir modele veri iletmeden veya sonucunu kullanmadan önce şunları bilmeniz gerekir:
modelinizin kullandığı dizilerin sayısı ve boyutları ("şekil")
Modeli kendiniz oluşturduysanız veya modelin giriş ve çıkış biçimi veya dokümanlara aşina değilseniz bu bilgilere zaten sahip olabilirsiniz. şeklini ve veri türünü öğrenmek için Modelinizi incelemek için TensorFlow Lite yorumlayıcısı. Örneğin:
Python
import tensorflow as tf interpreter = tf.lite.Interpreter(model_path="your_model.tflite") interpreter.allocate_tensors() # Print input shape and type inputs = interpreter.get_input_details() print('{} input(s):'.format(len(inputs))) for i in range(0, len(inputs)): print('{} {}'.format(inputs[i]['shape'], inputs[i]['dtype'])) # Print output shape and type outputs = interpreter.get_output_details() print('\n{} output(s):'.format(len(outputs))) for i in range(0, len(outputs)): print('{} {}'.format(outputs[i]['shape'], outputs[i]['dtype']))
Örnek çıkış:
1 input(s): [ 1 224 224 3] <class 'numpy.float32'> 1 output(s): [1 1000] <class 'numpy.float32'>
Çevirmeni çalıştırma
Modelinizin giriş ve çıkışının biçimini belirledikten sonra ve gerekli tüm veriler üzerinde dönüşüm gerçekleştirebilirsiniz. modeliniz için doğru şekli sağlayan bir giriştir.Örneğin, giriş şekli
[1 224 224 3]
kayan nokta değeri varsa giriş oluşturabilirsiniz ByteBuffer
aşağıdaki örnekte gösterildiği gibi bir Bitmap
nesnesinden:
Kotlin+KTX
val bitmap = Bitmap.createScaledBitmap(yourInputImage, 224, 224, true)
val input = ByteBuffer.allocateDirect(224*224*3*4).order(ByteOrder.nativeOrder())
for (y in 0 until 224) {
for (x in 0 until 224) {
val px = bitmap.getPixel(x, y)
// Get channel values from the pixel value.
val r = Color.red(px)
val g = Color.green(px)
val b = Color.blue(px)
// Normalize channel values to [-1.0, 1.0]. This requirement depends on the model.
// For example, some models might require values to be normalized to the range
// [0.0, 1.0] instead.
val rf = (r - 127) / 255f
val gf = (g - 127) / 255f
val bf = (b - 127) / 255f
input.putFloat(rf)
input.putFloat(gf)
input.putFloat(bf)
}
}
Java
Bitmap bitmap = Bitmap.createScaledBitmap(yourInputImage, 224, 224, true);
ByteBuffer input = ByteBuffer.allocateDirect(224 * 224 * 3 * 4).order(ByteOrder.nativeOrder());
for (int y = 0; y < 224; y++) {
for (int x = 0; x < 224; x++) {
int px = bitmap.getPixel(x, y);
// Get channel values from the pixel value.
int r = Color.red(px);
int g = Color.green(px);
int b = Color.blue(px);
// Normalize channel values to [-1.0, 1.0]. This requirement depends
// on the model. For example, some models might require values to be
// normalized to the range [0.0, 1.0] instead.
float rf = (r - 127) / 255.0f;
float gf = (g - 127) / 255.0f;
float bf = (b - 127) / 255.0f;
input.putFloat(rf);
input.putFloat(gf);
input.putFloat(bf);
}
}
Ardından, modelin çıkışını içerecek kadar büyük bir ByteBuffer
ve
giriş arabelleğini ve çıkış arabelleğini TensorFlow Lite yorumlayıcısının
run()
yöntemini çağırın. Örneğin, [1 1000]
kayan nokta şeklinde bir çıktı şekli için
değerleri:
Kotlin+KTX
val bufferSize = 1000 * java.lang.Float.SIZE / java.lang.Byte.SIZE
val modelOutput = ByteBuffer.allocateDirect(bufferSize).order(ByteOrder.nativeOrder())
interpreter?.run(input, modelOutput)
Java
int bufferSize = 1000 * java.lang.Float.SIZE / java.lang.Byte.SIZE;
ByteBuffer modelOutput = ByteBuffer.allocateDirect(bufferSize).order(ByteOrder.nativeOrder());
interpreter.run(input, modelOutput);
Sonucu nasıl kullanacağınız, kullandığınız modele bağlıdır.
Örneğin, sınıflandırma yapıyorsanız, bir sonraki adım olarak sonuç dizinlerini, temsil ettikleri etiketlerle eşler:
Kotlin+KTX
modelOutput.rewind()
val probabilities = modelOutput.asFloatBuffer()
try {
val reader = BufferedReader(
InputStreamReader(assets.open("custom_labels.txt")))
for (i in probabilities.capacity()) {
val label: String = reader.readLine()
val probability = probabilities.get(i)
println("$label: $probability")
}
} catch (e: IOException) {
// File not found?
}
Java
modelOutput.rewind();
FloatBuffer probabilities = modelOutput.asFloatBuffer();
try {
BufferedReader reader = new BufferedReader(
new InputStreamReader(getAssets().open("custom_labels.txt")));
for (int i = 0; i < probabilities.capacity(); i++) {
String label = reader.readLine();
float probability = probabilities.get(i);
Log.i(TAG, String.format("%s: %1.4f", label, probability));
}
} catch (IOException e) {
// File not found?
}
Ek: Model güvenliği
TensorFlow Lite modellerinizi kullanıcılara nasıl sunduğunuz fark etmeksizin Firebase ML, Firebase ML bunları standart serileştirilmiş protobuf biçiminde şurada depolar: yerel depolama.
Teoride bu, herkesin modelinizi kopyalayabileceği anlamına gelir. Ancak, pratikte çoğu model, uygulamaya özgüdür ve her bir model rakiplerin parçalarının parçalarının sökülüp parçalarının parçalarının kodunuzu tekrarlamanız gerekir. Yine de, anahtar kelimeleri kullanmadan önce bu riskin farkında olmalısınız. bir model oluşturabilirsiniz.
Android API düzey 21 (Lollipop) ve daha yeni sürümlerde model dizini hariç tutulur.
Android API düzeyi 20 ve daha eski sürümlerde model bir dizine indirilir.
Uygulama gizli modunda com.google.firebase.ml.custom.models
olarak adlandırıldı
dahili depolama. BackupAgent
kullanarak dosya yedeklemeyi etkinleştirdiyseniz
bu dizini hariç tutabilirsiniz.