Join us for Firebase Summit on November 10, 2021. Tune in to learn how Firebase can help you accelerate app development, release with confidence, and scale with ease. Register

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

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

TensorFlow লাইট মডেল

TensorFlow Lite মডেলগুলি ML মডেল যা মোবাইল ডিভাইসে চালানোর জন্য অপ্টিমাইজ করা হয়। একটি TensorFlow লাইট মডেল পেতে:

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

  1. আপনি ইতিমধ্যে থাকে, তাহলে আপনার অ্যান্ড্রয়েড প্রকল্পের Firebase যোগ
  2. ব্যবহার Firebase অ্যান্ড্রয়েড Bom , আপনার মডিউল (অ্যাপ্লিকেশান-স্তর) Gradle ফাইল (সাধারণত Firebase এমএল মডেল ডাউনলোডার অ্যান্ড্রয়েড লাইব্রেরির জন্য নির্ভরতা ঘোষণা app/build.gradle )।

    এছাড়াও, ফায়ারবেস এমএল মডেল ডাউনলোডার স্থাপনের অংশ হিসাবে, আপনাকে আপনার অ্যাপে টেন্সরফ্লো লাইট এসডিকে যুক্ত করতে হবে।

    জাভা

    dependencies {
        // Import the BoM for the Firebase platform
        implementation platform('com.google.firebase:firebase-bom:28.4.2')
    
        // Declare 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 declare the dependency for the TensorFlow Lite library and specify its version implementation 'org.tensorflow:tensorflow-lite:2.3.0'
    }

    ব্যবহারের Firebase অ্যান্ড্রয়েড Bom , আপনার অ্যাপ্লিকেশন সবসময় Firebase অ্যান্ড্রয়েড লাইব্রেরি সামঞ্জস্যপূর্ণ সংস্করণ ব্যবহার করবে।

    (বিকল্প) Bom ব্যবহার না করেই Firebase গ্রন্থাগার নির্ভরতা ঘোষণা

    আপনি যদি Firebase BoM ব্যবহার না করার সিদ্ধান্ত নেন, তাহলে আপনাকে অবশ্যই প্রতিটি Firebase লাইব্রেরির সংস্করণ তার নির্ভরতা লাইনে নির্দিষ্ট করতে হবে।

    মনে রাখবেন যদি আপনি আপনার অ্যাপ্লিকেশন একাধিক Firebase লাইব্রেরি ব্যবহার করেন তখন আমরা অত্যন্ত গ্রন্থাগার সংস্করণ, যা নিশ্চিত করে যে সমস্ত সংস্করণের সামঞ্জস্যপূর্ণ পরিচালনা করতে Bom ব্যবহার সুপারিশ।

    dependencies {
        // Declare 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:24.0.0'
    // Also declare the dependency for the TensorFlow Lite library and specify its version implementation 'org.tensorflow:tensorflow-lite:2.3.0'
    }

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

    dependencies {
        // Import the BoM for the Firebase platform
        implementation platform('com.google.firebase:firebase-bom:28.4.2')
    
        // Declare 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-ktx'
    // Also declare the dependency for the TensorFlow Lite library and specify its version implementation 'org.tensorflow:tensorflow-lite:2.3.0'
    }

    ব্যবহারের Firebase অ্যান্ড্রয়েড Bom , আপনার অ্যাপ্লিকেশন সবসময় Firebase অ্যান্ড্রয়েড লাইব্রেরি সামঞ্জস্যপূর্ণ সংস্করণ ব্যবহার করবে।

    (বিকল্প) Bom ব্যবহার না করেই Firebase গ্রন্থাগার নির্ভরতা ঘোষণা

    আপনি যদি Firebase BoM ব্যবহার না করার সিদ্ধান্ত নেন, তাহলে আপনাকে অবশ্যই প্রতিটি Firebase লাইব্রেরির সংস্করণ তার নির্ভরতা লাইনে নির্দিষ্ট করতে হবে।

    মনে রাখবেন যদি আপনি আপনার অ্যাপ্লিকেশন একাধিক Firebase লাইব্রেরি ব্যবহার করেন তখন আমরা অত্যন্ত গ্রন্থাগার সংস্করণ, যা নিশ্চিত করে যে সমস্ত সংস্করণের সামঞ্জস্যপূর্ণ পরিচালনা করতে Bom ব্যবহার সুপারিশ।

    dependencies {
        // Declare 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-ktx:24.0.0'
    // Also declare the dependency for the TensorFlow Lite library and specify its version implementation 'org.tensorflow:tensorflow-lite:2.3.0'
    }
  3. : আপনার অ্যাপ্লিকেশনের স্পষ্ট ঘোষণা করিতেছি যে, ইন্টারনেট অনুমতি প্রয়োজন বোধ করা হয় ইন
    <uses-permission android:name="android.permission.INTERNET" />

1. আপনার মডেল স্থাপন করুন

ফায়ারবেস কনসোল অথবা ফায়ারবেস অ্যাডমিন পাইথন এবং নোড.জেএস এসডিকে ব্যবহার করে আপনার কাস্টম টেন্সরফ্লো মডেলগুলি স্থাপন করুন। দেখুন এবং স্থাপন কাস্টম মডেল পরিচালনা করে

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

