আপনার অ্যাপে একটি কাস্টম মডেল সংহত করুন

১. শুরু করার আগে

এই সিরিজের প্রথম কোডল্যাবে, আপনি একটি খুব সাধারণ অ্যাপ তৈরি করেছিলেন যা একটি ছবির বিষয়বস্তু বিশ্লেষণ করার জন্য ইমেজ লেবেলিং ব্যবহার করত। আপনি এটিকে একটি ডেইজি ফুলের ছবি দিয়েছিলেন, এবং এটি আপনাকে জানিয়েছিল যে এটি একটি পাপড়ি বা আকাশের মতো জিনিস দেখতে পেয়েছে। এরপর, দ্বিতীয় কোডল্যাবে আপনি পাইথনে গিয়ে একটি নতুন, কাস্টম মডেলকে প্রশিক্ষণ দিয়েছেন যা পাঁচ ধরনের ফুল শনাক্ত করতে পারে।

এই কোডল্যাবে আপনি দ্বিতীয় ল্যাবের মডেলটি দিয়ে প্রথম ল্যাবের অ্যাপটি আপডেট করবেন!

এই রিপোটি ক্লোন করে আপনি এই কোড ল্যাবের সম্পূর্ণ সোর্স কোড পেতে পারেন। আপনি অ্যান্ড্রয়েড এবং আইওএস-এর জন্য সাব-ডিরেক্টরি দেখতে পাবেন। আপনি যদি সাথে সাথে অনুসরণ করতে চান, তাহলে আগের কোডল্যাবের কোডটি ImageClassifierStep1 হিসেবে উপলব্ধ আছে। এই কোডল্যাবের সম্পূর্ণ কোডটি ImageClassifierStep2 হিসেবে উপলব্ধ আছে।

পূর্বশর্ত

  • এই লার্নিং পাথের প্রথম দুটি কোডল্যাব আপনার সম্পন্ন করা উচিত ছিল।

আপনি যা তৈরি করবেন এবং শিখবেন

  • পূর্ববর্তী ল্যাবে প্রশিক্ষিত একটি কাস্টম মডেলকে অ্যান্ড্রয়েড বা আইওএস অ্যাপে একীভূত করুন।

আপনার যা যা লাগবে

  • ল্যাবের অ্যান্ড্রয়েড অংশের জন্য অ্যান্ড্রয়েড স্টুডিও, যা developer.android.com/studio-তে পাওয়া যায়।
  • ল্যাবের iOS অংশের জন্য Xcode, যা Apple App Store-এ উপলব্ধ।

২. স্টার্টার অ্যাপটি নিন

প্রথমে আপনার "Build your first Computer Vision App on Android or iOS" কোডল্যাব থেকে অ্যাপটি লাগবে। আপনি যদি ল্যাবটি সম্পন্ন করে থাকেন, তবে এটির নাম হবে "ImageClassifierStep1"। আপনি যদি ল্যাবটি সম্পন্ন করতে না চান, তবে রিপো থেকে সম্পূর্ণ সংস্করণটি ক্লোন করতে পারেন।

অ্যান্ড্রয়েড স্টুডিওতে এটি খুলুন, আপনার প্রয়োজনীয় আপডেটগুলো করে নিন, এবং প্রস্তুত হয়ে গেলে অ্যাপটি চালিয়ে নিশ্চিত হন যে এটি ঠিকমতো কাজ করছে। আপনি এইরকম কিছু দেখতে পাবেন:

f3703d45d1332d1d.png

এটি বেশ সাধারণ একটি অ্যাপ, কিন্তু সামান্য কোড দিয়েই এটি বেশ কিছু শক্তিশালী কার্যকারিতা প্রদর্শন করে। তবে, আপনি যদি এই ফুলটিকে শুধু একটি ফুল হিসেবে নয়, বরং একটি ডেইজি হিসেবেও শনাক্ত করতে চান, তাহলে আপনাকে 'Create a custom model for your image classifier' কোডল্যাব থেকে আপনার নিজস্ব মডেলটি ব্যবহার করার জন্য অ্যাপটি আপডেট করতে হবে।

