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

1. আপনি শুরু করার আগে

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

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

আপনি এই রেপো ক্লোন করে এই কোড ল্যাবের জন্য সম্পূর্ণ সোর্স কোড পেতে পারেন। আপনি Android এবং iOS এর জন্য সাব ডিরেক্টরি দেখতে পাবেন। আপনি যদি অনুসরণ করতে চান তবে পূর্ববর্তী কোডল্যাবের কোডটি ImageClassifierStep1 হিসাবে উপলব্ধ। এই কোডল্যাবের সমাপ্ত কোডটি ImageClassifierStep2 হিসাবে উপলব্ধ।

পূর্বশর্ত

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

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

  • একটি Android বা iOS অ্যাপে পূর্ববর্তী ল্যাবে প্রশিক্ষিত একটি কাস্টম মডেলকে একীভূত করুন৷

আপনি কি প্রয়োজন হবে

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

2. স্টার্টার অ্যাপ পান

প্রথমে আপনার Android বা iOS কোডল্যাবে বিল্ড আপনার প্রথম কম্পিউটার ভিশন অ্যাপ থেকে অ্যাপটির প্রয়োজন হবে। আপনি যদি ল্যাবের মধ্য দিয়ে যান তবে এটিকে বলা হবে ImageClassifierStep1। আপনি যদি ল্যাবের মধ্য দিয়ে যেতে না চান তবে আপনি রেপো থেকে সমাপ্ত সংস্করণটি ক্লোন করতে পারেন

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

f3703d45d1332d1d.png

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

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

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

8fe1d04b40610047.png

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

সংস্করণ নম্বর ভিন্ন হতে পারে. সর্বদা ML Kit সাইট থেকে সর্বশেষ সংস্করণ নম্বরটি এখানে খুঁজুন: 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

4. TFLite মডেল যোগ করুন

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

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

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

db30b47e419a326b.png

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

36de0c51bec1c19e.png

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

e9f4e9f394d9b357.png

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

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

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

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

এটি model.tflite সম্পদ থেকে তৈরি করতে একটি LocalModel ব্যবহার করবে। যদি অ্যান্ড্রয়েড স্টুডিও 'লোকালমডেল' লাল করে অভিযোগ করে, লাইব্রেরি আমদানি করতে ALT + এন্টার টিপুন। এটি আপনার জন্য 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()

এটি একটি কাস্টমাইজড সেট দিয়ে ডিফল্ট বিকল্পগুলি প্রতিস্থাপন করে। আত্মবিশ্বাসের থ্রেশহোল্ড ভবিষ্যদ্বাণীর গুণমানের জন্য একটি বার সেট করে। আপনি যদি এই কোডল্যাবের উপরের নমুনার দিকে ফিরে তাকান, যেখানে ছবিটি একটি ডেইজি ছিল, আপনার কাছে 4টি ভবিষ্যদ্বাণী ছিল, যার প্রতিটির পাশে একটি মান রয়েছে, যেমন 'স্কাই' হচ্ছে .7632।

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

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

val labeler = ImageLabeling.getClient(options)

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

dd40c36c4edbb33.png

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

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

8556a5fbea487842.png

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

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

6. iOS স্টার্ট অ্যাপ পান

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

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

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

9e151ed18f99fb98.png

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

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

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

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

  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. একবার আপনার হয়ে গেলে, পডফাইল (সেসাথে .xcworkspace) ধারণকারী ডিরেক্টরিতে নেভিগেট করতে টার্মিনালটি ব্যবহার করুন এবং pod install চালান।

bb5d78eb7c7ab975.png

কয়েক মুহূর্ত পরে MLKitImageLabeling লাইব্রেরিগুলি সরানো হবে, এবং কাস্টমগুলি যোগ করা হবে৷ আপনি এখন আপনার কোড সম্পাদনা করতে আপনার .xcworkspace খুলতে পারেন।

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

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

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

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

5b6a7f40c73f0f1f.png

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

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

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

এটি দ্রুত পড়া সহজ হতে পারে এবং মনে করতে পারে যে তারা একই কোড পুনরাবৃত্তি করছে! কিন্তু এটি "কমন" এবং শেষে "কাস্টম"!

  1. এরপরে আপনি আগের ধাপে যোগ করা কাস্টম মডেলটি লোড করবেন। getLabels() func খুঁজুন। 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. জেনেরিক ইমেজ লেবেলারের বিকল্পগুলি নির্দিষ্ট করার জন্য কোডটি খুঁজুন। এই লাইব্রেরিগুলি সরিয়ে ফেলার পর থেকে এটি সম্ভবত আপনাকে একটি ত্রুটি দিচ্ছে:
let options = ImageLabelerOptions()

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

let options = CustomImageLabelerOptions(localModel: localModel)

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

238cd21748a97cf4.png

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

75f3970a6b509bfe.png

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

10. অভিনন্দন!

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

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

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