আপনার অ্যাপে যদি কাস্টম TensorFlow Lite মডেল ব্যবহার করা হয়, তাহলে আপনি আপনার মডেলগুলো ডেপ্লয় করতে Firebase ML ব্যবহার করতে পারেন। Firebase-এর মাধ্যমে মডেল ডেপ্লয় করে, আপনি আপনার অ্যাপের প্রাথমিক ডাউনলোডের আকার কমাতে পারেন এবং অ্যাপের নতুন সংস্করণ প্রকাশ না করেই এর ML মডেলগুলো আপডেট করতে পারেন। এছাড়াও, Remote Config এবং A/B Testing সাহায্যে, আপনি বিভিন্ন ব্যবহারকারী গোষ্ঠীকে গতিশীলভাবে ভিন্ন ভিন্ন মডেল পরিবেশন করতে পারেন।
TensorFlow Lite মডেলগুলি
TensorFlow Lite মডেল হলো এমন ML মডেল যা মোবাইল ডিভাইসে চালানোর জন্য অপ্টিমাইজ করা হয়েছে। একটি TensorFlow Lite মডেল পেতে:
- আগে থেকে তৈরি কোনো মডেল ব্যবহার করুন, যেমন অফিসিয়াল টেনসরফ্লো লাইট মডেলগুলোর মধ্যে একটি।
- একটি TensorFlow মডেল, Keras মডেল, বা কংক্রিট ফাংশনকে TensorFlow Lite-এ রূপান্তর করুন।
শুরু করার আগে
- যদি আগে থেকে না করে থাকেন, তাহলে আপনার অ্যান্ড্রয়েড প্রজেক্টে ফায়ারবেস যোগ করুন ।
- আপনার মডিউল (অ্যাপ-লেভেল) গ্রেডল ফাইলে (সাধারণত
<project>/<app-module>/build.gradle.ktsঅথবা<project>/<app-module>/build.gradle), অ্যান্ড্রয়েডের জন্য Firebase ML মডেল ডাউনলোডার লাইব্রেরির ডিপেন্ডেন্সি যোগ করুন। লাইব্রেরির ভার্সনিং নিয়ন্ত্রণের জন্য আমরা Firebase Android BoM ব্যবহার করার পরামর্শ দিই।এছাড়াও, Firebase ML মডেল ডাউনলোডার সেট আপ করার অংশ হিসেবে, আপনাকে আপনার অ্যাপে TensorFlow Lite SDK যোগ করতে হবে।
dependencies { // Import the BoM for the Firebase platform implementation(platform("com.google.firebase:firebase-bom:34.11.0")) // 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 ব্যবহার করলে, আপনার অ্যাপ সর্বদা Firebase Android লাইব্রেরিগুলোর সামঞ্জস্যপূর্ণ সংস্করণ ব্যবহার করবে।
(বিকল্প) BoM ব্যবহার না করে ফায়ারবেস লাইব্রেরি নির্ভরতা যোগ করুন
আপনি যদি Firebase BoM ব্যবহার না করার সিদ্ধান্ত নেন, তাহলে আপনাকে প্রতিটি Firebase লাইব্রেরির ভার্সন তার ডিপেন্ডেন্সি লাইনে উল্লেখ করতে হবে।
মনে রাখবেন, আপনি যদি আপনার অ্যাপে একাধিক Firebase লাইব্রেরি ব্যবহার করেন, তাহলে আমরা লাইব্রেরির ভার্সনগুলো পরিচালনা করার জন্য BoM অফ মেটেরিয়ালস) ব্যবহার করার জন্য দৃঢ়ভাবে সুপারিশ করি, যা সব ভার্সনের সামঞ্জস্যতা নিশ্চিত করে।
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:26.0.1")
// Also add the dependency for the TensorFlow Lite library and specify its version implementation("org.tensorflow:tensorflow-lite:2.3.0") } - আপনার অ্যাপের ম্যানিফেস্টে ঘোষণা করুন যে ইন্টারনেট পারমিশন প্রয়োজন:
<uses-permission android:name="android.permission.INTERNET" />
১. আপনার মডেলটি স্থাপন করুন
Firebase কনসোল অথবা Firebase অ্যাডমিন পাইথন এবং Node.js SDK ব্যবহার করে আপনার কাস্টম TensorFlow মডেলগুলো ডিপ্লয় করুন। কাস্টম মডেল ডিপ্লয় এবং পরিচালনা দেখুন।
আপনার Firebase প্রজেক্টে একটি কাস্টম মডেল যোগ করার পর, আপনি আপনার নির্দিষ্ট করা নামটি ব্যবহার করে অ্যাপগুলোতে মডেলটিকে রেফারেন্স করতে পারেন। যেকোনো সময়, আপনি getModel() কল করে একটি নতুন TensorFlow Lite মডেল ডেপ্লয় করতে এবং ব্যবহারকারীদের ডিভাইসে নতুন মডেলটি ডাউনলোড করতে পারেন (নিচে দেখুন)।
২. মডেলটি ডিভাইসে ডাউনলোড করুন এবং একটি TensorFlow Lite ইন্টারপ্রেটার চালু করুন।
আপনার অ্যাপে TensorFlow Lite মডেল ব্যবহার করতে, প্রথমে Firebase ML SDK ব্যবহার করে মডেলটির সর্বশেষ সংস্করণ ডিভাইসে ডাউনলোড করুন। তারপর, মডেলটি দিয়ে একটি TensorFlow Lite ইন্টারপ্রেটার ইনস্ট্যানশিয়েট করুন। মডেল ডাউনলোড শুরু করতে, মডেল ডাউনলোডার-এর getModel() মেথডটি কল করুন এবং এর সাথে উল্লেখ করুন: মডেলটি আপলোড করার সময় আপনি যে নামটি দিয়েছিলেন, আপনি সর্বদা সর্বশেষ মডেলটি ডাউনলোড করতে চান কিনা, এবং কোন শর্তে ডাউনলোডের অনুমতি দিতে চান।
আপনি তিনটি ডাউনলোড পদ্ধতি থেকে বেছে নিতে পারেন:
| ডাউনলোডের ধরণ | বর্ণনা |
|---|---|
| স্থানীয় মডেল | ডিভাইস থেকে স্থানীয় মডেলটি নিন। যদি কোনো স্থানীয় মডেল উপলব্ধ না থাকে, তবে এটি LATEST_MODEL মতো কাজ করে। আপনি যদি মডেল আপডেটের জন্য পরীক্ষা করতে আগ্রহী না হন, তবে এই ডাউনলোড ধরণটি ব্যবহার করুন। উদাহরণস্বরূপ, আপনি মডেলের নাম সংগ্রহ করতে Remote Config ব্যবহার করছেন এবং আপনি সর্বদা নতুন নামে মডেল আপলোড করেন (যা সুপারিশ করা হয়)। |
| পটভূমিতে স্থানীয় মডেল আপডেট | ডিভাইস থেকে স্থানীয় মডেলটি নিন এবং ব্যাকগ্রাউন্ডে মডেলটি আপডেট করা শুরু করুন। যদি কোনো স্থানীয় মডেল উপলব্ধ না থাকে, তবে এটি LATEST_MODEL মতো কাজ করে। |
| সর্বশেষ মডেল | সর্বশেষ মডেলটি সংগ্রহ করুন। যদি স্থানীয় মডেলটি সর্বশেষ সংস্করণ হয়, তবে সেটিই ফেরত দিন। অন্যথায়, সর্বশেষ মডেলটি ডাউনলোড করুন। সর্বশেষ সংস্করণটি ডাউনলোড না হওয়া পর্যন্ত এই প্রক্রিয়াটি আটকে থাকবে (যা বাঞ্ছনীয় নয়)। শুধুমাত্র সেইসব ক্ষেত্রে এই প্রক্রিয়াটি ব্যবহার করুন যেখানে আপনার সুস্পষ্টভাবে সর্বশেষ সংস্করণটি প্রয়োজন। |
মডেলটি ডাউনলোড হয়েছে কিনা তা নিশ্চিত না করা পর্যন্ত আপনার মডেল-সম্পর্কিত কার্যকারিতা নিষ্ক্রিয় রাখা উচিত—যেমন, আপনার UI-এর কোনো অংশ ধূসর করে দেওয়া বা লুকিয়ে রাখা।
Kotlin
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);
}
}
});
অনেক অ্যাপ তাদের ইনিশিয়ালাইজেশন কোডে ডাউনলোডের কাজটি শুরু করে, কিন্তু মডেলটি ব্যবহার করার প্রয়োজন হওয়ার আগে যেকোনো সময়ে আপনি তা করতে পারেন।
৩. ইনপুট ডেটার উপর অনুমান সম্পাদন করুন
আপনার মডেলের ইনপুট এবং আউটপুট আকারগুলি পান
TensorFlow Lite মডেল ইন্টারপ্রেটার ইনপুট হিসেবে এক বা একাধিক বহুমাত্রিক অ্যারে গ্রহণ করে এবং আউটপুট হিসেবে তৈরি করে। এই অ্যারেগুলোতে byte , int , long বা float ভ্যালু থাকে। কোনো মডেলে ডেটা পাঠানোর বা তার ফলাফল ব্যবহার করার আগে, আপনার মডেল যে অ্যারেগুলো ব্যবহার করে সেগুলোর সংখ্যা এবং মাত্রা ("আকৃতি") সম্পর্কে আপনার অবশ্যই জানা থাকতে হবে।
যদি আপনি নিজে মডেলটি তৈরি করে থাকেন, অথবা যদি মডেলটির ইনপুট এবং আউটপুট ফরম্যাট নথিভুক্ত করা থাকে, তাহলে এই তথ্য আপনার কাছে আগে থেকেই থাকতে পারে। যদি আপনি আপনার মডেলের ইনপুট এবং আউটপুটের শেপ ও ডেটা টাইপ না জানেন, তাহলে আপনি আপনার মডেলটি পরীক্ষা করার জন্য TensorFlow Lite ইন্টারপ্রেটার ব্যবহার করতে পারেন। উদাহরণস্বরূপ:
পাইথন
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']))
উদাহরণ আউটপুট:
1 input(s): [ 1 224 224 3] <class 'numpy.float32'> 1 output(s): [1 1000] <class 'numpy.float32'>
ইন্টারপ্রেটারটি চালান
আপনার মডেলের ইনপুট এবং আউটপুটের ফরম্যাট নির্ধারণ করার পর, আপনার ইনপুট ডেটা সংগ্রহ করুন এবং আপনার মডেলের জন্য সঠিক আকৃতির ইনপুট পেতে ডেটার উপর প্রয়োজনীয় রূপান্তরগুলো সম্পাদন করুন। উদাহরণস্বরূপ, যদি আপনার কাছে [1 224 224 3] ফ্লোটিং-পয়েন্ট মানের ইনপুট আকারের একটি ইমেজ ক্লাসিফিকেশন মডেল থাকে, তাহলে আপনি নিম্নলিখিত উদাহরণে দেখানো উপায়ে একটি Bitmap অবজেক্ট থেকে একটি ইনপুট ByteBuffer তৈরি করতে পারেন:
Kotlin
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);
}
}
এরপর, মডেলের আউটপুট ধারণ করার জন্য যথেষ্ট বড় একটি ByteBuffer বরাদ্দ করুন এবং ইনপুট বাফার ও আউটপুট বাফারটি TensorFlow Lite ইন্টারপ্রেটারের run() মেথডে পাঠান। উদাহরণস্বরূপ, [1 1000] ফ্লোটিং-পয়েন্ট মানের আউটপুট আকারের জন্য:
Kotlin
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);
আপনি আউটপুটটি কীভাবে ব্যবহার করবেন তা আপনার ব্যবহৃত মডেলের ওপর নির্ভর করে।
উদাহরণস্বরূপ, যদি আপনি ক্লাসিফিকেশন করেন, তাহলে পরবর্তী পদক্ষেপ হিসেবে, আপনি ফলাফলের ইনডেক্সগুলোকে সেগুলোর প্রতিনিধিত্বকারী লেবেলগুলোর সাথে ম্যাপ করতে পারেন:
Kotlin
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?
}
পরিশিষ্ট: মডেল নিরাপত্তা
আপনি আপনার TensorFlow Lite মডেলগুলোকে Firebase ML এর কাছে যেভাবেই উপলব্ধ করুন না কেন, Firebase ML সেগুলোকে লোকাল স্টোরেজে স্ট্যান্ডার্ড সিরিয়ালাইজড প্রোটোবাফ ফরম্যাটে সংরক্ষণ করে।
তাত্ত্বিকভাবে, এর অর্থ হলো যে কেউ আপনার মডেলটি নকল করতে পারে। তবে, বাস্তবে বেশিরভাগ মডেলই অ্যাপ্লিকেশন-নির্দিষ্ট এবং অপটিমাইজেশনের মাধ্যমে এতটাই দুর্বোধ্য থাকে যে, এর ঝুঁকিটা অনেকটা প্রতিযোগীদের দ্বারা আপনার কোড ডিসঅ্যাসেম্বল ও পুনরায় ব্যবহারের ঝুঁকির মতোই। তা সত্ত্বেও, আপনার অ্যাপে একটি কাস্টম মডেল ব্যবহার করার আগে এই ঝুঁকি সম্পর্কে আপনার সচেতন থাকা উচিত।
অ্যান্ড্রয়েড এপিআই লেভেল ২১ (ললিপপ) এবং এর পরবর্তী সংস্করণগুলোতে, মডেলটি এমন একটি ডিরেক্টরিতে ডাউনলোড করা হয় যা স্বয়ংক্রিয় ব্যাকআপের আওতার বাইরে থাকে ।
অ্যান্ড্রয়েড এপিআই লেভেল ২০ এবং তার আগের সংস্করণগুলিতে, মডেলটি অ্যাপ-প্রাইভেট ইন্টারনাল স্টোরেজের com.google.firebase.ml.custom.models নামের একটি ডিরেক্টরিতে ডাউনলোড হয়। আপনি যদি BackupAgent ব্যবহার করে ফাইল ব্যাকআপ চালু করে থাকেন, তবে আপনি এই ডিরেক্টরিটি বাদ দিতে পারেন।