৩. কাস্টম এমএল কিট মডেল ব্যবহার করার জন্য build.gradle আপডেট করুন।

  1. অ্যান্ড্রয়েড স্টুডিও ব্যবহার করে অ্যাপ-লেভেলের build.gradle ফাইলটি খুঁজুন। এটি করার সবচেয়ে সহজ উপায় হলো প্রজেক্ট এক্সপ্লোরারে যাওয়া। নিশ্চিত করুন যে উপরে Android সিলেক্ট করা আছে, এবং আপনি নীচে Gradle Scripts-এর জন্য একটি ফোল্ডার দেখতে পাবেন।
  2. মডিউলটির জন্য যে ফাইলটি রয়েছে, সেটি খুলুন এবং এখানে দেখানো অনুযায়ী আপনার অ্যাপের নামের পরে '.app' যুক্ত করুন – (Module: ImageClassifierStep1.app):

8fe1d04b40610047.png

  1. ফাইলের একদম নিচে, dependencies সেটিংটি খুঁজুন। সেখানে আপনি এই লাইনটি দেখতে পাবেন:
implementation 'com.google.mlkit:image-labeling:17.0.1'

ভার্সন নম্বরটি ভিন্ন হতে পারে। সর্বদা এমএল কিট সাইট থেকে সর্বশেষ ভার্সন নম্বরটি জেনে নিন: https://developers.google.com/ml-kit/vision/image-labeling/android

  1. এটি কাস্টম ইমেজ লেবেলিং লাইব্রেরির রেফারেন্স দিয়ে প্রতিস্থাপন করুন। এটির ভার্সন নম্বর এখানে পাওয়া যাবে: https://developers.google.com/ml-kit/vision/image-labeling/custom-models/android
implementation 'com.google.mlkit:image-labeling-custom:16.3.1'
  1. এছাড়াও, আপনি আগের ল্যাবে তৈরি করা একটি .tflite মডেল যোগ করবেন। আপনি চাইবেন না যে অ্যান্ড্রয়েড স্টুডিও যখন আপনার অ্যাপ কম্পাইল করবে, তখন এই মডেলটি কম্প্রেসড হোক, তাই একই build.gradle ফাইলের Android সেকশনে এই সেটিংটি ব্যবহার করা নিশ্চিত করুন:
aaptOptions{
    noCompress "tflite"
}

খেয়াল রাখবেন এটি যেন অন্য কোনো সেটিংয়ের মধ্যে না থাকে। এটি সরাসরি android ট্যাগের নিচে থাকতে হবে। এখানে একটি উদাহরণ দেওয়া হলো:

62d546bff11d2a50.png

৪. TFLite মডেলটি যোগ করুন

পূর্ববর্তী কোডল্যাবে আপনি আপনার কাস্টম মডেল তৈরি করেছিলেন এবং সেটিকে model.tflite হিসেবে ডাউনলোড করেছিলেন।

আপনার প্রজেক্টে, সেই অ্যাসেটস ফোল্ডারটি খুঁজুন যেখানে বর্তমানে flower1.jpg ফাইলটি রয়েছে। মডেলটি নিম্নলিখিতভাবে সেই ফোল্ডারে কপি করুন:

  1. অ্যান্ড্রয়েড স্টুডিওতে অ্যাসেটস (Assets ) ফোল্ডারে রাইট-ক্লিক করুন। যে মেনুটি খুলবে, সেখান থেকে 'রিভিল ইন ফাইন্ডার' (Reveal in Finder ) নির্বাচন করুন। (উইন্ডোজে 'শো ইন এক্সপ্লোরার' এবং লিনাক্সে 'শো ইন ফাইলস')।

