Apple প্ল্যাটফর্মে একটি কাস্টম TensorFlow Lite মডেল ব্যবহার করুন

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

পূর্বশর্ত

  • MLModelDownloader লাইব্রেরি শুধুমাত্র Swift-এর জন্য উপলব্ধ।
  • TensorFlow Lite শুধুমাত্র iOS 9 এবং নতুন ব্যবহারকারী ডিভাইসে চলে।

টেনসরফ্লো লাইট মডেল

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

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

Firebase এর সাথে TensorFlowLite ব্যবহার করতে, আপনাকে অবশ্যই CocoaPods ব্যবহার করতে হবে কারণ TensorFlowLite বর্তমানে সুইফট প্যাকেজ ম্যানেজারের সাথে ইনস্টলেশন সমর্থন করে না। MLModelDownloader কিভাবে ইনস্টল করবেন তার নির্দেশাবলীর জন্য CocoaPods ইনস্টলেশন গাইড দেখুন।

একবার ইন্সটল হয়ে গেলে, সেগুলি ব্যবহার করার জন্য Firebase এবং TensorFlowLite ইম্পোর্ট করুন।

সুইফট

import FirebaseMLModelDownloader
import TensorFlowLite

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

Firebase কনসোল বা Firebase অ্যাডমিন পাইথন এবং Node.js SDK ব্যবহার করে আপনার কাস্টম TensorFlow মডেলগুলি স্থাপন করুন৷ কাস্টম মডেল স্থাপন এবং পরিচালনা দেখুন।

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

2. ডিভাইসে মডেলটি ডাউনলোড করুন এবং একটি TensorFlow Lite ইন্টারপ্রেটার শুরু করুন৷

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

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

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

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

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

সুইফট

let conditions = ModelDownloadConditions(allowsCellularAccess: false)
ModelDownloader.modelDownloader()
    .getModel(name: "your_model",
              downloadType: .localModelUpdateInBackground,
              conditions: conditions) { result in
        switch (result) {
        case .success(let customModel):
            do {
                // 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.
                let interpreter = try Interpreter(modelPath: customModel.path)
            } catch {
                // Error. Bad model file?
            }
        case .failure(let error):
            // Download was unsuccessful. Don't enable ML features.
            print(error)
        }
}

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

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] ফ্লোটিং-পয়েন্ট মান থাকে, তাহলে আপনাকে নীচের উদাহরণের মতো একটি ফ্লোটিং-পয়েন্ট পরিসরে চিত্রের রঙের মান স্কেল করতে হতে পারে :

সুইফট

let image: CGImage = // Your input image
guard let context = CGContext(
  data: nil,
  width: image.width, height: image.height,
  bitsPerComponent: 8, bytesPerRow: image.width * 4,
  space: CGColorSpaceCreateDeviceRGB(),
  bitmapInfo: CGImageAlphaInfo.noneSkipFirst.rawValue
) else {
  return false
}

context.draw(image, in: CGRect(x: 0, y: 0, width: image.width, height: image.height))
guard let imageData = context.data else { return false }

var inputData = Data()
for row in 0 ..&lt; 224 {
  for col in 0 ..&lt; 224 {
    let offset = 4 * (row * context.width + col)
    // (Ignore offset 0, the unused alpha channel)
    let red = imageData.load(fromByteOffset: offset+1, as: UInt8.self)
    let green = imageData.load(fromByteOffset: offset+2, as: UInt8.self)
    let blue = imageData.load(fromByteOffset: offset+3, as: UInt8.self)

    // Normalize channel values to [0.0, 1.0]. This requirement varies
    // by model. For example, some models might require values to be
    // normalized to the range [-1.0, 1.0] instead, and others might
    // require fixed-point values or the original bytes.
    var normalizedRed = Float32(red) / 255.0
    var normalizedGreen = Float32(green) / 255.0
    var normalizedBlue = Float32(blue) / 255.0

    // Append normalized values to Data object in RGB order.
    let elementSize = MemoryLayout.size(ofValue: normalizedRed)
    var bytes = [UInt8](repeating: 0, count: elementSize)
    memcpy(&amp;bytes, &amp;normalizedRed, elementSize)
    inputData.append(&amp;bytes, count: elementSize)
    memcpy(&amp;bytes, &amp;normalizedGreen, elementSize)
    inputData.append(&amp;bytes, count: elementSize)
    memcpy(&ammp;bytes, &amp;normalizedBlue, elementSize)
    inputData.append(&amp;bytes, count: elementSize)
  }
}

তারপরে, আপনার ইনপুট NSData দোভাষীতে অনুলিপি করুন এবং এটি চালান:

সুইফট

try interpreter.allocateTensors()
try interpreter.copy(inputData, toInputAt: 0)
try interpreter.invoke()

আপনি দোভাষীর output(at:) পদ্ধতিতে কল করে মডেলের আউটপুট পেতে পারেন। আপনি কীভাবে আউটপুট ব্যবহার করবেন তা নির্ভর করে আপনি যে মডেলটি ব্যবহার করছেন তার উপর।

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

সুইফট

let output = try interpreter.output(at: 0)
let probabilities =
        UnsafeMutableBufferPointer<Float32>.allocate(capacity: 1000)
output.data.copyBytes(to: probabilities)

guard let labelPath = Bundle.main.path(forResource: "retrained_labels", ofType: "txt") else { return }
let fileContents = try? String(contentsOfFile: labelPath)
guard let labels = fileContents?.components(separatedBy: "\n") else { return }

for i in labels.indices {
    print("\(labels[i]): \(probabilities[i])")
}

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

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

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