Android-এ ML Kit-এর সাহায্যে অনুমানের জন্য একটি TensorFlow Lite মডেল ব্যবহার করুন

আপনি একটি টেনসরফ্লো লাইট মডেলের সাথে ডিভাইসে অনুমান সম্পাদন করতে ML কিট ব্যবহার করতে পারেন।

এই API-এর জন্য Android SDK স্তর 16 (Jelly Bean) বা নতুন প্রয়োজন৷

আপনি শুরু করার আগে

  1. যদি আপনি ইতিমধ্যেই না করে থাকেন তাহলে আপনার Android প্রকল্পে Firebase যোগ করুন
  2. আপনার মডিউল (অ্যাপ-লেভেল) গ্রেডল ফাইলে (সাধারণত app/build.gradle ) ML কিট অ্যান্ড্রয়েড লাইব্রেরির নির্ভরতা যুক্ত করুন :
    apply plugin: 'com.android.application'
    apply plugin: 'com.google.gms.google-services'
    
    dependencies {
      // ...
    
      implementation 'com.google.firebase:firebase-ml-model-interpreter:22.0.3'
    }
  3. আপনি যে টেনসরফ্লো মডেলটি ব্যবহার করতে চান তা টেনসরফ্লো লাইট ফর্ম্যাটে রূপান্তর করুন। TOCO দেখুন: TensorFlow Lite অপটিমাইজিং কনভার্টার

হোস্ট বা আপনার মডেল বান্ডিল

আপনার অ্যাপে অনুমান করার জন্য আপনি একটি TensorFlow Lite মডেল ব্যবহার করার আগে, আপনাকে অবশ্যই মডেলটি ML Kit-এ উপলব্ধ করতে হবে। ML Kit TensorFlow Lite মডেল ব্যবহার করতে পারে যা দূরবর্তীভাবে Firebase ব্যবহার করে হোস্ট করা, অ্যাপ বাইনারি বা উভয়ের সাথে বান্ডিল করা।

Firebase-এ একটি মডেল হোস্ট করার মাধ্যমে, আপনি একটি নতুন অ্যাপ সংস্করণ প্রকাশ না করেই মডেলটি আপডেট করতে পারেন এবং আপনি ব্যবহারকারীদের বিভিন্ন সেটের কাছে গতিশীলভাবে বিভিন্ন মডেল পরিবেশন করতে Remote Config এবং A/B Testing ব্যবহার করতে পারেন।

আপনি যদি শুধুমাত্র Firebase-এর সাথে হোস্ট করে মডেলটি প্রদান করতে চান এবং এটিকে আপনার অ্যাপের সাথে বান্ডিল না করে, তাহলে আপনি আপনার অ্যাপের প্রাথমিক ডাউনলোডের আকার কমাতে পারেন। মনে রাখবেন, যদিও, মডেলটি আপনার অ্যাপের সাথে বান্ডিল না থাকলে, আপনার অ্যাপটি প্রথমবারের মতো মডেলটি ডাউনলোড না করা পর্যন্ত কোনো মডেল-সম্পর্কিত কার্যকারিতা উপলব্ধ হবে না।

আপনার অ্যাপের সাথে আপনার মডেলকে একত্রিত করে, আপনি নিশ্চিত করতে পারেন যে Firebase-হোস্টেড মডেলটি উপলব্ধ না থাকলে আপনার অ্যাপের ML বৈশিষ্ট্যগুলি এখনও কাজ করে।

Firebase-এ হোস্ট মডেল

Firebase এ আপনার TensorFlow Lite মডেল হোস্ট করতে:

  1. Firebase কনসোলের ML Kit বিভাগে, কাস্টম ট্যাবে ক্লিক করুন।
  2. কাস্টম মডেল যোগ করুন ক্লিক করুন (বা অন্য মডেল যোগ করুন )।
  3. একটি নাম নির্দিষ্ট করুন যা আপনার ফায়ারবেস প্রকল্পে আপনার মডেল শনাক্ত করতে ব্যবহার করা হবে, তারপর TensorFlow Lite মডেল ফাইল আপলোড করুন (সাধারণত .tflite বা .lite এ শেষ হয়)।
  4. আপনার অ্যাপের ম্যানিফেস্টে ঘোষণা করুন যে ইন্টারনেটের অনুমতি প্রয়োজন:
    <uses-permission android:name="android.permission.INTERNET" />