db30b47e419a326b.png

  1. আপনাকে ফাইল সিস্টেমের ডিরেক্টরিতে নিয়ে যাওয়া হবে। model.tflite ফাইলটি flower1.jpg.

36de0c51bec1c19e.png

অ্যান্ড্রয়েড স্টুডিও আপডেট হয়ে আপনার অ্যাসেটস ফোল্ডারে উভয় ফাইলই দেখাবে:

e9f4e9f394d9b357.png

আপনি এখন আপনার কোড আপডেট করার জন্য প্রস্তুত।

৫. কাস্টম মডেলের জন্য আপনার কোড আপডেট করুন।

প্রথম ধাপ হবে কাস্টম মডেলটি লোড করার জন্য কিছু কোড যোগ করা।

  1. আপনার MainActivity ফাইলে, setContentView(R.layout.activity_main) লাইনটির ঠিক নিচে, onCreate ফাংশনে নিম্নলিখিত কোডটি যোগ করুন।

এটি model.tflite অ্যাসেট থেকে বিল্ড করার জন্য একটি LocalModel ব্যবহার করবে। যদি Android Studio কোনো সমস্যা দেখিয়ে 'LocalModel'-কে লাল করে দেয়, তাহলে লাইব্রেরিটি ইম্পোর্ট করার জন্য ALT + Enter চাপুন। এটি আপনার জন্য com.google.mlkit.common.model.LocalModel-এর একটি ইম্পোর্ট যোগ করে দেবে।

val localModel = LocalModel.Builder()
        .setAssetFilePath("model.tflite")
        .build()

পূর্বে, আপনার btn.setOnClickListener হ্যান্ডলারে আপনি ডিফল্ট মডেলটি ব্যবহার করছিলেন। এটি এই কোড দিয়ে সেট আপ করা হয়েছিল:

val labeler = ImageLabeling.getClient(ImageLabelerOptions.DEFAULT_OPTIONS)

কাস্টম মডেলটি ব্যবহার করার জন্য আপনাকে সেটি প্রতিস্থাপন করতে হবে।

  1. একটি কাস্টম অপশন অবজেক্ট সেট আপ করুন:
val options = CustomImageLabelerOptions.Builder(localModel)
        .setConfidenceThreshold(0.7f)
        .setMaxResultCount(5)
        .build()

এটি ডিফল্ট অপশনগুলোকে একটি কাস্টমাইজড সেট দিয়ে প্রতিস্থাপন করে। কনফিডেন্স থ্রেশহোল্ড, ফেরত আসা প্রেডিকশনগুলোর মানের জন্য একটি মানদণ্ড নির্ধারণ করে। আপনি যদি এই কোডল্যাবের উপরের নমুনাটির দিকে ফিরে তাকান, যেখানে ছবিটি ছিল একটি ডেইজি ফুল, সেখানে ৪টি প্রেডিকশন ছিল, এবং প্রতিটির পাশে একটি করে মান দেওয়া ছিল, যেমন 'স্কাই'-এর মান .৭৬৩২।

একটি উচ্চ কনফিডেন্স থ্রেশহোল্ড ব্যবহার করে আপনি কার্যকরভাবে নিম্নমানের ফলাফলগুলো ফিল্টার করে বাদ দিতে পারেন। উদাহরণস্বরূপ, এটিকে ০.৯-এ সেট করলে এর চেয়ে কম প্রায়োরিটির কোনো লেবেল রিটার্ন করা হবে না। যেসব মডেলে অনেকগুলো ক্লাস থাকে, সেখানে setMaxResultCount() ফাংশনটি কার্যকর, কিন্তু যেহেতু এই মডেলে মাত্র ৫টি ক্লাস আছে, তাই আপনি এটিকে ৫-এই রেখে দেবেন।

এখন যেহেতু আপনার কাছে লেবেলারের জন্য বিকল্প রয়েছে, আপনি লেবেলারের ইনস্ট্যানসিয়েশনটি পরিবর্তন করে নিম্নরূপ করতে পারেন:

