نسخه 22.0.2 کتابخانه firebase-ml-model-interpreter
یک متد getLatestModelFile()
جدید را معرفی می کند که مکان را روی دستگاه مدل های سفارشی دریافت می کند. میتوانید از این روش برای نمونهسازی مستقیم یک شی Interpreter
TensorFlow Lite استفاده کنید، که میتوانید به جای پوشش FirebaseModelInterpreter
از آن استفاده کنید.
در آینده، این رویکرد ارجح است. از آنجایی که نسخه مفسر TensorFlow Lite دیگر با نسخه کتابخانه Firebase همراه نیست، انعطاف پذیری بیشتری برای ارتقاء به نسخه های جدید TensorFlow Lite در صورت تمایل دارید، یا آسان تر از ساخت های سفارشی TensorFlow Lite استفاده کنید.
این صفحه نشان می دهد که چگونه می توانید از FirebaseModelInterpreter
به Interpreter
TensorFlow Lite مهاجرت کنید.
1. وابستگی های پروژه را به روز کنید
وابستگی های پروژه خود را به روز کنید تا شامل نسخه 22.0.2 کتابخانه firebase-ml-model-interpreter
(یا جدیدتر) و کتابخانه tensorflow-lite
شود:
قبل از
implementation("com.google.firebase:firebase-ml-model-interpreter:22.0.1")
بعد از
implementation("com.google.firebase:firebase-ml-model-interpreter:22.0.2")
implementation("org.tensorflow:tensorflow-lite:2.0.0")
2. یک مفسر TensorFlow Lite به جای FirebaseModelInterpreter ایجاد کنید
به جای ایجاد FirebaseModelInterpreter
، مکان مدل را در دستگاه با getLatestModelFile()
دریافت کنید و از آن برای ایجاد یک Interpreter
TensorFlow Lite استفاده کنید.
قبل از
Kotlin+KTX
val remoteModel = FirebaseCustomRemoteModel.Builder("your_model").build()
val options = FirebaseModelInterpreterOptions.Builder(remoteModel).build()
val interpreter = FirebaseModelInterpreter.getInstance(options)
Java
FirebaseCustomRemoteModel remoteModel =
new FirebaseCustomRemoteModel.Builder("your_model").build();
FirebaseModelInterpreterOptions options =
new FirebaseModelInterpreterOptions.Builder(remoteModel).build();
FirebaseModelInterpreter interpreter = FirebaseModelInterpreter.getInstance(options);
بعد از
Kotlin+KTX
val remoteModel = FirebaseCustomRemoteModel.Builder("your_model").build()
FirebaseModelManager.getInstance().getLatestModelFile(remoteModel)
.addOnCompleteListener { task ->
val modelFile = task.getResult()
if (modelFile != null) {
// Instantiate an org.tensorflow.lite.Interpreter object.
interpreter = Interpreter(modelFile)
}
}
Java
FirebaseCustomRemoteModel remoteModel =
new FirebaseCustomRemoteModel.Builder("your_model").build();
FirebaseModelManager.getInstance().getLatestModelFile(remoteModel)
.addOnCompleteListener(new OnCompleteListener<File>() {
@Override
public void onComplete(@NonNull Task<File> task) {
File modelFile = task.getResult();
if (modelFile != null) {
// Instantiate an org.tensorflow.lite.Interpreter object.
Interpreter interpreter = new Interpreter(modelFile);
}
}
});
3. کد آماده سازی ورودی و خروجی را به روز کنید
با FirebaseModelInterpreter
، اشکال ورودی و خروجی مدل را با ارسال یک شی FirebaseModelInputOutputOptions
به مفسر هنگام اجرای آن مشخص میکنید.
برای مفسر TensorFlow Lite، به جای آن، اشیاء ByteBuffer
را با اندازه مناسب برای ورودی و خروجی مدل خود اختصاص می دهید.
برای مثال، اگر مدل شما دارای شکل ورودی [1 224 224 3] مقادیر float
و شکل خروجی [1 1000] مقادیر float
است، این تغییرات را انجام دهید:
قبل از
Kotlin+KTX
val inputOutputOptions = FirebaseModelInputOutputOptions.Builder()
.setInputFormat(0, FirebaseModelDataType.FLOAT32, intArrayOf(1, 224, 224, 3))
.setOutputFormat(0, FirebaseModelDataType.FLOAT32, intArrayOf(1, 1000))
.build()
val input = ByteBuffer.allocateDirect(224*224*3*4).order(ByteOrder.nativeOrder())
// Then populate with input data.
val inputs = FirebaseModelInputs.Builder()
.add(input)
.build()
interpreter.run(inputs, inputOutputOptions)
.addOnSuccessListener { outputs ->
// ...
}
.addOnFailureListener {
// Task failed with an exception.
// ...
}
Java
FirebaseModelInputOutputOptions inputOutputOptions =
new FirebaseModelInputOutputOptions.Builder()
.setInputFormat(0, FirebaseModelDataType.FLOAT32, new int[]{1, 224, 224, 3})
.setOutputFormat(0, FirebaseModelDataType.FLOAT32, new int[]{1, 1000})
.build();
float[][][][] input = new float[1][224][224][3];
// Then populate with input data.
FirebaseModelInputs inputs = new FirebaseModelInputs.Builder()
.add(input)
.build();
interpreter.run(inputs, inputOutputOptions)
.addOnSuccessListener(
new OnSuccessListener<FirebaseModelOutputs>() {
@Override
public void onSuccess(FirebaseModelOutputs result) {
// ...
}
})
.addOnFailureListener(
new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
// Task failed with an exception
// ...
}
});
بعد از
Kotlin+KTX
val inBufferSize = 1 * 224 * 224 * 3 * java.lang.Float.SIZE / java.lang.Byte.SIZE
val inputBuffer = ByteBuffer.allocateDirect(inBufferSize).order(ByteOrder.nativeOrder())
// Then populate with input data.
val outBufferSize = 1 * 1000 * java.lang.Float.SIZE / java.lang.Byte.SIZE
val outputBuffer = ByteBuffer.allocateDirect(outBufferSize).order(ByteOrder.nativeOrder())
interpreter.run(inputBuffer, outputBuffer)
Java
int inBufferSize = 1 * 224 * 224 * 3 * java.lang.Float.SIZE / java.lang.Byte.SIZE;
ByteBuffer inputBuffer =
ByteBuffer.allocateDirect(inBufferSize).order(ByteOrder.nativeOrder());
// Then populate with input data.
int outBufferSize = 1 * 1000 * java.lang.Float.SIZE / java.lang.Byte.SIZE;
ByteBuffer outputBuffer =
ByteBuffer.allocateDirect(outBufferSize).order(ByteOrder.nativeOrder());
interpreter.run(inputBuffer, outputBuffer);
4. کد مدیریت خروجی را به روز کنید
در نهایت، به جای دریافت خروجی مدل با متد getOutput()
شی FirebaseModelOutputs
، خروجی ByteBuffer
را به هر ساختاری که برای مورد استفاده شما مناسب است تبدیل کنید.
به عنوان مثال، اگر در حال انجام طبقه بندی هستید، ممکن است تغییراتی مانند موارد زیر ایجاد کنید:
قبل از
Kotlin+KTX
val output = result.getOutput(0)
val probabilities = output[0]
try {
val reader = BufferedReader(InputStreamReader(assets.open("custom_labels.txt")))
for (probability in probabilities) {
val label: String = reader.readLine()
println("$label: $probability")
}
} catch (e: IOException) {
// File not found?
}
Java
float[][] output = result.getOutput(0);
float[] probabilities = output[0];
try {
BufferedReader reader = new BufferedReader(
new InputStreamReader(getAssets().open("custom_labels.txt")));
for (float probability : probabilities) {
String label = reader.readLine();
Log.i(TAG, String.format("%s: %1.4f", label, probability));
}
} catch (IOException e) {
// File not found?
}
بعد از
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?
}