আপনি আপনার ফায়ারবেস প্রোজেক্টে একটি কাস্টম মডেল যোগ করার পরে, আপনি আপনার নির্দিষ্ট করা নাম ব্যবহার করে আপনার অ্যাপে মডেলটি উল্লেখ করতে পারেন। যে কোনো সময়ে, আপনি একটি নতুন TensorFlow Lite মডেল আপলোড করতে পারেন এবং আপনার অ্যাপটি নতুন মডেল ডাউনলোড করবে এবং অ্যাপটি পরবর্তী রিস্টার্ট হলে এটি ব্যবহার করা শুরু করবে। আপনি মডেল আপডেট করার চেষ্টা করার জন্য আপনার অ্যাপের জন্য প্রয়োজনীয় ডিভাইসের শর্তগুলি সংজ্ঞায়িত করতে পারেন (নীচে দেখুন)।

একটি অ্যাপ সহ মডেল বান্ডিল করুন

আপনার অ্যাপের সাথে আপনার TensorFlow Lite মডেল বান্ডিল করতে, মডেল ফাইলটি (সাধারণত .tflite বা .lite দিয়ে শেষ হয়) আপনার অ্যাপের assets/ ফোল্ডারে অনুলিপি করুন। (আপনাকে প্রথমে app/ ফোল্ডারটিতে ডান-ক্লিক করে, তারপর নতুন > ফোল্ডার > সম্পদ ফোল্ডারে ক্লিক করে ফোল্ডারটি তৈরি করতে হতে পারে।)

তারপরে, অ্যাপ তৈরি করার সময় Gradle মডেলগুলিকে সংকুচিত না করে তা নিশ্চিত করতে আপনার অ্যাপের build.gradle ফাইলে নিম্নলিখিতগুলি যোগ করুন:

android {

    // ...

    aaptOptions {
        noCompress "tflite"  // Your model's file extension: "tflite", "lite", etc.
    }
}

মডেল ফাইলটি অ্যাপ প্যাকেজে অন্তর্ভুক্ত করা হবে এবং একটি কাঁচা সম্পদ হিসাবে ML কিটের কাছে উপলব্ধ হবে৷

মডেল লোড করুন

আপনার অ্যাপে আপনার TensorFlow Lite মডেল ব্যবহার করতে, প্রথমে আপনার মডেল উপলব্ধ যেখানে অবস্থানের সাথে ML Kit কনফিগার করুন: দূরবর্তীভাবে Firebase ব্যবহার করে, স্থানীয় স্টোরেজে বা উভয়ই। আপনি যদি স্থানীয় এবং দূরবর্তী উভয় মডেল নির্দিষ্ট করেন, তাহলে আপনি দূরবর্তী মডেলটি ব্যবহার করতে পারেন যদি এটি উপলব্ধ থাকে, এবং যদি দূরবর্তী মডেল উপলব্ধ না হয় তবে স্থানীয়ভাবে-সঞ্চিত মডেলটিতে ফিরে যেতে পারেন।

একটি Firebase-হোস্টেড মডেল কনফিগার করুন

আপনি যদি আপনার মডেলটি Firebase-এর সাথে হোস্ট করেন, তাহলে একটি FirebaseCustomRemoteModel অবজেক্ট তৈরি করুন, আপনি মডেলটিকে আপলোড করার সময় যে নামটি নির্ধারণ করেছেন তা উল্লেখ করে:

Java

FirebaseCustomRemoteModel remoteModel =
        new FirebaseCustomRemoteModel.Builder("your_model").build();

Kotlin

val remoteModel = FirebaseCustomRemoteModel.Builder("your_model").build()

তারপরে, আপনি যে শর্তে ডাউনলোড করার অনুমতি দিতে চান তা উল্লেখ করে মডেল ডাউনলোড টাস্ক শুরু করুন। যদি মডেলটি ডিভাইসে না থাকে, বা মডেলটির একটি নতুন সংস্করণ উপলব্ধ থাকলে, টাস্কটি অসিঙ্ক্রোনাসভাবে Firebase থেকে মডেলটি ডাউনলোড করবে:

Java

FirebaseModelDownloadConditions conditions = new FirebaseModelDownloadConditions.Builder()
        .requireWifi()
        .build();
FirebaseModelManager.getInstance().download(remoteModel, conditions)
        .addOnCompleteListener(new OnCompleteListener<Void>() {
            @Override
            public void onComplete(@NonNull Task<Void> task) {
                // Success.
            }
        });

Kotlin

val conditions = FirebaseModelDownloadConditions.Builder()
    .requireWifi()
    .build()
FirebaseModelManager.getInstance().download(remoteModel, conditions)
    .addOnCompleteListener {
        // Success.
    }

অনেক অ্যাপ তাদের ইনিশিয়ালাইজেশন কোডে ডাউনলোড টাস্ক শুরু করে, কিন্তু মডেল ব্যবহার করার আগে আপনি যেকোন সময়ে তা করতে পারেন।

একটি স্থানীয় মডেল কনফিগার করুন

আপনি যদি আপনার অ্যাপের সাথে মডেলটি বান্ডিল করেন, তাহলে TensorFlow Lite মডেলের ফাইলের নাম উল্লেখ করে একটি FirebaseCustomLocalModel অবজেক্ট তৈরি করুন:

Java

FirebaseCustomLocalModel localModel = new FirebaseCustomLocalModel.Builder()
        .setAssetFilePath("your_model.tflite")
        .build();

Kotlin

val localModel = FirebaseCustomLocalModel.Builder()
    .setAssetFilePath("your_model.tflite")
    .build()

আপনার মডেল থেকে একটি দোভাষী তৈরি করুন

আপনি আপনার মডেল উত্সগুলি কনফিগার করার পরে, তাদের মধ্যে একটি থেকে একটি FirebaseModelInterpreter অবজেক্ট তৈরি করুন৷

আপনার যদি শুধুমাত্র স্থানীয়ভাবে বান্ডিল করা মডেল থাকে, তাহলে আপনার FirebaseCustomLocalModel অবজেক্ট থেকে একটি দোভাষী তৈরি করুন:

Java

FirebaseModelInterpreter interpreter;
try {
    FirebaseModelInterpreterOptions options =
            new FirebaseModelInterpreterOptions.Builder(localModel).build();
    interpreter = FirebaseModelInterpreter.getInstance(options);
} catch (FirebaseMLException e) {
    // ...
}

Kotlin

val options = FirebaseModelInterpreterOptions.Builder(localModel).build()
val interpreter = FirebaseModelInterpreter.getInstance(options)

আপনার যদি দূরবর্তীভাবে-হোস্ট করা মডেল থাকে, তাহলে আপনাকে এটি চালানোর আগে এটি ডাউনলোড করা হয়েছে কিনা তা পরীক্ষা করতে হবে। আপনি মডেল ম্যানেজারের isModelDownloaded() পদ্ধতি ব্যবহার করে মডেল ডাউনলোড টাস্কের স্থিতি পরীক্ষা করতে পারেন।

যদিও আপনাকে শুধুমাত্র দোভাষী চালানোর আগে এটি নিশ্চিত করতে হবে, যদি আপনার কাছে একটি দূরবর্তীভাবে-হোস্ট করা মডেল এবং একটি স্থানীয়ভাবে-বান্ডিল মডেল উভয়ই থাকে, তাহলে মডেল দোভাষীকে ইনস্ট্যান্ট করার সময় এই চেকটি সম্পাদন করা বোধগম্য হতে পারে: যদি রিমোট মডেল থেকে একটি দোভাষী তৈরি করুন এটি ডাউনলোড করা হয়েছে, এবং অন্যথায় স্থানীয় মডেল থেকে।

Java

