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 এমএল ব্যবহার করতে পারেন। ফায়ারবেসের সাথে মডেল মোতায়েন করে, আপনি আপনার অ্যাপের প্রাথমিক ডাউনলোড সাইজ কমাতে পারেন এবং আপনার অ্যাপের নতুন সংস্করণ প্রকাশ না করেই আপনার অ্যাপের এমএল মডেল আপডেট করতে পারেন। এবং, রিমোট কনফিগ এবং এ/বি টেস্টিং এর মাধ্যমে, আপনি গতিশীলভাবে ব্যবহারকারীদের বিভিন্ন সেটকে বিভিন্ন মডেল পরিবেশন করতে পারেন।

পূর্বশর্ত

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

TensorFlow লাইট মডেল

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

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

  1. আপনি ইতিমধ্যে আপনার অ্যাপ্লিকেশানে Firebase করে তাহলে, এ পদক্ষেপগুলি অনুসরণ করে তা করতে শুরু করার নির্দেশিকা
  2. আপনার পডফাইলে ফায়ারবেস অন্তর্ভুক্ত করুন:

    সুইফট

    pod 'Firebase/MLModelDownloader'
    pod 'TensorFlowLiteSwift'
    
    আপনি আপনার প্রকল্পের Pods ইনস্টল অথবা আপডেট করার পরে, নিশ্চিত করুন তার ব্যবহার করে আপনার Xcode প্রকল্প খুলতে হতে .xcworkspace
  3. আপনার অ্যাপে, Firebase আমদানি করুন:

    সুইফট

    import Firebase
    import TensorFlowLite
    

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

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

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

2. ডিভাইসে মডেলটি ডাউনলোড করুন এবং একটি 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()

আপনি ব্যাখ্যাকারী ডাকে মডেলের ouput পেতে পারেন 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])")
}

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

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

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