val labeler = ImageLabeling.getClient(options)

আপনার কোডের বাকি অংশ কোনো পরিবর্তন ছাড়াই চলবে। চেষ্টা করে দেখুন!

dd40c36c4edbb33.png

এখানে আপনি দেখতে পাচ্ছেন যে, এই ফুলটিকে এখন .৯৫৯ সম্ভাব্যতা সহ একটি ডেইজি হিসাবে শনাক্ত করা হয়েছে!

ধরা যাক আপনি দ্বিতীয় একটি ফুলের ছবি যোগ করে সেটি দিয়ে আবার চালালেন:

8556a5fbea487842.png

এটি এটিকে গোলাপ হিসেবে চিহ্নিত করে।

আপনার মনে প্রশ্ন জাগতে পারে যে, এখানে শুধু "rose" না লিখে " roses " কেন লেখা হয়েছে। এর কারণ হলো, ডেটাসেটে লেবেলগুলো ফোল্ডারের নাম দিয়ে দেওয়া হয়েছে, এবং দুর্ভাগ্যবশত সেই ফোল্ডারের নামগুলো কিছুটা অসামঞ্জস্যপূর্ণ; কখনও একবচন (যেমন 'daisy') আবার কখনও বহুবচন (যেমন 'roses') ব্যবহার করা হয়েছে। এটিকে মডেলের ছবির আইটেমগুলো গণনা করার চেষ্টার সাথে গুলিয়ে ফেলবেন না – এটি তার চেয়ে অনেক বেশি প্রাথমিক পর্যায়ের, এবং এটি শুধুমাত্র ফুলের ধরন শনাক্ত করতে পারে!

৬. iOS স্টার্ট অ্যাপটি ডাউনলোড করুন।

  1. প্রথমে আপনার প্রথম কোডল্যাবের অ্যাপটি লাগবে। আপনি যদি ল্যাবটি সম্পন্ন করে থাকেন, তবে এটির নাম হবে ImageClassifierStep1। আপনি যদি ল্যাবটি সম্পন্ন করতে না চান, তবে রিপো থেকে সম্পূর্ণ সংস্করণটি ক্লোন করতে পারেন। অনুগ্রহ করে মনে রাখবেন যে, পড এবং .xcworkspace রিপোটিতে নেই, তাই পরবর্তী ধাপে যাওয়ার আগে অবশ্যই .xcproject-এর ডিরেক্টরি থেকে 'pod install' কমান্ডটি চালিয়ে নেবেন।
  2. Xcode-এ ImageClassifierStep1.xcworkspace খুলুন। মনে রাখবেন, আপনাকে .xcproject ফাইলের পরিবর্তে .xcworkspace ফাইলটি ব্যবহার করতে হবে, কারণ আপনি পড ব্যবহার করে এমএল কিট (ML Kit) বান্ডল করেছেন এবং ওয়ার্কস্পেসটি এগুলো লোড করবে।

এই ল্যাবের বাকি অংশে, আমি অ্যাপটি আইফোন সিমুলেটরে চালাব, যা কোডল্যাবের বিল্ড টার্গেটগুলো সাপোর্ট করবে। আপনি যদি আপনার নিজের ডিভাইস ব্যবহার করতে চান, তাহলে আপনার iOS ভার্সনের সাথে মেলানোর জন্য প্রোজেক্ট সেটিংসে বিল্ড টার্গেট পরিবর্তন করতে হতে পারে।

এটি চালালে আপনি এইরকম কিছু দেখতে পাবেন:

9e151ed18f99fb98.png

খুবই সাধারণ শ্রেণিবিভাগগুলো লক্ষ্য করুন – পাপড়ি, ফুল, আকাশ। আগের কোডল্যাবে আপনি যে মডেলটি তৈরি করেছিলেন, সেটি এই ডেইজি ফুলটিসহ ৫ ধরনের ফুল শনাক্ত করার জন্য প্রশিক্ষিত ছিল।

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