FirebaseModelManager.getInstance().isModelDownloaded(remoteModel)
        .addOnSuccessListener(new OnSuccessListener<Boolean>() {
            @Override
            public void onSuccess(Boolean isDownloaded) {
                FirebaseModelInterpreterOptions options;
                if (isDownloaded) {
                    options = new FirebaseModelInterpreterOptions.Builder(remoteModel).build();
                } else {
                    options = new FirebaseModelInterpreterOptions.Builder(localModel).build();
                }
                FirebaseModelInterpreter interpreter = FirebaseModelInterpreter.getInstance(options);
                // ...
            }
        });

Kotlin

FirebaseModelManager.getInstance().isModelDownloaded(remoteModel)
    .addOnSuccessListener { isDownloaded -> 
    val options =
        if (isDownloaded) {
            FirebaseModelInterpreterOptions.Builder(remoteModel).build()
        } else {
            FirebaseModelInterpreterOptions.Builder(localModel).build()
        }
    val interpreter = FirebaseModelInterpreter.getInstance(options)
}

যদি আপনার কাছে শুধুমাত্র একটি দূরবর্তীভাবে হোস্ট করা মডেল থাকে, তাহলে আপনি মডেল-সম্পর্কিত কার্যকারিতা অক্ষম করুন-উদাহরণস্বরূপ, আপনার UI-এর ধূসর-আউট বা অংশ লুকান-যতক্ষণ না আপনি নিশ্চিত করেন যে মডেলটি ডাউনলোড করা হয়েছে। আপনি মডেল ম্যানেজারের download() পদ্ধতিতে একজন শ্রোতাকে সংযুক্ত করে এটি করতে পারেন:

Java

FirebaseModelManager.getInstance().download(remoteModel, conditions)
        .addOnSuccessListener(new OnSuccessListener<Void>() {
            @Override
            public void onSuccess(Void v) {
              // Download complete. Depending on your app, you could enable
              // the ML feature, or switch from the local model to the remote
              // model, etc.
            }
        });

Kotlin

FirebaseModelManager.getInstance().download(remoteModel, conditions)
    .addOnCompleteListener {
        // Download complete. Depending on your app, you could enable the ML
        // feature, or switch from the local model to the remote model, etc.
    }

মডেলের ইনপুট এবং আউটপুট উল্লেখ করুন

এর পরে, মডেল ইন্টারপ্রেটারের ইনপুট এবং আউটপুট ফর্ম্যাটগুলি কনফিগার করুন।

একটি টেনসরফ্লো লাইট মডেল ইনপুট হিসাবে নেয় এবং আউটপুট হিসাবে এক বা একাধিক বহুমাত্রিক অ্যারে তৈরি করে। এই অ্যারেগুলিতে হয় byte , int , long , বা float মান থাকে৷ আপনার মডেল ব্যবহার করে অ্যারেগুলির সংখ্যা এবং মাত্রা ("আকৃতি") সহ আপনাকে ML কিট কনফিগার করতে হবে৷

আপনি যদি আপনার মডেলের ইনপুট এবং আউটপুটের আকার এবং ডেটা টাইপ না জানেন, তাহলে আপনি আপনার মডেল পরিদর্শন করতে TensorFlow Lite Python ইন্টারপ্রেটার ব্যবহার করতে পারেন। যেমন:

import tensorflow as tf

interpreter = tf.lite.Interpreter(model_path="my_model.tflite")
interpreter.allocate_tensors()

# Print input shape and type
print(interpreter.get_input_details()[0]['shape'])  # Example: [1 224 224 3]
print(interpreter.get_input_details()[0]['dtype'])  # Example: <class 'numpy.float32'>

# Print output shape and type
print(interpreter.get_output_details()[0]['shape'])  # Example: [1 1000]
print(interpreter.get_output_details()[0]['dtype'])  # Example: <class 'numpy.float32'>

আপনি আপনার মডেলের ইনপুট এবং আউটপুটের বিন্যাস নির্ধারণ করার পরে, আপনি একটি FirebaseModelInputOutputOptions অবজেক্ট তৈরি করে আপনার অ্যাপের মডেল ইন্টারপ্রেটার কনফিগার করতে পারেন।

