আপনার অ্যাপে যদি কাস্টম TensorFlow Lite মডেল ব্যবহার করা হয়, তাহলে আপনি আপনার মডেলগুলো ডেপ্লয় করতে Firebase ML ব্যবহার করতে পারেন। Firebase-এর মাধ্যমে মডেল ডেপ্লয় করে, আপনি আপনার অ্যাপের প্রাথমিক ডাউনলোডের আকার কমাতে পারেন এবং অ্যাপের নতুন সংস্করণ প্রকাশ না করেই এর ML মডেলগুলো আপডেট করতে পারেন। এছাড়াও, Remote Config এবং A/B Testing সাহায্যে, আপনি বিভিন্ন ব্যবহারকারী গোষ্ঠীকে গতিশীলভাবে ভিন্ন ভিন্ন মডেল পরিবেশন করতে পারেন।
পূর্বশর্ত
-
MLModelDownloaderলাইব্রেরিটি শুধুমাত্র সুইফটের জন্য উপলব্ধ। - TensorFlow Lite শুধুমাত্র iOS 9 এবং এর পরবর্তী সংস্করণ চালিত ডিভাইসগুলিতে চলে।
TensorFlow Lite মডেলগুলি
TensorFlow Lite মডেল হলো এমন ML মডেল যা মোবাইল ডিভাইসে চালানোর জন্য অপ্টিমাইজ করা হয়েছে। একটি TensorFlow Lite মডেল পেতে:
- আগে থেকে তৈরি কোনো মডেল ব্যবহার করুন, যেমন অফিসিয়াল টেনসরফ্লো লাইট মডেলগুলোর মধ্যে একটি।
- একটি TensorFlow মডেল, Keras মডেল, বা কংক্রিট ফাংশনকে TensorFlow Lite-এ রূপান্তর করুন।
শুরু করার আগে
Firebase-এর সাথে TensorFlowLite ব্যবহার করতে হলে আপনাকে অবশ্যই CocoaPods ব্যবহার করতে হবে, কারণ বর্তমানে Swift Package Manager-এর মাধ্যমে TensorFlowLite ইনস্টলেশন সমর্থন করে না। MLModelDownloader কীভাবে ইনস্টল করতে হয়, তার নির্দেশাবলীর জন্য CocoaPods ইনস্টলেশন গাইড দেখুন।
ইনস্টল হয়ে গেলে, সেগুলো ব্যবহার করার জন্য Firebase এবং TensorFlowLite ইম্পোর্ট করুন।
সুইফট
import FirebaseMLModelDownloader
import TensorFlowLite
১. আপনার মডেলটি স্থাপন করুন
Firebase কনসোল অথবা Firebase অ্যাডমিন পাইথন এবং Node.js SDK ব্যবহার করে আপনার কাস্টম TensorFlow মডেলগুলো ডিপ্লয় করুন। কাস্টম মডেল ডিপ্লয় এবং পরিচালনা দেখুন।
আপনার Firebase প্রজেক্টে একটি কাস্টম মডেল যোগ করার পর, আপনি আপনার নির্দিষ্ট করা নামটি ব্যবহার করে অ্যাপগুলোতে মডেলটিকে রেফারেন্স করতে পারেন। যেকোনো সময়, আপনি getModel() কল করে একটি নতুন TensorFlow Lite মডেল ডেপ্লয় করতে এবং ব্যবহারকারীদের ডিভাইসে নতুন মডেলটি ডাউনলোড করতে পারেন (নিচে দেখুন)।
২. মডেলটি ডিভাইসে ডাউনলোড করুন এবং একটি TensorFlow Lite ইন্টারপ্রেটার চালু করুন।
আপনার অ্যাপে TensorFlow Lite মডেল ব্যবহার করতে, প্রথমে Firebase ML SDK ব্যবহার করে মডেলটির সর্বশেষ সংস্করণ ডিভাইসে ডাউনলোড করুন। মডেল ডাউনলোড শুরু করতে, মডেল ডাউনলোডার-এর getModel() মেথডটি কল করুন এবং এর সাথে উল্লেখ করুন: মডেলটি আপলোড করার সময় আপনি যে নামটি দিয়েছিলেন, আপনি সর্বদা সর্বশেষ মডেলটি ডাউনলোড করতে চান কিনা, এবং কোন শর্তে ডাউনলোডের অনুমতি দিতে চান।
আপনি তিনটি ডাউনলোড পদ্ধতি থেকে বেছে নিতে পারেন:
| ডাউনলোডের ধরণ | বর্ণনা |
|---|---|
localModel | ডিভাইস থেকে স্থানীয় মডেলটি নিন। যদি কোনো স্থানীয় মডেল উপলব্ধ না থাকে, তবে এটি latestModel মতোই কাজ করে। আপনি যদি মডেল আপডেটের খোঁজ নিতে আগ্রহী না হন, তবে এই ডাউনলোড পদ্ধতিটি ব্যবহার করুন। উদাহরণস্বরূপ, আপনি মডেলের নাম সংগ্রহ করতে Remote Config ব্যবহার করছেন এবং সবসময় নতুন নামে মডেল আপলোড করেন (যা সুপারিশ করা হয়)। |
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)
}
}
অনেক অ্যাপ তাদের ইনিশিয়ালাইজেশন কোডে ডাউনলোডের কাজটি শুরু করে, কিন্তু মডেলটি ব্যবহার করার প্রয়োজন হওয়ার আগে যেকোনো সময়ে আপনি তা করতে পারেন।
৩. ইনপুট ডেটার উপর অনুমান সম্পাদন করুন
আপনার মডেলের ইনপুট এবং আউটপুট আকারগুলি পান
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 ..< 224 {
for col in 0 ..< 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(&bytes, &normalizedRed, elementSize)
inputData.append(&bytes, count: elementSize)
memcpy(&bytes, &normalizedGreen, elementSize)
inputData.append(&bytes, count: elementSize)
memcpy(&ammp;bytes, &normalizedBlue, elementSize)
inputData.append(&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])")
}
পরিশিষ্ট: মডেল নিরাপত্তা
আপনি আপনার TensorFlow Lite মডেলগুলোকে Firebase ML এর কাছে যেভাবেই উপলব্ধ করুন না কেন, Firebase ML সেগুলোকে লোকাল স্টোরেজে স্ট্যান্ডার্ড সিরিয়ালাইজড প্রোটোবাফ ফরম্যাটে সংরক্ষণ করে।
তাত্ত্বিকভাবে, এর অর্থ হলো যে কেউ আপনার মডেলটি নকল করতে পারে। তবে, বাস্তবে বেশিরভাগ মডেলই অ্যাপ্লিকেশন-নির্দিষ্ট এবং অপটিমাইজেশনের মাধ্যমে এতটাই দুর্বোধ্য থাকে যে, এর ঝুঁকিটা অনেকটা প্রতিযোগীদের দ্বারা আপনার কোড ডিসঅ্যাসেম্বল ও পুনরায় ব্যবহারের ঝুঁকির মতোই। তা সত্ত্বেও, আপনার অ্যাপে একটি কাস্টম মডেল ব্যবহার করার আগে এই ঝুঁকি সম্পর্কে আপনার সচেতন থাকা উচিত।