৭. কাস্টম এমএল কিট ইমেজ লেবেলার পড ব্যবহার করুন

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

  1. আপনার প্রজেক্ট ডিরেক্টরিতে podfile নামের ফাইলটি খুঁজুন। এটি খুললে আপনি এইরকম কিছু দেখতে পাবেন:
platform :ios, '10.0'

target 'ImageClassifierStep1' do
        pod 'GoogleMLKit/ImageLabeling'
end
  1. পড ডিক্লারেশনটি ImageLabeling থেকে ImageLabelingCustom এ পরিবর্তন করুন, এইভাবে:
platform :ios, '10.0'

target 'ImageClassifierStep1' do
        pod 'GoogleMLKit/ImageLabelingCustom'
end
  1. কাজ শেষ হয়ে গেলে, টার্মিনাল ব্যবহার করে podfile (এবং .xcworkspace) থাকা ডিরেক্টরিতে যান এবং pod install . কমান্ডটি চালান।

bb5d78eb7c7ab975.png

কিছুক্ষণ পর MLKitImageLabeling লাইব্রেরিগুলো সরিয়ে দেওয়া হবে এবং নিজস্ব লাইব্রেরিগুলো যুক্ত করা হবে। এখন আপনি আপনার কোড সম্পাদনা করার জন্য .xcworkspace খুলতে পারেন।

৮. Xcode-এ TFLite মডেলটি যোগ করুন

আগের কোডল্যাবে আপনি একটি কাস্টম মডেল তৈরি করেছিলেন এবং সেটিকে model.tflite হিসেবে ডাউনলোড করেছিলেন। যদি ফাইলটি আপনার কাছে না থাকে, তাহলে আগের কোডল্যাবটি আবার চালান, অথবা এখান থেকে কোলাব কোডটি দেখুন। যদি আপনার গুগল কোলাবে অ্যাক্সেস না থাকে, তাহলে নোটবুকটি এই লিঙ্কে পাওয়া যাবে।

  1. Xcode-এ ওয়ার্কস্পেসটি খোলা থাকা অবস্থায়, model.tflite ফাইলটি আপনার প্রোজেক্টে ড্র্যাগ করে আনুন। এটি আপনার অন্যান্য ফাইল, যেমন ViewController.swift বা Main.storyboard সাথে একই ফোল্ডারে থাকা উচিত।
  2. ফাইলটি যোগ করার বিকল্পসহ একটি ডায়ালগ বক্স আসবে। নিশ্চিত করুন যে ‘Add to Targets’ বিকল্পটি নির্বাচিত আছে, অন্যথায় অ্যাপটি কোনো ডিভাইসে স্থাপন করার সময় মডেলটি এর সাথে যুক্ত হবে না।

লক্ষ্য করুন যে, আপনি যদি ImageClassifierStep1 থেকে শুরু করে এই ল্যাবটি ধাপে ধাপে সম্পন্ন করেন, তাহলে 'Add to Targets' এন্ট্রিতে ImageClassifierStep1 থাকবে; আর যদি সরাসরি সম্পূর্ণ কোডে চলে যান, তাহলে সেখানে ImageClassifierStep2 (যেমনটি দেখানো হয়েছে) থাকবে।

5b6a7f40c73f0f1f.png

এর মাধ্যমে আপনি মডেলটি লোড করতে পারবেন। পরবর্তী ধাপে দেখতে পাবেন, কীভাবে তা করতে হয়।

