অ্যান্ড্রয়েডে এমএল কিটের সাথে অনুক্রমের জন্য একটি টেনসরফ্লো লাইট মডেল ব্যবহার করুন

আপনি একটি সঙ্গে-ডিভাইস অনুমান সম্পাদন করতে এমএল কিট ব্যবহার করতে পারেন TensorFlow লাইট মডেল।

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

তুমি শুরু করার আগে

  1. আপনি ইতিমধ্যে থাকে, তাহলে আপনার অ্যান্ড্রয়েড প্রকল্পের Firebase যোগ
  2. এমএল কিট অ্যান্ড্রয়েড লাইব্রেরির জন্য নির্ভরতা আপনার মডিউল (অ্যাপ্লিকেশান-স্তর) Gradle ফাইল (সাধারণত যোগ করুন app/build.gradle :)
    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. আপনি যে টেনসরফ্লো মডেলটি ব্যবহার করতে চান তা টেনসরফ্লো লাইট ফর্ম্যাটে রূপান্তর করুন। দেখুন TensorFlow লাইট নিখুঁত কনভার্টার: TOCO

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

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

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

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

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

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

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

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

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

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

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

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

android {

    // ...

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

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

মডেল লোড করুন

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

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

আপনি Firebase সঙ্গে আপনার মডেল হোস্ট, একটি তৈরি FirebaseCustomRemoteModel , বস্তুর নাম আপনার মডেলকে বরাদ্দ যখন আপনি এটি আপলোড উল্লেখ:

জাভা

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

কোটলিন+কেটিএক্স

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

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

জাভা

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.
            }
        });

কোটলিন+কেটিএক্স

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

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

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

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

জাভা

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

কোটলিন+কেটিএক্স

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

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

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

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

জাভা

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

কোটলিন+কেটিএক্স

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

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

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

জাভা

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);
                // ...
            }
        });

কোটলিন+কেটিএক্স

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() পদ্ধতি:

জাভা

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.
            }
        });

কোটলিন+কেটিএক্স

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 অবজেক্ট।

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

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

জাভা

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

কোটলিন+কেটিএক্স

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 অবজেক্ট হিসেবে নিম্নলিখিত উদাহরণে দেখানো:

জাভা

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;
    }
}

কোটলিন+কেটিএক্স

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 আপনার ইনপুট ডেটা সহ বস্তু, এবং এটি পাস এবং মডেল এর ইনপুট এবং আউটপুট স্পেসিফিকেশন মডেল অনুবাদক s 'এর run পদ্ধতি:

জাভা

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
                        // ...
                    }
                });

কোটলিন+কেটিএক্স

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() বস্তু সাফল্য শ্রোতার কাছে পাস করা হয়েছে পদ্ধতি। উদাহরণ স্বরূপ:

জাভা

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

কোটলিন+কেটিএক্স

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

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

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

জাভা

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]));
}

কোটলিন+কেটিএক্স

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 (Lollipop এ) ও নতুন তারিখে, মডেল একটি যে ডিরেক্টরি হয় ডাউনলোড করা হয় স্বয়ংক্রিয় ব্যাকআপ থেকে বাদ

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