2. ডিভাইসে মডেলটি ডাউনলোড করুন এবং একটি TensorFlow Lite দোভাষী আরম্ভ করুন

আপনার অ্যাপে আপনার টেন্সরফ্লো লাইট মডেলটি ব্যবহার করতে, প্রথমে ডিভাইসে মডেলের সর্বশেষ সংস্করণটি ডাউনলোড করতে Firebase ML SDK ব্যবহার করুন। তারপরে, মডেলের সাথে একটি TensorFlow Lite দোভাষী তাত্ক্ষণিক করুন।

মডেল ডাউনলোড শুরু করতে, মডেল ডাউনলোডার এর কল getModel() , পদ্ধতি আপনি যে নামটি মডেল নিয়োগ যখন আপনি এটি আপলোড, আপনি সবসময় সর্বশেষ মডেল ডাউনলোড করতে চান কিনা, এবং শর্ত যার অধীনে আপনি ডাউনলোড অনুমতি দিতে চান উল্লেখ।

আপনি তিনটি ডাউনলোড আচরণ থেকে চয়ন করতে পারেন:

ডাউনলোড টাইপ বর্ণনা
LOCAL_MODEL ডিভাইস থেকে স্থানীয় মডেল পান। যদি কোন স্থানীয় মডেল পাওয়া যায়, মত এই আচরণ করবে হয় LATEST_MODEL । আপনি মডেল আপডেট চেক করতে আগ্রহী না হলে এই ডাউনলোড টাইপটি ব্যবহার করুন। উদাহরণস্বরূপ, আপনি মডেলের নাম পুনরুদ্ধার করতে রিমোট কনফিগ ব্যবহার করছেন এবং আপনি সর্বদা নতুন নামের অধীনে মডেলগুলি আপলোড করেন (প্রস্তাবিত)।
LOCAL_MODEL_UPDATE_IN_BACKGROUND ডিভাইস থেকে স্থানীয় মডেল পান এবং পটভূমিতে মডেল আপডেট করা শুরু করুন। যদি কোন স্থানীয় মডেল পাওয়া যায়, মত এই আচরণ করবে হয় LATEST_MODEL
সর্বশেষ মডেল সর্বশেষ মডেল পান। যদি স্থানীয় মডেলটি সর্বশেষ সংস্করণ হয়, তাহলে স্থানীয় মডেলটি ফেরত দেয়। অন্যথায়, সর্বশেষ মডেলটি ডাউনলোড করুন। সর্বশেষ সংস্করণটি ডাউনলোড না হওয়া পর্যন্ত এই আচরণটি অবরুদ্ধ থাকবে (প্রস্তাবিত নয়)। এই আচরণটি শুধুমাত্র সেই ক্ষেত্রে ব্যবহার করুন যেখানে আপনার স্পষ্টভাবে সর্বশেষ সংস্করণ প্রয়োজন।

আপনার মডেল-সম্পর্কিত কার্যকারিতা অক্ষম করা উচিত-উদাহরণস্বরূপ, গ্রে-আউট বা আপনার UI- এর কিছু অংশ লুকান — যতক্ষণ না আপনি নিশ্চিত করেছেন যে মডেলটি ডাউনলোড হয়েছে।

জাভা

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

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

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

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

3. ইনপুট তথ্য উপর অনুমান সঞ্চালন

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

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] ফ্লোটিং পয়েন্ট মান, আপনি একটি ইনপুট উৎপন্ন পারে ByteBuffer A থেকে Bitmap অবজেক্ট হিসেবে নিম্নলিখিত উদাহরণে দেখানো:

জাভা

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

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

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

তারপরে, এক বরাদ্দ ByteBuffer বৃহৎ যথেষ্ট মডেলের আউটপুট থাকে এবং TensorFlow লাইট অনুবাদক এর ইনপুট বাফার এবং আউটপুট বাফার পাস run() পদ্ধতি। উদাহরণস্বরূপ, একজন আউটপুট আকৃতি জন্য [1 1000] ফ্লোটিং পয়েন্ট মান:

জাভা

int bufferSize = 1000 * java.lang.Float.SIZE / java.lang.Byte.SIZE;
ByteBuffer modelOutput = ByteBuffer.allocateDirect(bufferSize).order(ByteOrder.nativeOrder());
interpreter.run(input, modelOutput);

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

val bufferSize = 1000 * java.lang.Float.SIZE / java.lang.Byte.SIZE
val modelOutput = ByteBuffer.allocateDirect(bufferSize).order(ByteOrder.nativeOrder())
interpreter?.run(input, modelOutput)

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

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

জাভা

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

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

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

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

আপনি আপনার টেন্সরফ্লো লাইট মডেলগুলিকে ফায়ারবেস এমএল -এ কীভাবে উপলব্ধ করবেন তা নির্বিশেষে, ফায়ারবেস এমএল সেগুলি স্থানীয় স্টোরেজে স্ট্যান্ডার্ড সিরিয়ালাইজড প্রোটোবফ ফর্ম্যাটে সংরক্ষণ করে।

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

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

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