৯. কাস্টম মডেলের জন্য আপনার কোড আপডেট করুন।

  1. আপনার ViewController.swift ফাইলটি খুলুন। ফাইলের শুরুতে 'import MLKitImageLabeling' অংশে আপনি একটি ত্রুটি দেখতে পারেন। এর কারণ হলো, আপনি যখন আপনার পড ফাইলটি আপডেট করেছিলেন, তখন জেনেরিক ইমেজ লেবেলিং লাইব্রেরিগুলো সরিয়ে দিয়েছিলেন। আপনি নির্দ্বিধায় এই লাইনটি মুছে ফেলতে পারেন এবং নিম্নলিখিত লাইন দিয়ে এটি আপডেট করতে পারেন:
import MLKitVision
import MLKit
import MLKitImageLabelingCommon
import MLKitImageLabelingCustom

দ্রুত এগুলো পড়ে মনে হতে পারে যে একই কোডের পুনরাবৃত্তি করা হচ্ছে! কিন্তু শেষে রয়েছে "Common" এবং "Custom"!

  1. এরপর আপনি আগের ধাপে যোগ করা কাস্টম মডেলটি লোড করবেন। getLabels() ফাংশনটি খুঁজুন। visionImage.orientation = image.imageOrientation লাইনটির নিচে এই লাইনগুলো যোগ করুন:
// Add this code to use a custom model
let localModelFilePath = Bundle.main.path(forResource: "model", ofType: "tflite")
let localModel = LocalModel(path: localModelFilePath!)
  1. জেনেরিক ImageLabeler-এর অপশনগুলো নির্দিষ্ট করার কোডটি খুঁজুন। সম্ভবত ওই লাইব্রেরিগুলো সরিয়ে ফেলার কারণে এটি আপনাকে একটি এরর দেখাচ্ছে:
let options = ImageLabelerOptions()

CustomImageLabelerOptions ব্যবহার করতে এবং লোকাল মডেল নির্দিষ্ট করতে, সেটিকে এই কোড দিয়ে প্রতিস্থাপন করুন:

let options = CustomImageLabelerOptions(localModel: localModel)

...এবং এটুকুই! এখন আপনার অ্যাপটি চালিয়ে দেখুন! যখন আপনি ছবিটি শ্রেণীবদ্ধ করার চেষ্টা করবেন, তখন এটি আরও নির্ভুল হওয়া উচিত – এবং উচ্চ সম্ভাবনায় আপনাকে বলে দেবে যে আপনি একটি ডেইজি ফুল দেখছেন!

238cd21748a97cf4.png

ধরা যাক আপনি দ্বিতীয় একটি ফুলের ছবি যোগ করে সেটি দিয়ে আবার চালালেন:

75f3970a6b509bfe.png

অ্যাপটি সফলভাবে শনাক্ত করেছে যে এই ছবিটি 'গোলাপ' লেবেলের সাথে মিলে গেছে!

১০. অভিনন্দন!

আপনি এখন এমন একটি অ্যাপ তৈরি করা থেকে সরে এসেছেন যা একটি ছবির বিষয়বস্তু শনাক্ত করার জন্য একটি জেনেরিক মডেল ব্যবহার করত, এবং এখন আপনি ফুল-এর মতো নির্দিষ্ট জিনিস শনাক্ত করার জন্য নিজের এমএল মডেল তৈরি করেছেন, এবং তারপর আপনার কাস্টম মডেলটি ব্যবহার করার জন্য অ্যাপটি আপডেট করেছেন।

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

এখান থেকে সম্ভাবনার কোনো শেষ নেই – এবং ফুল ছাড়া অন্য কিছুর নিজস্ব ডেটা যদি আপনার কাছে থাকে, তবে কম্পিউটার ভিশন ব্যবহার করে সেগুলোকে শনাক্ত করার মতো একটি অ্যাপ তৈরির জন্য প্রয়োজনীয় ভিত্তি আপনার কাছে রয়েছে। এগুলো আরও ব্যাপক এক জগতের দিকে প্রথম কয়েকটি পদক্ষেপ মাত্র, এবং আশা করি এই ধাপগুলো সম্পন্ন করতে আপনার ভালো লেগেছে!