1. আপনি শুরু করার আগে
এই কোডল্যাবে, আপনি কীভাবে একটি অ্যাপ তৈরি করবেন তা অন্বেষণ করবেন যা একটি ছবির প্রাথমিক বিষয়বস্তু সনাক্ত করে মূল কম্পিউটার ভিশন ব্যবহারের ক্ষেত্রে পরিচালনা করে। একে সাধারণত ইমেজ ক্লাসিফিকেশন বা ইমেজ লেবেলিং বলা হয়।
পূর্বশর্ত
এই কোডল্যাবটি ছবির শ্রেণীবিভাগের পথ দিয়ে শুরু করুন । এটি মেশিন লার্নিং-এ নতুন অভিজ্ঞ ডেভেলপারদের জন্য লেখা হয়েছে।
আপনি কি নির্মাণ করবেন
- একটি অ্যান্ড্রয়েড অ্যাপ একটি ফুলের ছবিকে শ্রেণীবদ্ধ করতে সক্ষম
- (ঐচ্ছিক) একটি iOS অ্যাপ একটি ফুলের ছবিকে শ্রেণীবদ্ধ করতে সক্ষম
আপনি কি প্রয়োজন হবে
- অ্যান্ড্রয়েড স্টুডিও, কোডল্যাবের অ্যান্ড্রয়েড অংশের জন্য https://developer.android.com/studio- এ উপলব্ধ
- কোডল্যাবের iOS অংশের জন্য অ্যাপল অ্যাপ স্টোরে উপলব্ধ এক্সকোড
2. শুরু করুন
কম্পিউটার ভিশন হল মেশিন লার্নিং-এর বৃহত্তর শৃঙ্খলার একটি ক্ষেত্র, যা মেশিনের জন্য প্রক্রিয়াকরণ এবং ছবির বিষয়বস্তু থেকে তথ্য বের করার জন্য নতুন উপায় খুঁজে বের করতে কাজ করে। যেখানে একটি কম্পিউটারের আগে শুধুমাত্র চিত্রের প্রকৃত তথ্য সংরক্ষণ করা হয়, যেমন পিক্সেলের মান যা ইমেজ তৈরি করে, কম্পিউটার ভিশন একটি কম্পিউটারকে ছবির বিষয়বস্তু পার্স করতে এবং এতে কী আছে সে সম্পর্কে তথ্য পেতে দেয়।
উদাহরণস্বরূপ, কম্পিউটার ভিশনের ক্ষেত্রের মধ্যে, একটি বিড়ালের একটি চিত্রকে একটি বিড়াল ধারণকারী হিসাবে লেবেল করা যেতে পারে, সেই চিত্রটি তৈরি করা পিক্সেলগুলি ছাড়াও। কম্পিউটারের দৃষ্টিভঙ্গির অন্যান্য ক্ষেত্র রয়েছে যা এর চেয়ে আরও বিশদে যায়, যেমন অবজেক্ট ডিটেকশন, যেখানে কম্পিউটার একটি ছবিতে একাধিক আইটেম সনাক্ত করতে পারে এবং তাদের জন্য বাউন্ডিং বাক্সগুলি বের করতে পারে।
এই কোডল্যাবে, আপনি কীভাবে একটি অ্যাপ তৈরি করবেন তা অন্বেষণ করবেন যা মূল ব্যবহারের ক্ষেত্রে পরিচালনা করে, ছবির প্রাথমিক বিষয়বস্তু সনাক্ত করে। একে সাধারণত ইমেজ ক্লাসিফিকেশন বা ইমেজ লেবেলিং বলা হয়।
অ্যাপটিকে যতটা সম্ভব সহজ রাখতে, এটি সংস্থান হিসাবে এটির সাথে বান্ডিল করা ছবিগুলি ব্যবহার করবে এবং সেগুলি থেকে আপনাকে একটি শ্রেণীবিভাগ দেখাবে৷ ভবিষ্যতের এক্সটেনশনগুলি হতে পারে একটি ইমেজ পিকার ব্যবহার করা বা ক্যামেরা থেকে সরাসরি ছবি তোলা।
আপনি অ্যান্ড্রয়েড স্টুডিও ব্যবহার করে অ্যান্ড্রয়েডে অ্যাপ তৈরির প্রক্রিয়ার মধ্য দিয়ে শুরু করবেন। (iOS-এ সমতুল্য করতে ধাপ 7-এ যান।)
- অ্যান্ড্রয়েড স্টুডিও খুলুন, ফাইল মেনুতে যান এবং একটি নতুন প্রকল্প তৈরি করুন নির্বাচন করুন।
- আপনাকে একটি প্রকল্প টেমপ্লেট বাছাই করতে বলা হবে। খালি কার্যকলাপ নির্বাচন করুন।
- পরবর্তী ক্লিক করুন. আপনাকে আপনার প্রকল্প কনফিগার করতে বলা হবে। এটিকে আপনি যে কোনো নাম এবং প্যাকেজের নাম দিন, কিন্তু এই কোডল্যাবের নমুনা কোডটি প্রকল্পের নাম ImageClassifierStep1 এবং প্যাকেজের নাম com.google.imageclassifierstep1 ব্যবহার করে।
- আপনার পছন্দের ভাষা বেছে নিন, হয় কোটলিন বা জাভা। এই ল্যাবটি কোটলিন ব্যবহার করে, তাই আপনি যদি সঠিকভাবে অনুসরণ করতে চান তবে আপনি সম্ভবত কোটলিন বেছে নিতে চাইবেন।
- প্রস্তুত হলে, Finish এ ক্লিক করুন। অ্যান্ড্রয়েড স্টুডিও আপনার জন্য অ্যাপ তৈরি করবে। সবকিছু সেট আপ করতে কয়েক মুহূর্ত লাগতে পারে।
3. এমএল কিটের ইমেজ লেবেলিং লাইব্রেরি আমদানি করুন
ML কিট (https://developers.google.com/ml-kit) ডেভেলপারদের জন্য অনেকগুলি সমাধান অফার করে, মেশিন লার্নিং-এ সাধারণ পরিস্থিতিগুলি পূরণ করে এবং সেগুলিকে কার্যকর করা এবং ক্রস-প্ল্যাটফর্মে কাজ করা সহজ করে। এমএল কিট একটি টার্নকি লাইব্রেরি প্রদান করে যা আপনি ইমেজ লেবেলিং নামে এই অ্যাপটিতে ব্যবহার করতে পারেন। এই লাইব্রেরিতে এমন একটি মডেল রয়েছে যা 600 টিরও বেশি শ্রেণির চিত্র সনাক্ত করার জন্য প্রাক-প্রশিক্ষিত। যেমন, এটি দিয়ে শুরু করার জন্য নিখুঁত।
মনে রাখবেন যে ML কিট আপনাকে একই API ব্যবহার করে কাস্টম মডেলগুলি ব্যবহার করার অনুমতি দেয়, তাই, আপনি যখন প্রস্তুত হন, আপনি "শুরু করা" এর বাইরে যেতে পারেন এবং আপনার ব্যক্তিগতকৃত চিত্র লেবেলিং অ্যাপ তৈরি করা শুরু করতে পারেন যা আপনার দৃশ্যের জন্য প্রশিক্ষিত একটি মডেল ব্যবহার করে৷
এই পরিস্থিতিতে, আপনি একটি ফুল শনাক্তকারী তৈরি করবেন। আপনি যখন আপনার প্রথম অ্যাপটি তৈরি করবেন এবং এটিকে একটি ফুলের ছবি দেখাবেন, তখন এটি এটিকে একটি ফুল হিসেবে চিনবে। (পরবর্তীতে, যখন আপনি নিজের ফুল ডিটেক্টর মডেল তৈরি করবেন, তখন আপনি ML Kit-এর জন্য ন্যূনতম পরিবর্তনের সাথে এটিকে আপনার অ্যাপে ড্রপ করতে সক্ষম হবেন, এবং নতুন মডেলটি আপনাকে বলতে হবে যে এটি কোন ধরনের ফুল, যেমন টিউলিপ বা একটি গোলাপ।)
- অ্যান্ড্রয়েড স্টুডিওতে, প্রজেক্ট এক্সপ্লোরার ব্যবহার করে, নিশ্চিত করুন যে Android শীর্ষে নির্বাচন করা হয়েছে।
- Gradle Scripts ফোল্ডারটি খুলুন এবং অ্যাপের জন্য
build.gradle
ফাইলটি নির্বাচন করুন। 2 বা তার বেশি হতে পারে, তাই নিশ্চিত করুন যে আপনি এখানে দেখানো হিসাবে অ্যাপ লেভেল ওয়ান ব্যবহার করছেন:
- ফাইলের নীচে আপনি নির্ভরতা নামক একটি বিভাগ দেখতে পাবেন যেখানে
implementation
,testImplementation
এবংandroidImplementation
সেটিংসের একটি তালিকা সংরক্ষণ করা হয়। এই কোড সহ ফাইলটিতে একটি নতুন যুক্ত করুন:
implementation 'com.google.mlkit:image-labeling:17.0.3'
(নিশ্চিত করুন যে এটি নির্ভরতার মধ্যে রয়েছে { })
- আপনি উইন্ডোর উপরের অংশে একটি বার দেখতে পাবেন যেটি ফ্ল্যাগ করছে যে
build.gradle
পরিবর্তিত হয়েছে এবং আপনাকে পুনরায় সিঙ্ক করতে হবে। এগিয়ে যান এবং এই কাজ. যদি আপনি এটি দেখতে না পান, উপরের ডানদিকে টুলবারে ছোট হাতির আইকনটি সন্ধান করুন এবং সেটিতে ক্লিক করুন৷
আপনি এখন এমএল কিট আমদানি করেছেন, এবং আপনি ইমেজ লেবেলিং শুরু করতে প্রস্তুত৷
এরপরে, আপনি একটি ইমেজ রেন্ডার করার জন্য একটি সাধারণ ইউজার ইন্টারফেস তৈরি করবেন এবং আপনাকে একটি বোতাম দেবেন যেটি যখন আপনার ব্যবহারকারী এটি টিপে, এমএল কিট ইমেজের বিষয়বস্তু পার্স করতে ইমেজ লেবেলার মডেলকে আহ্বান করে।
4. ইউজার ইন্টারফেস তৈরি করুন
অ্যান্ড্রয়েড স্টুডিওতে, আপনি একটি xml-ভিত্তিক লেআউট ফাইল ব্যবহার করে প্রতিটি স্ক্রিনের (বা কার্যকলাপ) জন্য ব্যবহারকারী ইন্টারফেস সম্পাদনা করেন। আপনার তৈরি করা মৌলিক অ্যাপটিতে একটি একক ক্রিয়াকলাপ রয়েছে (যার কোডটি MainActivity
তে রয়েছে এবং আপনি এটি শীঘ্রই দেখতে পাবেন), এবং ব্যবহারকারীর ইন্টারফেস ঘোষণা activity_main.xml
main.xml এ রয়েছে।
আপনি এটিকে অ্যান্ড্রয়েডের প্রজেক্ট এক্সপ্লোরারের রেস > লেআউট ফোল্ডারে খুঁজে পেতে পারেন – এইরকম:
এটি একটি সম্পূর্ণ সম্পাদক খুলবে যা আপনাকে আপনার কার্যকলাপ ব্যবহারকারী ইন্টারফেস ডিজাইন করতে দেয়। সেখানে অনেক কিছু আছে, এবং এটি কীভাবে ব্যবহার করতে হয় তা শেখানো এই ল্যাবের উদ্দেশ্য নয়৷ লেআউট সম্পাদক সম্পর্কে আরও জানতে চেক আউট করুন: https://developer.android.com/studio/write/layout-editor
এই ল্যাবের উদ্দেশ্যে, সম্পাদকের উপরের ডানদিকের কোণায় কোড টুলটি নির্বাচন করুন।
আপনি এখন উইন্ডোর প্রধান অংশে শুধু XML কোড দেখতে পাবেন। এতে কোড পরিবর্তন করুন:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<ImageView
android:id="@+id/imageToLabel"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<Button
android:id="@+id/btnTest"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Label Image"
android:layout_gravity="center"/>
<TextView
android:id="@+id/txtOutput"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:gravity="start|top" />
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
এটি আপনাকে একটি ImageView
(ছবি রেন্ডার করার জন্য), একটি Button
(ব্যবহারকারীর প্রেস করার জন্য) এবং একটি TextView
যেখানে লেবেলগুলি প্রদর্শিত হবে এমন একটি অতি সাধারণ বিন্যাস দেবে।
আপনি এখন আপনার ব্যবহারকারী ইন্টারফেস সংজ্ঞায়িত আছে. কোডিং করার আগে, সম্পদ হিসাবে কিছু ছবি যোগ করুন এবং অ্যাপটি এই ছবিগুলির উপর অনুমান করবে।
5. অ্যাপের সাথে ছবি বান্ডিল করুন
একটি অ্যান্ড্রয়েড অ্যাপের সাথে অতিরিক্ত ফাইল বান্ডিল করার একটি উপায় হল সেগুলিকে অ্যাসেট হিসেবে যোগ করা যা অ্যাপে কম্পাইল করা হয়। এই অ্যাপটিকে সহজ রাখতে, আমরা কিছু ফুলের ছবি যোগ করতে এটি করব। পরে, আপনি ক্যামেরাএক্স বা অন্যান্য লাইব্রেরি ব্যবহার করে ফটো তুলতে এবং সেটি ব্যবহার করতে এই অ্যাপটি প্রসারিত করতে পারেন। কিন্তু সরলতার জন্য, আমরা আপাতত ছবিটিকে বান্ডিল করব।
- প্রোজেক্ট এক্সপ্লোরারে, উপরের অ্যাপে , ডান ক্লিক করুন এবং নতুন ডিরেক্টরি নির্বাচন করুন।
- বিভিন্ন ডিরেক্টরির তালিকা সহ প্রদর্শিত ডায়ালগে, src/main/assets নির্বাচন করুন।
একবার আপনি এটি সম্পন্ন করলে, আপনি প্রজেক্ট এক্সপ্লোরারে একটি নতুন সম্পদ ফোল্ডার দেখতে পাবেন:
- এই ফোল্ডারটিতে ডান ক্লিক করুন, এবং আপনি বিকল্পগুলির একটি তালিকা সহ একটি পপআপ দেখতে পাবেন। এর মধ্যে একটি আপনার ফাইল সিস্টেমে ফোল্ডারটি খুলতে হবে। আপনার অপারেটিং সিস্টেমের জন্য উপযুক্ত একটি খুঁজুন এবং এটি নির্বাচন করুন. (একটি ম্যাকে এটি ফাইন্ডারে প্রকাশ করা হবে, উইন্ডোজে এটি এক্সপ্লোরারে ওপেন হবে এবং উবুন্টুতে এটি ফাইলগুলিতে শো হবে।)
- এটিতে একটি ফাইল কপি করুন। আপনি Pixabay এর মত সাইট থেকে ছবি ডাউনলোড করতে পারেন। ইমেজটিকে সাধারণ কিছুতে পুনঃনামকরণ করা বাঞ্ছনীয়। এই ক্ষেত্রে, ছবিটির নাম পরিবর্তন করা হয়েছে
flower1.jpg
।
একবার আপনি এটি সম্পন্ন করার পরে, অ্যান্ড্রয়েড স্টুডিওতে ফিরে যান এবং আপনার সম্পদ ফোল্ডারের মধ্যে আপনার ফাইলটি দেখতে হবে।
আপনি এখন এই ছবিটি লেবেল করার জন্য প্রস্তুত!
6. চিত্রটিকে লেবেল করার জন্য শ্রেণিবিন্যাস কোডটি লিখুন
(এবং এখন যে অংশটির জন্য আমরা সবাই অপেক্ষা করছিলাম, অ্যান্ড্রয়েডে কম্পিউটার ভিশন করছেন!)
- আপনি
MainActivity
ফাইলে আপনার কোড লিখবেন, তাই com.google.devrel.imageclassifierstep1 (অথবা যদি আপনি অন্য একটি বেছে নেন তাহলে আপনার সমতুল্য নামস্থান যাই হোক না কেন) এর অধীনে প্রজেক্ট ফোল্ডারে খুঁজুন। মনে রাখবেন যে একটি অ্যান্ড্রয়েড স্টুডিও প্রকল্পে সাধারণত 3টি নেমস্পেস ফোল্ডার সেট আপ করা হয়, একটি অ্যাপের জন্য, একটি অ্যান্ড্রয়েড টেস্টের জন্য এবং একটি পরীক্ষার জন্য। আপনি আপনারMainActivity
খুঁজে পাবেন যেটির পরে বন্ধনীতে কোনো বিবরণ নেই।
আপনি যদি Kotlin ব্যবহার করতে বেছে নেন, তাহলে আপনি হয়তো ভাবছেন কেন মূল ফোল্ডারটিকে Java বলা হয়। এটি একটি ঐতিহাসিক নিদর্শন, যখন থেকে অ্যান্ড্রয়েড স্টুডিও শুধুমাত্র জাভা ছিল। ভবিষ্যতের সংস্করণগুলি এটি ঠিক করতে পারে, তবে আপনি যদি কোটলিন ব্যবহার করতে চান তবে চিন্তা করবেন না, এটি এখনও ঠিক আছে। এটি সোর্স কোডের জন্য শুধুমাত্র ফোল্ডারের নাম।
-
MainActivity
ফাইলটি খুলুন, এবং আপনি কোড এডিটরে MainActivity নামে একটি ক্লাস ফাইল দেখতে পাবেন। এটিকে ঐটির মত দেখতে হবে:
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
}
ক্লোজিং কোঁকড়া বন্ধনীর নীচে, আপনি এক্সটেনশন কোড যোগ করতে পারেন যা ক্লাসের অংশ নয়, তবে ক্লাস দ্বারা ব্যবহারযোগ্য। বিটম্যাপ হিসাবে সম্পদ থেকে একটি ফাইল পড়ার জন্য আপনার একটি এক্সটেনশনের প্রয়োজন হবে৷ এটি আগে আপনার সম্পত্তি ফোল্ডারে কপি করা ছবি লোড করতে ব্যবহার করা হবে।
- এই কোড যোগ করুন:
// extension function to get bitmap from assets
fun Context.assetsToBitmap(fileName: String): Bitmap?{
return try {
with(assets.open(fileName)){
BitmapFactory.decodeStream(this)
}
} catch (e: IOException) { null }
}
অ্যান্ড্রয়েড স্টুডিও সম্ভবত এই সময়ে অভিযোগ করবে এবং লাল রঙে কিছু কোড হাইলাইট করবে, যেমন Context
, Bitmap
এবং IOException
:
চিন্তা করবেন না! এটি এই কারণে যে আপনি এখনও লাইব্রেরিগুলি আমদানি করেননি। অ্যান্ড্রয়েড স্টুডিও একটি সহজ শর্টকাট অফার করে।
- শব্দের উপর আপনার কার্সার টেনে আনুন, এবং ALT + এন্টার ( বিকল্প + একটি ম্যাকে এন্টার ) টিপুন এবং আপনার জন্য আমদানি তৈরি হবে।
- পরবর্তীতে আপনি সম্পদ থেকে বিটম্যাপ লোড করতে পারেন এবং এটি ImageView এ রাখতে পারেন। MainActivity-এর
onCreateFunction
এ ফিরে,setContentView
লাইনের ঠিক নীচে এই কোডটি যোগ করুন:
val img: ImageView = findViewById(R.id.imageToLabel)
// assets folder image file name with extension
val fileName = "flower1.jpg"
// get bitmap from assets folder
val bitmap: Bitmap? = assetsToBitmap(fileName)
bitmap?.apply {
img.setImageBitmap(this)
}
- আগের মতোই কিছু কোড লাল রঙে হাইলাইট করা হবে। সেই লাইনে কার্সার রাখুন, এবং স্বয়ংক্রিয়ভাবে আমদানি যোগ করতে Alt + Enter / Option + Enter ব্যবহার করুন।
- আপনার আগে তৈরি করা
layout.xml
ফাইলে, আপনি ImageView-কে imageToLabel নাম দিয়েছিলেন, তাই প্রথম লাইনটি সেই লেআউট তথ্য ব্যবহার করে একটি ImageView অবজেক্টের একটি উদাহরণ তৈরি করবে, যাকে বলা হয় img। এটি একটি বিল্ট-ইন অ্যান্ড্রয়েড ফাংশনfindViewById
ব্যবহার করে বিশদ খুঁজে বের করে। এটি তারপরে আপনার পূর্ববর্তী ধাপে তৈরি করাassetsToBitmap
ফাংশন ব্যবহার করে সম্পদ ফোল্ডার থেকে একটি চিত্র লোড করতেflower1.jpg
ফাইলের নাম ব্যবহার করে। অবশেষে, এটি বিটম্যাপকে img-এ লোড করতে বিটম্যাপ বিমূর্ত শ্রেণী ব্যবহার করে। - লেআউট ফাইলটিতে একটি টেক্সটভিউ ছিল যা চিত্রটির জন্য অনুমান করা লেবেলগুলিকে রেন্ডার করতে ব্যবহার করা হবে৷ যে পরবর্তী জন্য একটি কোড অবজেক্ট পান. অবিলম্বে পূর্ববর্তী কোড নীচে, এটি যোগ করুন:
val txtOutput : TextView = findViewById(R.id.txtOutput)
আগের মতই, এটি তার নাম ব্যবহার করে টেক্সট ভিউয়ের জন্য লেআউট ফাইলের তথ্য খুঁজে পায় (এক্সএমএল চেক করুন যেখানে এটিকে বলা হয় txtOutput
) এবং এটিকে txtOutput নামক একটি TextView অবজেক্ট ইনস্ট্যান্টিয়েট করতে ব্যবহার করে।
একইভাবে, আপনি বোতামের প্রতিনিধিত্ব করার জন্য একটি বোতাম অবজেক্ট তৈরি করবেন এবং লেআউট ফাইলের বিষয়বস্তু দিয়ে এটিকে ইনস্ট্যান্টিয়েট করবেন।
লেআউট ফাইলটিতে আমরা বোতামটিকে btnTest
, তাই আমরা এটিকে এভাবে ইনস্ট্যান্টিয়েট করতে পারি:
val btn: Button = findViewById(R.id.btnTest)
এখন আপনি আপনার সমস্ত কোড এবং নিয়ন্ত্রণগুলি শুরু করেছেন, পরবর্তী (এবং চূড়ান্ত) পদক্ষেপটি হবে চিত্রের একটি অনুমান পেতে সেগুলি ব্যবহার করা।
চালিয়ে যাওয়ার আগে, নিশ্চিত করুন যে আপনার onCreate
কোডটি এইরকম দেখাচ্ছে:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val img: ImageView = findViewById(R.id.imageToLabel)
// assets folder image file name with extension
val fileName = "flower1.jpg"
// get bitmap from assets folder
val bitmap: Bitmap? = assetsToBitmap(fileName)
bitmap?.apply {
img.setImageBitmap(this)
}
val txtOutput : TextView = findViewById(R.id.txtOutput)
val btn: Button = findViewById(R.id.btnTest)
}
কোনো কীওয়ার্ডের রঙ লাল হওয়া উচিত নয়, এটি নির্দেশ করে যে সেগুলি এখনও আমদানি করা হয়নি। যদি তারা হয়, অনুগ্রহ করে ফিরে যান এবং আমদানি তৈরি করতে ALT + Enter কৌশলটি করুন৷
এমএল কিটের ইমেজ লেবেলার ব্যবহার করার সময়, প্রথম ধাপটি সাধারণত আচরণ কাস্টমাইজ করার জন্য একটি বিকল্প অবজেক্ট তৈরি করা হয়। আপনি আপনার ছবিকে একটি InputImage ফরম্যাটে রূপান্তর করবেন যা ML Kit চিনতে পারে। তারপর আপনি অনুমান সম্পাদন করতে একটি লেবেলার বস্তু তৈরি করুন। এটি আপনাকে ফলাফলের সাথে একটি অ্যাসিঙ্ক্রোনাস কল ব্যাক দেবে, যা আপনি তারপর পার্স করতে পারবেন।
আপনি এইমাত্র যে বোতামটি তৈরি করেছেন, সেটির সমস্তই এটির onClickListener
ইভেন্টের মধ্যে করুন৷ এখানে সম্পূর্ণ কোড:
btn.setOnClickListener {
val labeler = ImageLabeling.getClient(ImageLabelerOptions.DEFAULT_OPTIONS)
val image = InputImage.fromBitmap(bitmap!!, 0)
var outputText = ""
labeler.process(image)
.addOnSuccessListener { labels ->
// Task completed successfully
for (label in labels) {
val text = label.text
val confidence = label.confidence
outputText += "$text : $confidence\n"
}
txtOutput.text = outputText
}
.addOnFailureListener { e ->
// Task failed with an exception
}
}
- ব্যবহারকারী যখন প্রথম বোতামে ক্লিক করেন, কোডটি ImageLabeling.getClient ব্যবহার করে একটি লেবেলারকে ইন্সট্যান্টিয়েট করবে, এটি ImageLabelerOptions পাস করবে। এটি একটি DEFAULT_OPTIONS সম্পত্তির সাথে আসে যা আমাদের দ্রুত উঠতে এবং দৌড়াতে দেয়৷
- এর পরে, বিটম্যাপ থেকে বিটম্যাপ পদ্ধতি ব্যবহার করে একটি ইনপুট ইমেজ তৈরি করা হবে। InputImage হল ML Kit-এর কাঙ্খিত বিন্যাস ছবি প্রক্রিয়াকরণের জন্য।
- অবশেষে, লেবেলার ইমেজ প্রক্রিয়া করবে, এবং একটি অ্যাসিঙ্ক্রোনাস কলব্যাক দেবে, হয় সাফল্য বা ব্যর্থতার উপর। যদি অনুমান সফল হয়, কলব্যাক লেবেলের একটি তালিকা অন্তর্ভুক্ত করবে। তারপর আপনি লেবেলের পাঠ্য এবং আত্মবিশ্বাসের মান পড়তে লেবেলের এই তালিকার মাধ্যমে পার্স করতে পারেন। এটি ব্যর্থ হলে, এটি আপনাকে একটি ব্যতিক্রম ফেরত পাঠাবে যা আপনি ব্যবহারকারীকে রিপোর্ট করতে ব্যবহার করতে পারেন।
এবং এটাই! আপনি এখন একটি Android ডিভাইসে বা এমুলেটরের মধ্যে অ্যাপটি চালাতে পারেন। আপনি যদি এটি আগে কখনও না করে থাকেন তবে আপনি এখানে কীভাবে শিখতে পারেন: https://developer.android.com/studio/run/emulator
এখানে এমুলেটরে অ্যাপটি চলছে। প্রথমে আপনি চিত্র এবং বোতামটি দেখতে পাবেন এবং লেবেলটি খালি থাকবে।
বোতাম টিপুন, এবং আপনি ছবির জন্য লেবেলের একটি সেট পাবেন।
এখানে আপনি দেখতে পাচ্ছেন যে লেবেলার নির্ধারণ করেছেন যে চিত্রটিতে একটি পাপড়ি, একটি ফুল, একটি উদ্ভিদ এবং আকাশের উচ্চ সম্ভাবনা রয়েছে৷ এগুলি সবই সঠিক, এবং তারা সবই প্রদর্শন করছে যে মডেলটি চিত্রটি পার্স করার জন্য কাজ করছে৷
তবে এটি এখনও নির্ধারণ করতে পারে না যে এটি একটি ডেইজির ছবি। এর জন্য আপনার একটি কাস্টম মডেলের প্রয়োজন হবে যা নির্দিষ্ট ফুলের উপর প্রশিক্ষিত, এবং আপনি পরবর্তী ল্যাবে এটি কীভাবে করবেন তা দেখতে পাবেন।
নিম্নলিখিত ধাপে, আপনি কীভাবে iOS-এ এই একই অ্যাপ তৈরি করবেন তা অন্বেষণ করবেন।
7. iOS-এ একটি ইমেজ ক্লাসিফায়ার তৈরি করুন - শুরু করুন
আপনি Xcode ব্যবহার করে iOS-এ একটি অনুরূপ অ্যাপ তৈরি করতে পারেন।
- এক্সকোড চালু করুন এবং ফাইল মেনু থেকে, নতুন প্রকল্প নির্বাচন করুন। আপনি এই ডায়ালগ দেখতে পাবেন:
- দেখানো হিসাবে অ্যাপ নির্বাচন করুন, এবং পরবর্তী ক্লিক করুন। আপনাকে আপনার প্রকল্পের জন্য বিকল্পগুলি বেছে নিতে বলা হবে। দেখানো হিসাবে এটি একটি নাম এবং একটি প্রতিষ্ঠান শনাক্তকারী দিন। নিশ্চিত করুন যে ইন্টারফেসের ধরনটি স্টোরিবোর্ড এবং ভাষাটি যেমন দেখানো হয়েছে সুইফ্ট ।
- আপনি যদি একটি ফোনে স্থাপন করতে চান এবং একটি বিকাশকারী প্রোফাইল সেট আপ করতে চান তবে আপনি আপনার টিম সেটিংস সেট করতে পারেন৷ যদি তা না হয় তবে এটিকে None এ ছেড়ে দিন এবং আপনি আপনার অ্যাপ চালানোর জন্য iOS সিমুলেটর ব্যবহার করতে পারেন।
- পরবর্তীতে ক্লিক করুন এবং আপনার প্রকল্প এবং এর ফাইলগুলি সংরক্ষণ করতে একটি ফোল্ডার নির্বাচন করুন৷ এই প্রকল্পের অবস্থানটি মনে রাখবেন, পরবর্তী ধাপে আপনার এটির প্রয়োজন হবে৷
- আপাতত Xcode বন্ধ করুন, কারণ আপনি পরবর্তী ধাপের পরে একটি ভিন্ন ওয়ার্কস্পেস ফাইল ব্যবহার করে এটি পুনরায় খুলবেন।
8. Cocoapods ব্যবহার করে ML কিট ইন্টিগ্রেট করুন
যেহেতু ML Kit iOS-এও কাজ করে, আপনি এটিকে একটি ইমেজ ক্লাসিফায়ার তৈরি করতে খুব অনুরূপভাবে ব্যবহার করতে পারেন। এটিকে সংহত করতে আপনি CocoaPods ব্যবহার করবেন। আপনি যদি এটি ইতিমধ্যেই ইনস্টল না করে থাকেন, তাহলে আপনি https://cocoapods.org/-এ নির্দেশাবলী দিয়ে তা করতে পারেন
- আপনি যেখানে আপনার প্রকল্প তৈরি করেছেন সেই ডিরেক্টরিটি খুলুন। এটিতে আপনার .xcodeproj ফাইল থাকা উচিত।
এখানে আপনি .xcodeproj ফাইলটি দেখতে পাচ্ছেন যা নির্দেশ করে যে আমি সঠিক অবস্থানে আছি।
- এই ফোল্ডারে, Podfile নামে একটি নতুন ফাইল তৈরি করুন। কোন এক্সটেনশন নেই, এটা শুধু Podfile. এর মধ্যে, নিম্নলিখিত যোগ করুন:
platform :ios, '10.0' target 'ImageClassifierStep1' do pod 'GoogleMLKit/ImageLabeling' end
- এটি সংরক্ষণ করুন, এবং টার্মিনালে ফিরে যান। একই ডিরেক্টরিতে টাইপ করুন
pod install
. Cocoapods উপযুক্ত লাইব্রেরি এবং নির্ভরতা ডাউনলোড করবে এবং একটি নতুন ওয়ার্কস্পেস তৈরি করবে যা আপনার প্রোজেক্টকে এর বাহ্যিক নির্ভরতার সাথে একত্রিত করবে।
মনে রাখবেন যে শেষে এটি আপনাকে আপনার Xcode সেশনগুলি বন্ধ করতে এবং এখন থেকে ওয়ার্কস্পেস ফাইলটি ব্যবহার করতে বলে। এই ফাইলটি খুলুন এবং Xcode আপনার মূল প্রকল্পের সাথে বাহ্যিক নির্ভরতাগুলির সাথে চালু হবে।
আপনি এখন পরবর্তী ধাপে যেতে এবং ইউজার ইন্টারফেস তৈরি করতে প্রস্তুত।
9. স্টোরিবোর্ড ব্যবহার করে iOS UI তৈরি করুন
-
Main.storyboard
ফাইলটি খুলুন, এবং আপনি একটি ফোনের জন্য ডিজাইনের পৃষ্ঠের সাথে একটি ব্যবহারকারী ইন্টারফেস লেআউট দেখতে পাবেন। - স্ক্রিনের উপরের ডানদিকে একটি + বোতাম রয়েছে যা আপনি নিয়ন্ত্রণ যোগ করতে ব্যবহার করতে পারেন। নিয়ন্ত্রণ প্যালেট পেতে এটি ক্লিক করুন.
- সেখান থেকে, একটি ইমেজভিউ , একটি বোতাম এবং একটি লেবেল নকশার পৃষ্ঠে টেনে আনুন। দেখানো হিসাবে তাদের উপরে থেকে নীচে সাজান:
- টেক্সট এডিট করতে বোতাম থেকে শ্রেণীবদ্ধ করতে বোতামটিতে ডাবল ক্লিক করুন।
- কন্ট্রোল হ্যান্ডেলগুলিকে বড় করতে লেবেলের চারপাশে টেনে আনুন৷ ( UIImageView এর সমান প্রস্থ এবং দ্বিগুণ উচ্চতা সম্পর্কে বলুন।)
- লেবেলটি এখনও নির্বাচিত থাকা অবস্থায়, ইন্সপেক্টর প্যালেট দেখানোর জন্য উপরের ডানদিকে নির্বাচক বোতামে ক্লিক করুন।
- একবার আপনি এটি সম্পন্ন করার পরে, লাইন সেটিং খুঁজুন এবং নিশ্চিত করুন যে এটি 0 এ সেট করা আছে। এটি লেবেলটিকে একটি গতিশীল সংখ্যক লাইন রেন্ডার করার অনুমতি দেয়।
আপনি এখন পরবর্তী পদক্ষেপ নেওয়ার জন্য প্রস্তুত - আউটলেট এবং অ্যাকশন ব্যবহার করে কোড পর্যন্ত UI-কে ওয়্যারিং করা।
10. অ্যাকশন এবং আউটলেট তৈরি করুন
স্টোরিবোর্ড ব্যবহার করে iOS ডেভেলপমেন্ট করার সময়, আপনি আউটলেট ব্যবহার করে আপনার নিয়ন্ত্রণের জন্য লেআউট তথ্য উল্লেখ করেন এবং ব্যবহারকারী যখন অ্যাকশন ব্যবহার করে কোনো নিয়ন্ত্রণে কোনো পদক্ষেপ নেয় তখন চালানোর জন্য কোডটি সংজ্ঞায়িত করুন।
পরবর্তী ধাপে আপনাকে ImageView এবং লেবেলের জন্য আউটলেট তৈরি করতে হবে। এতে ইমেজ লোড করার জন্য ইমেজভিউ কোডে উল্লেখ করা হবে। এমএল কিট থেকে ফিরে আসা অনুমানের উপর ভিত্তি করে এর পাঠ্য সেট করতে লেবেলটিকে কোডে উল্লেখ করা হবে।
- স্ক্রিনের উপরের ডানদিকে কন্ট্রোলে ক্লিক করে ইন্সপেক্টর প্যালেটটি বন্ধ করুন, তারপরে ডানদিকে অ্যাডিটর বোতামটি ক্লিক করুন যা এর ঠিক নীচে রয়েছে।
- আপনার কাছে একটি বিভ্রান্তিকর স্ক্রীন লেআউট থাকবে যেখানে main.storyboard দুবার খোলা হয়। বাম দিকে, প্রজেক্ট নেভিগেটরে, ViewController.swift নির্বাচন করুন যাতে ভিউ কন্ট্রোলার কোড খোলে। দেখে মনে হতে পারে আপনার ডিজাইনের পৃষ্ঠটি বাম দিকের স্টোরিবোর্ড সম্পাদক থেকে অদৃশ্য হয়ে গেছে, কিন্তু চিন্তা করবেন না, এটি এখনও আছে!
- এটি ফিরে পেতে, ভিউ কন্ট্রোলার দৃশ্যে ভিউ কন্ট্রোলারে ক্লিক করুন। আপনার UI এর মতো দেখতে চেষ্টা করুন - বামদিকে স্টোরিবোর্ডটি আপনার ডিজাইন এবং ডানদিকে ViewController.swift-এর কোড দেখাচ্ছে৷
- বাম দিকের নকশার পৃষ্ঠ থেকে UIImageView নির্বাচন করুন, এবং কন্ট্রোল কী টিপে, এটিকে ডানদিকের কোডে টেনে আনুন, এটিকে
class
কীওয়ার্ডের ঠিক নীচে (উপরের স্ক্রিনশটের 11 নম্বর লাইনে) ফেলে দিন।
আপনি টেনে আনলে আপনি একটি তীর দেখতে পাবেন এবং যখন আপনি ড্রপ করবেন তখন আপনি এইরকম একটি পপআপ পাবেন:
- "imageView" হিসাবে নাম ক্ষেত্রটি পূরণ করুন এবং সংযোগ এ ক্লিক করুন।
- লেবেল সহ এই প্রক্রিয়াটি পুনরাবৃত্তি করুন এবং এটিকে "lblOutput" নাম দিন।
- গুরুত্বপূর্ণ: বোতামের জন্য, আপনি একই কাজ করবেন তবে নিশ্চিত করুন যে আপনি সংযোগের ধরণটি অ্যাকশনে সেট করেছেন এবং আউটলেট নয়!
- এটিকে "doClassification" নাম দিন এবং Connect এ ক্লিক করুন।
আপনার কাজ শেষ হয়ে গেলে, আপনার কোডটি এইরকম হওয়া উচিত: (মনে রাখবেন যে লেবেল এবং ইমেজ ভিউকে IBOutlet (ইন্টারফেস বিল্ডার আউটলেট) এবং বোতামটি IBAction (ইন্টারফেস বিল্ডার অ্যাকশন) হিসাবে ঘোষণা করা হয়েছে।)
import UIKit
class ViewController: UIViewController {
@IBAction func doClassification(_ sender: Any) {
}
@IBOutlet weak var imageView: UIImageView!
@IBOutlet weak var lblOutput: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
}
- অবশেষে, অ্যাপের সাথে একটি ছবি বান্ডিল করুন যাতে আমরা সহজেই শ্রেণীবিভাগ করতে পারি। এটি করার জন্য, আপনার ফাইল এক্সপ্লোরার থেকে ফাইলটিকে এক্সকোডের বাম দিকের এক্সপ্লোরারে টেনে আনুন। যখন আপনি এটি ড্রপ করেন, আপনি এই মত একটি পপআপ পাবেন:
- নিশ্চিত করুন যে টার্গেটে যোগ করুন বিভাগে চেকবক্সটি দেখানো হিসাবে চেক করা হয়েছে, তারপরে শেষ ক্লিক করুন।
ফাইলটি আপনার অ্যাপের সাথে বান্ডিল করা হবে এবং আপনি এখন এটিকে সহজেই শ্রেণীবদ্ধ করতে পারবেন। আপনি এখন ইমেজ ক্লাসিফিকেশন করতে ইউজার ইন্টারফেস কোড আপ করতে প্রস্তুত!
11. চিত্র শ্রেণীবিভাগের জন্য কোড লিখুন
এখন সবকিছু সেট আপ করা হয়েছে, চিত্র শ্রেণীবিভাগ সম্পাদন করার জন্য কোড লেখা সত্যিই সহজবোধ্য।
- ডিজাইনের পৃষ্ঠের উপরে বাম কোণায় X- এ ক্লিক করে স্টোরিবোর্ড ডিজাইনার বন্ধ করে শুরু করুন। এটি আপনাকে শুধুমাত্র আপনার কোডের উপর ফোকাস করতে দেবে। আপনি এই ল্যাবের বাকি অংশের জন্য ViewController.swift সম্পাদনা করবেন।
- MLKitVision এবং MLKit ইমেজলেবেলিং লাইব্রেরিগুলিকে UIKit-এর আমদানির নীচে, উপরে এই কোডটি যোগ করে আমদানি করুন:
import MLKitVision
import MLKitImageLabeling
- তারপর, আপনার
viewDidLoad
ফাংশনের মধ্যে, আমরা অ্যাপে বান্ডিল করা ফাইলটি ব্যবহার করে ImageView শুরু করুন:
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
imageView.image = UIImage(named:"flower1.jpg")
}
- ছবির জন্য লেবেল পেতে একটি সহায়ক ফাংশন তৈরি করুন, অবিলম্বে
viewDidLoad()
এর নীচে :
func getLabels(with image: UIImage){
- ছবিটি থেকে একটি ভিশন ইমেজ তৈরি করুন। চিত্র শ্রেণীবিভাগ সম্পাদন করার সময় এমএল কিট এই ধরনের ব্যবহার করে। সুতরাং, getLabels ফাংশনের মধ্যে, এই কোডটি যোগ করুন:
let visionImage = VisionImage(image: image)
visionImage.orientation = image.imageOrientation
- এরপর ইমেজ লেবেলারের জন্য অপশন তৈরি করুন। এই বিকল্পগুলি ব্যবহার করে এটি শুরু করা হবে। এই ক্ষেত্রে আপনি
confidenceThreshold
এর একটি মৌলিক বিকল্প সেট করবেন। এর মানে হল যে আপনি লেবেলারকে শুধুমাত্র সেই লেবেলগুলি ফেরত দিতে বলবেন যেগুলির আত্মবিশ্বাস 0.4 বা তার বেশি। উদাহরণস্বরূপ, আমাদের ফুলের জন্য, "উদ্ভিদ" বা "পাপড়ি" এর মত শ্রেণীতে উচ্চ আত্মবিশ্বাস থাকবে, কিন্তু "বাস্কেটবল" বা "কার" এর মত ক্লাসে কম আত্মবিশ্বাস থাকবে।
let options = ImageLabelerOptions()
options.confidenceThreshold = 0.4
- এখন এই বিকল্পগুলি ব্যবহার করে লেবেলার তৈরি করুন:
let labeler = ImageLabeler.imageLabeler(options: options)
- একবার আপনার লেবেলার হয়ে গেলে, আপনি এটি প্রক্রিয়া করতে পারেন। এটি আপনাকে লেবেল সহ একটি অ্যাসিঙ্ক্রোনাস কলব্যাক দেবে (যদি এটি সফল হয়) এবং ত্রুটি (যদি এটি ব্যর্থ হয়), যা আপনি তারপরে অন্য একটি ফাংশনে প্রক্রিয়া করতে পারেন যা আমরা কিছুক্ষণের মধ্যে তৈরি করব।
labeler.process(visionImage) { labels, error in
self.processResult(from: labels, error: error)
}
চিন্তা করবেন না যদি Xcode অভিযোগ করে যে কোন processResult
সদস্য নেই। আপনি এখনও এটি বাস্তবায়ন করেননি, এবং আপনি পরবর্তীতে এটি করবেন।
সুবিধার জন্য, এখানে সম্পূর্ণ getLabels ফাংশন রয়েছে:
// This is called when the user presses the button
func getLabels(with image: UIImage){
// Get the image from the UI Image element and set its orientation
let visionImage = VisionImage(image: image)
visionImage.orientation = image.imageOrientation
// Create Image Labeler options, and set the threshold to 0.4
// so we will ignore all classes with a probability of 0.4 or less
let options = ImageLabelerOptions()
options.confidenceThreshold = 0.4
// Initialize the labeler with these options
let labeler = ImageLabeler.imageLabeler(options: options)
// And then process the image, with the callback going to self.processresult
labeler.process(visionImage) { labels, error in
self.processResult(from: labels, error: error)
}
}
তাই এখন আপনাকে processResult
ফাংশন বাস্তবায়ন করতে হবে। এটি এখন সত্যিই সহজ, আমাদের কাছে লেবেল রয়েছে এবং একটি ত্রুটি বস্তু আমাদের কাছে ফিরে এসেছে। লেবেলগুলিকে এমএল কিট থেকে ইমেজলেবেল টাইপের মধ্যে নিক্ষেপ করা উচিত।
একবার এটি হয়ে গেলে আপনি লেবেলের সেটের মাধ্যমে পুনরাবৃত্তি করতে পারেন, বর্ণনা এবং আত্মবিশ্বাসের মান টানতে পারেন এবং var
নামক একটি labeltexts
এ যোগ করতে পারেন। একবার আপনি সেগুলির মাধ্যমে পুনরাবৃত্তি করলে, আপনি কেবল সেই মানটিতে lblOutput.text সেট করুন।
এখানে সম্পূর্ণ ফাংশন:
// This gets called by the labeler's callback
func processResult(from labels: [ImageLabel]?, error: Error?){
// String to hold the labels
var labeltexts = ""
// Check that we have valid labels first
guard let labels = labels else{
return
}
// ...and if we do we can iterate through the set to get the description and confidence
for label in labels{
let labelText = label.text + " : " + label.confidence.description + "\n"
labeltexts += labelText
}
// And when we're done we can update the UI with the list of labels
lblOutput.text = labeltexts
}
ব্যবহারকারী যখন বোতাম টিপে তখন যা অবশিষ্ট থাকে তা হল getLabels
কল করা।
আপনি যখন অ্যাকশনটি তৈরি করেছিলেন তখন সবকিছুই আপনার জন্য ওয়্যার আপ হয়ে গিয়েছিল, তাই আপনাকে শুধু IBAction
নামক doClassificaiton
আপডেট করতে হবে যা আপনি getLabels
কল করার জন্য আগে তৈরি করেছিলেন।
এখানে শুধু ইমেজভিউ-এর বিষয়বস্তুর সাথে কল করার কোড আছে:
@IBAction func doClassification(_ sender: Any) {
getLabels(with: imageView.image!)
}
এখন আপনার অ্যাপটি চালান এবং এটি ব্যবহার করে দেখুন। আপনি এখানে কর্মে এটি দেখতে পারেন:
মনে রাখবেন যে আপনার ডিভাইসের উপর নির্ভর করে আপনার বিন্যাস ভিন্ন দেখাতে পারে।
কোডল্যাব প্রতি ডিভাইসের জন্য বিভিন্ন লেআউট প্রকারের অন্বেষণ করে না, যা নিজেই একটি বেশ জটিল ধারণা। আপনি যদি UI সঠিকভাবে দেখতে না পান, স্টোরিবোর্ড সম্পাদকে ফিরে যান এবং নীচে, আপনি একটি View as: বিভাগ দেখতে পাবেন, যেখানে আপনি একটি নির্দিষ্ট ডিভাইস বেছে নিতে পারেন। আপনি যে ইমেজ বা ডিভাইসে পরীক্ষা করছেন তার সাথে মেলে একটি বেছে নিন এবং এটির জন্য UI এডিট করুন।
আপনি iOS ডেভেলপমেন্টে আরও বেশি কিছু করার সাথে সাথে আপনার UI ফোন জুড়ে সামঞ্জস্যপূর্ণ কিনা তা নিশ্চিত করতে সীমাবদ্ধতাগুলি কীভাবে ব্যবহার করবেন তা শিখবেন, তবে এটি এই ল্যাবের সুযোগের বাইরে।
12. অভিনন্দন!
আপনি এখন অ্যান্ড্রয়েড এবং আইওএস উভয় ক্ষেত্রেই একটি অ্যাপ প্রয়োগ করেছেন যা আপনাকে একটি জেনেরিক মডেলের সাথে প্রাথমিক কম্পিউটার দৃষ্টি দেয়। আপনি ইতিমধ্যেই বেশিরভাগ ভারী উত্তোলন করেছেন।
পরবর্তী কোডল্যাবে, আপনি একটি কাস্টম মডেল তৈরি করবেন যা বিভিন্ন ধরনের ফুলকে চিনতে পারে, এবং কোডের মাত্র কয়েকটি লাইনের সাহায্যে আপনি এটিকে আরও উপযোগী করতে এই অ্যাপে কাস্টম মডেল প্রয়োগ করতে সক্ষম হবেন!