উদাহরণস্বরূপ, একটি ফ্লোটিং-পয়েন্ট ইমেজ ক্লাসিফিকেশন মডেল ইনপুট হিসাবে float মানগুলির একটি N x224x224x3 অ্যারে নিতে পারে, যা N 224x224 থ্রি-চ্যানেল (RGB) চিত্রগুলির একটি ব্যাচের প্রতিনিধিত্ব করে এবং আউটপুট হিসাবে 1000টি float মানগুলির একটি তালিকা তৈরি করে, প্রতিটিটি প্রতিনিধিত্ব করে সম্ভাব্যতা মডেলটি ভবিষ্যদ্বাণী করে এমন 1000টি বিভাগের একটির একটি সদস্য।

এই ধরনের একটি মডেলের জন্য, আপনি মডেল ইন্টারপ্রেটারের ইনপুট এবং আউটপুট কনফিগার করবেন যা নীচে দেখানো হয়েছে:

Java

FirebaseModelInputOutputOptions inputOutputOptions =
        new FirebaseModelInputOutputOptions.Builder()
                .setInputFormat(0, FirebaseModelDataType.FLOAT32, new int[]{1, 224, 224, 3})
                .setOutputFormat(0, FirebaseModelDataType.FLOAT32, new int[]{1, 5})
                .build();

Kotlin

val inputOutputOptions = FirebaseModelInputOutputOptions.Builder()
        .setInputFormat(0, FirebaseModelDataType.FLOAT32, intArrayOf(1, 224, 224, 3))
        .setOutputFormat(0, FirebaseModelDataType.FLOAT32, intArrayOf(1, 5))
        .build()

ইনপুট ডেটার উপর অনুমান সম্পাদন করুন

অবশেষে, মডেল ব্যবহার করে অনুমান সম্পাদন করতে, আপনার ইনপুট ডেটা পান এবং আপনার মডেলের জন্য সঠিক আকারের একটি ইনপুট অ্যারে পেতে প্রয়োজনীয় ডেটাতে যে কোনও রূপান্তর সম্পাদন করুন৷

উদাহরণ স্বরূপ, আপনার যদি [1 224 224 3] ফ্লোটিং-পয়েন্ট মানগুলির একটি ইনপুট আকৃতি সহ একটি চিত্র শ্রেণিবিন্যাস মডেল থাকে, তাহলে আপনি নিম্নলিখিত উদাহরণে দেখানো হিসাবে একটি Bitmap অবজেক্ট থেকে একটি ইনপুট অ্যারে তৈরি করতে পারেন:

Java

Bitmap bitmap = getYourInputImage();
bitmap = Bitmap.createScaledBitmap(bitmap, 224, 224, true);

int batchNum = 0;
float[][][][] input = new float[1][224][224][3];
for (int x = 0; x < 224; x++) {
    for (int y = 0; y < 224; y++) {
        int pixel = bitmap.getPixel(x, y);
        // Normalize channel values to [-1.0, 1.0]. This requirement varies by
        // model. For example, some models might require values to be normalized
        // to the range [0.0, 1.0] instead.
        input[batchNum][x][y][0] = (Color.red(pixel) - 127) / 128.0f;
        input[batchNum][x][y][1] = (Color.green(pixel) - 127) / 128.0f;
        input[batchNum][x][y][2] = (Color.blue(pixel) - 127) / 128.0f;
    }
}

Kotlin

val bitmap = Bitmap.createScaledBitmap(yourInputImage, 224, 224, true)

val batchNum = 0
val input = Array(1) { Array(224) { Array(224) { FloatArray(3) } } }
for (x in 0..223) {
    for (y in 0..223) {
        val pixel = bitmap.getPixel(x, y)
        // Normalize channel values to [-1.0, 1.0]. This requirement varies by
        // model. For example, some models might require values to be normalized
        // to the range [0.0, 1.0] instead.
        input[batchNum][x][y][0] = (Color.red(pixel) - 127) / 255.0f
        input[batchNum][x][y][1] = (Color.green(pixel) - 127) / 255.0f
        input[batchNum][x][y][2] = (Color.blue(pixel) - 127) / 255.0f
    }
}

তারপর, আপনার ইনপুট ডেটা দিয়ে একটি FirebaseModelInputs অবজেক্ট তৈরি করুন এবং মডেল ইন্টারপ্রেটারের run পদ্ধতিতে মডেলের ইনপুট এবং আউটপুট স্পেসিফিকেশন পাস করুন:

Java

FirebaseModelInputs inputs = new FirebaseModelInputs.Builder()
        .add(input)  // add() as many input arrays as your model requires
        .build();
firebaseInterpreter.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

val inputs = FirebaseModelInputs.Builder()
        .add(input) // add() as many input arrays as your model requires
        .build()
firebaseInterpreter.run(inputs, inputOutputOptions)
        .addOnSuccessListener { result ->
            // ...
        }
        .addOnFailureListener { e ->
            // Task failed with an exception
            // ...
        }

কল সফল হলে, আপনি সফল শ্রোতার কাছে পাস করা বস্তুর getOutput() পদ্ধতিতে কল করে আউটপুট পেতে পারেন। যেমন:

Java

float[][] output = result.getOutput(0);
float[] probabilities = output[0];

Kotlin

val output = result.getOutput<Array<FloatArray>>(0)
val probabilities = output[0]

আপনি কীভাবে আউটপুট ব্যবহার করবেন তা নির্ভর করে আপনি যে মডেলটি ব্যবহার করছেন তার উপর।

উদাহরণ স্বরূপ, আপনি যদি শ্রেণীবিন্যাস সম্পাদন করছেন, পরবর্তী পদক্ষেপ হিসাবে, আপনি ফলাফলের সূচীগুলিকে তারা প্রতিনিধিত্ব করে এমন লেবেলে ম্যাপ করতে পারেন:

Java

BufferedReader reader = new BufferedReader(
        new InputStreamReader(getAssets().open("retrained_labels.txt")));
for (int i = 0; i < probabilities.length; i++) {
    String label = reader.readLine();
    Log.i("MLKit", String.format("%s: %1.4f", label, probabilities[i]));
}

Kotlin

val reader = BufferedReader(
        InputStreamReader(assets.open("retrained_labels.txt")))
for (i in probabilities.indices) {
    val label = reader.readLine()
    Log.i("MLKit", String.format("%s: %1.4f", label, probabilities[i]))
}

পরিশিষ্ট: মডেল নিরাপত্তা

আপনি ML Kit-এ আপনার TensorFlow Lite মডেলগুলিকে যেভাবে উপলব্ধ করুন না কেন, ML Kit স্থানীয় স্টোরেজে স্ট্যান্ডার্ড সিরিয়ালাইজড প্রোটোবাফ ফর্ম্যাটে সেগুলি সঞ্চয় করে৷

তত্ত্বগতভাবে, এর মানে হল যে কেউ আপনার মডেল অনুলিপি করতে পারে। যাইহোক, বাস্তবে, বেশিরভাগ মডেলগুলি এতটাই অ্যাপ্লিকেশন-নির্দিষ্ট এবং অপ্টিমাইজেশান দ্বারা অস্পষ্ট যে ঝুঁকি প্রতিযোগীদের বিচ্ছিন্ন করা এবং আপনার কোড পুনরায় ব্যবহার করার মতোই। তবুও, আপনার অ্যাপে একটি কাস্টম মডেল ব্যবহার করার আগে আপনার এই ঝুঁকি সম্পর্কে সচেতন হওয়া উচিত।

অ্যান্ড্রয়েড এপিআই লেভেল 21 (ললিপপ) এবং নতুনটিতে, মডেলটি একটি ডিরেক্টরিতে ডাউনলোড করা হয় যা স্বয়ংক্রিয় ব্যাকআপ থেকে বাদ দেওয়া হয়

অ্যান্ড্রয়েড এপিআই লেভেল 20 এবং তার বেশি বয়সে, মডেলটিকে অ্যাপ-প্রাইভেট ইন্টারনাল স্টোরেজে com.google.firebase.ml.custom.models নামে একটি ডিরেক্টরিতে ডাউনলোড করা হয়। আপনি যদি BackupAgent ব্যবহার করে ফাইল ব্যাকআপ সক্ষম করেন, তাহলে আপনি এই ডিরেক্টরিটি বাদ দিতে বেছে নিতে পারেন।