Firebase/MLModelInterpreter লাইব্রেরির 0.20.0 সংস্করণে একটি নতুন getLatestModelFilePath() পদ্ধতি চালু করা হয়েছে, যা কাস্টম মডেলের ডিভাইসে অবস্থান খুঁজে বের করে। আপনি এই পদ্ধতিটি ব্যবহার করে সরাসরি একটি TensorFlow Lite Interpreter অবজেক্ট তৈরি করতে পারেন, যা আপনি Firebase এর ModelInterpreter র্যাপারের পরিবর্তে ব্যবহার করতে পারেন।
ভবিষ্যতে, এটিই পছন্দের পদ্ধতি। যেহেতু টেনসরফ্লো লাইট ইন্টারপ্রেটার সংস্করণটি আর ফায়ারবেস লাইব্রেরি সংস্করণের সাথে সংযুক্ত নয়, তাই আপনি যখনই চান টেনসরফ্লো লাইটের নতুন সংস্করণগুলিতে আপগ্রেড করার জন্য আরও নমনীয়তা পাবেন, অথবা আরও সহজেই কাস্টম টেনসরফ্লো লাইট বিল্ডগুলি ব্যবহার করতে পারবেন।
এই পৃষ্ঠাটি দেখায় কিভাবে আপনি ModelInterpreter ব্যবহার থেকে টেনসরফ্লো লাইট Interpreter মাইগ্রেট করতে পারেন।
১. প্রকল্প নির্ভরতা আপডেট করুন
আপনার প্রোজেক্টের পডফাইল আপডেট করে Firebase/MLModelInterpreter লাইব্রেরির (অথবা নতুন) সংস্করণ 0.20.0 এবং TensorFlow Lite লাইব্রেরি অন্তর্ভুক্ত করুন:
আগে
সুইফট
pod 'Firebase/MLModelInterpreter', '0.19.0'
অবজেক্টিভ-সি
pod 'Firebase/MLModelInterpreter', '0.19.0'
পরে
সুইফট
pod 'Firebase/MLModelInterpreter', '~> 0.20.0'
pod 'TensorFlowLiteSwift'
অবজেক্টিভ-সি
pod 'Firebase/MLModelInterpreter', '~> 0.20.0'
pod 'TensorFlowLiteObjC'
২. ফায়ারবেস মডেলইন্টারপ্রেটারের পরিবর্তে একটি টেনসরফ্লো লাইট ইন্টারপ্রেটার তৈরি করুন
Firebase ModelInterpreter তৈরি করার পরিবর্তে, getLatestModelFilePath() দিয়ে ডিভাইসে মডেলের অবস্থান পান এবং এটি ব্যবহার করে একটি TensorFlow Lite Interpreter তৈরি করুন।
আগে
সুইফট
let remoteModel = CustomRemoteModel(
name: "your_remote_model" // The name you assigned in the Firebase console.
)
interpreter = ModelInterpreter.modelInterpreter(remoteModel: remoteModel)
অবজেক্টিভ-সি
// Initialize using the name you assigned in the Firebase console.
FIRCustomRemoteModel *remoteModel =
[[FIRCustomRemoteModel alloc] initWithName:@"your_remote_model"];
interpreter = [FIRModelInterpreter modelInterpreterForRemoteModel:remoteModel];
পরে
সুইফট
let remoteModel = CustomRemoteModel(
name: "your_remote_model" // The name you assigned in the Firebase console.
)
ModelManager.modelManager().getLatestModelFilePath(remoteModel) { (remoteModelPath, error) in
guard error == nil, let remoteModelPath = remoteModelPath else { return }
do {
interpreter = try Interpreter(modelPath: remoteModelPath)
} catch {
// Error?
}
}
অবজেক্টিভ-সি
FIRCustomRemoteModel *remoteModel =
[[FIRCustomRemoteModel alloc] initWithName:@"your_remote_model"];
[[FIRModelManager modelManager] getLatestModelFilePath:remoteModel
completion:^(NSString * _Nullable filePath,
NSError * _Nullable error) {
if (error != nil || filePath == nil) { return; }
NSError *tfError = nil;
interpreter = [[TFLInterpreter alloc] initWithModelPath:filePath error:&tfError];
}];
৩. ইনপুট এবং আউটপুট প্রস্তুতি কোড আপডেট করুন
ModelInterpreter ব্যবহার করে, আপনি যখন এটি চালান তখন ইন্টারপ্রেটারে একটি ModelInputOutputOptions অবজেক্ট পাস করে মডেলের ইনপুট এবং আউটপুট আকার নির্দিষ্ট করতে পারেন।
TensorFlow Lite ইন্টারপ্রেটারের জন্য, আপনি মডেলের ইনপুট এবং আউটপুটের জন্য স্থান বরাদ্দ করার জন্য allocateTensors() কল করুন, তারপর আপনার ইনপুট ডেটা ইনপুট টেনসরগুলিতে অনুলিপি করুন।
উদাহরণস্বরূপ, যদি আপনার মডেলের ইনপুট আকৃতি [1 224 224 3] float মান এবং আউটপুট আকৃতি [1 1000] float মান হয়, তাহলে এই পরিবর্তনগুলি করুন:
আগে
সুইফট
let ioOptions = ModelInputOutputOptions()
do {
try ioOptions.setInputFormat(
index: 0,
type: .float32,
dimensions: [1, 224, 224, 3]
)
try ioOptions.setOutputFormat(
index: 0,
type: .float32,
dimensions: [1, 1000]
)
} catch let error as NSError {
print("Failed to set input or output format with error: \(error.localizedDescription)")
}
let inputs = ModelInputs()
do {
let inputData = Data()
// Then populate with input data.
try inputs.addInput(inputData)
} catch let error {
print("Failed to add input: \(error)")
}
interpreter.run(inputs: inputs, options: ioOptions) { outputs, error in
guard error == nil, let outputs = outputs else { return }
// Process outputs
// ...
}
অবজেক্টিভ-সি
FIRModelInputOutputOptions *ioOptions = [[FIRModelInputOutputOptions alloc] init];
NSError *error;
[ioOptions setInputFormatForIndex:0
type:FIRModelElementTypeFloat32
dimensions:@[@1, @224, @224, @3]
error:&error];
if (error != nil) { return; }
[ioOptions setOutputFormatForIndex:0
type:FIRModelElementTypeFloat32
dimensions:@[@1, @1000]
error:&error];
if (error != nil) { return; }
FIRModelInputs *inputs = [[FIRModelInputs alloc] init];
NSMutableData *inputData = [[NSMutableData alloc] initWithCapacity:0];
// Then populate with input data.
[inputs addInput:inputData error:&error];
if (error != nil) { return; }
[interpreter runWithInputs:inputs
options:ioOptions
completion:^(FIRModelOutputs * _Nullable outputs,
NSError * _Nullable error) {
if (error != nil || outputs == nil) {
return;
}
// Process outputs
// ...
}];
পরে
সুইফট
do {
try interpreter.allocateTensors()
let inputData = Data()
// Then populate with input data.
try interpreter.copy(inputData, toInputAt: 0)
try interpreter.invoke()
} catch let err {
print(err.localizedDescription)
}
অবজেক্টিভ-সি
NSError *error = nil;
[interpreter allocateTensorsWithError:&error];
if (error != nil) { return; }
TFLTensor *input = [interpreter inputTensorAtIndex:0 error:&error];
if (error != nil) { return; }
NSMutableData *inputData = [[NSMutableData alloc] initWithCapacity:0];
// Then populate with input data.
[input copyData:inputData error:&error];
if (error != nil) { return; }
[interpreter invokeWithError:&error];
if (error != nil) { return; }
৪. আউটপুট হ্যান্ডলিং কোড আপডেট করুন
অবশেষে, ModelOutputs অবজেক্টের output() পদ্ধতি ব্যবহার করে মডেলের আউটপুট পাওয়ার পরিবর্তে, ইন্টারপ্রেটার থেকে আউটপুট টেনসর নিন এবং এর ডেটা আপনার ব্যবহারের ক্ষেত্রে সুবিধাজনক যেকোনো কাঠামোতে রূপান্তর করুন।
উদাহরণস্বরূপ, যদি আপনি শ্রেণীবিভাগ করছেন, তাহলে আপনি নিম্নলিখিত পরিবর্তনগুলি করতে পারেন:
আগে
সুইফট
let output = try? outputs.output(index: 0) as? [[NSNumber]]
let probabilities = output?[0]
guard let labelPath = Bundle.main.path(
forResource: "custom_labels",
ofType: "txt"
) else { return }
let fileContents = try? String(contentsOfFile: labelPath)
guard let labels = fileContents?.components(separatedBy: "\n") else { return }
for i in 0 ..< labels.count {
if let probability = probabilities?[i] {
print("\(labels[i]): \(probability)")
}
}
অবজেক্টিভ-সি
// Get first and only output of inference with a batch size of 1
NSError *error;
NSArray *probabilites = [outputs outputAtIndex:0 error:&error][0];
if (error != nil) { return; }
NSString *labelPath = [NSBundle.mainBundle pathForResource:@"retrained_labels"
ofType:@"txt"];
NSString *fileContents = [NSString stringWithContentsOfFile:labelPath
encoding:NSUTF8StringEncoding
error:&error];
if (error != nil || fileContents == NULL) { return; }
NSArray<NSString *> *labels = [fileContents componentsSeparatedByString:@"\n"];
for (int i = 0; i < labels.count; i++) {
NSString *label = labels[i];
NSNumber *probability = probabilites[i];
NSLog(@"%@: %f", label, probability.floatValue);
}
পরে
সুইফট
do {
// After calling interpreter.invoke():
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: "custom_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])")
}
} catch let err {
print(err.localizedDescription)
}
অবজেক্টিভ-সি
NSError *error = nil;
TFLTensor *output = [interpreter outputTensorAtIndex:0 error:&error];
if (error != nil) { return; }
NSData *outputData = [output dataWithError:&error];
if (error != nil) { return; }
Float32 probabilities[outputData.length / 4];
[outputData getBytes:&probabilities length:outputData.length];
NSString *labelPath = [NSBundle.mainBundle pathForResource:@"custom_labels"
ofType:@"txt"];
NSString *fileContents = [NSString stringWithContentsOfFile:labelPath
encoding:NSUTF8StringEncoding
error:&error];
if (error != nil || fileContents == nil) { return; }
NSArray<NSString *> *labels = [fileContents componentsSeparatedByString:@"\n"];
for (int i = 0; i < labels.count; i++) {
NSLog(@"%@: %f", labels[i], probabilities[i]);
}