MediaPipe জেসচার রিকগনিজার টাস্ক আপনাকে রিয়েল টাইমে হাতের অঙ্গভঙ্গি চিনতে দেয় এবং সনাক্ত করা হাতের স্বীকৃত হাতের অঙ্গভঙ্গি ফলাফল এবং হ্যান্ড ল্যান্ডমার্ক প্রদান করে। এই নির্দেশাবলী আপনাকে Android অ্যাপগুলির সাথে অঙ্গভঙ্গি শনাক্তকারী কীভাবে ব্যবহার করতে হয় তা দেখায়৷ এই নির্দেশাবলীতে বর্ণিত কোড নমুনা GitHub এ উপলব্ধ।
আপনি ওয়েব ডেমো দেখে এই কাজটি কার্যকরভাবে দেখতে পারেন। এই কাজের ক্ষমতা, মডেল এবং কনফিগারেশন বিকল্প সম্পর্কে আরও তথ্যের জন্য, ওভারভিউ দেখুন।
কোড উদাহরণ
MediaPipe টাস্কের উদাহরণ কোড হল Android এর জন্য একটি Gesture Recognizer অ্যাপের একটি সহজ বাস্তবায়ন। উদাহরণটি ক্রমাগত হাতের অঙ্গভঙ্গি সনাক্ত করতে একটি ভৌত অ্যান্ড্রয়েড ডিভাইসে ক্যামেরা ব্যবহার করে এবং স্থিরভাবে অঙ্গভঙ্গি সনাক্ত করতে ডিভাইস গ্যালারি থেকে ছবি এবং ভিডিওগুলিও ব্যবহার করতে পারে৷
আপনি অ্যাপটিকে আপনার নিজের অ্যান্ড্রয়েড অ্যাপের জন্য একটি সূচনা পয়েন্ট হিসাবে ব্যবহার করতে পারেন, বা একটি বিদ্যমান অ্যাপ পরিবর্তন করার সময় এটি উল্লেখ করতে পারেন। জেসচার রিকগনিজার উদাহরণ কোডটি গিটহাবে হোস্ট করা হয়েছে।
কোডটি ডাউনলোড করুন
নিম্নলিখিত নির্দেশাবলী আপনাকে দেখায় কিভাবে গিট কমান্ড লাইন টুল ব্যবহার করে উদাহরণ কোডের একটি স্থানীয় অনুলিপি তৈরি করতে হয়।
উদাহরণ কোড ডাউনলোড করতে:
- নিম্নলিখিত কমান্ড ব্যবহার করে গিট সংগ্রহস্থল ক্লোন করুন:
git clone https://github.com/google-ai-edge/mediapipe-samples
- ঐচ্ছিকভাবে, স্পার্স চেকআউট ব্যবহার করতে আপনার গিট ইন্সট্যান্স কনফিগার করুন, যাতে আপনার কাছে শুধুমাত্র জেসচার রিকগনিজার উদাহরণ অ্যাপের জন্য ফাইল থাকে:
cd mediapipe git sparse-checkout init --cone git sparse-checkout set examples/gesture_recognizer/android
উদাহরণ কোডের একটি স্থানীয় সংস্করণ তৈরি করার পরে, আপনি প্রকল্পটি অ্যান্ড্রয়েড স্টুডিওতে আমদানি করতে এবং অ্যাপটি চালাতে পারেন। নির্দেশাবলীর জন্য, Android এর জন্য সেটআপ গাইড দেখুন।
মূল উপাদান
নিম্নলিখিত ফাইলগুলিতে এই হাতের অঙ্গভঙ্গি স্বীকৃতি উদাহরণ অ্যাপ্লিকেশনের জন্য গুরুত্বপূর্ণ কোড রয়েছে:
- GestureRecognizerHelper.kt - অঙ্গভঙ্গি শনাক্তকারীকে সূচনা করে এবং মডেল এবং প্রতিনিধি নির্বাচন পরিচালনা করে।
- MainActivity.kt -
GestureRecognizerHelper
এবংGestureRecognizerResultsAdapter
কল করা সহ অ্যাপ্লিকেশনটি প্রয়োগ করে। - GestureRecognizerResultsAdapter.kt - ফলাফলগুলি পরিচালনা করে এবং ফর্ম্যাট করে৷
সেটআপ
এই বিভাগে আপনার ডেভেলপমেন্ট এনভায়রনমেন্ট এবং কোড প্রোজেক্ট সেট আপ করার জন্য বিশেষভাবে জেসচার রিকগনিজার ব্যবহার করার জন্য মূল ধাপগুলি বর্ণনা করে। প্ল্যাটফর্ম সংস্করণ প্রয়োজনীয়তা সহ MediaPipe কার্যগুলি ব্যবহার করার জন্য আপনার বিকাশের পরিবেশ সেট আপ করার বিষয়ে সাধারণ তথ্যের জন্য, Android এর জন্য সেটআপ নির্দেশিকা দেখুন৷
নির্ভরতা
অঙ্গভঙ্গি শনাক্তকারী কাজটি com.google.mediapipe:tasks-vision
লাইব্রেরি ব্যবহার করে। আপনার Android অ্যাপের build.gradle
ফাইলে এই নির্ভরতা যোগ করুন:
dependencies {
implementation 'com.google.mediapipe:tasks-vision:latest.release'
}
মডেল
MediaPipe জেসচার রিকগনিজার টাস্কের জন্য একটি প্রশিক্ষিত মডেল বান্ডেল প্রয়োজন যা এই টাস্কের সাথে সামঞ্জস্যপূর্ণ। জেসচার রিকগনিজারের জন্য উপলব্ধ প্রশিক্ষিত মডেলগুলির বিষয়ে আরও তথ্যের জন্য, টাস্ক ওভারভিউ মডেল বিভাগটি দেখুন।
মডেল নির্বাচন করুন এবং ডাউনলোড করুন এবং আপনার প্রকল্প ডিরেক্টরির মধ্যে এটি সংরক্ষণ করুন:
<dev-project-root>/src/main/assets
ModelAssetPath
প্যারামিটারের মধ্যে মডেলের পাথ নির্দিষ্ট করুন। উদাহরণ কোডে, মডেলটিকে GestureRecognizerHelper.kt
ফাইলে সংজ্ঞায়িত করা হয়েছে:
baseOptionBuilder.setModelAssetPath(MP_RECOGNIZER_TASK)
টাস্ক তৈরি করুন
MediaPipe জেসচার রিকগনিজার টাস্কটি টাস্ক সেট আপ করতে createFromOptions()
ফাংশন ব্যবহার করে। createFromOptions()
ফাংশন কনফিগারেশন বিকল্পের জন্য মান গ্রহণ করে। কনফিগারেশন বিকল্প সম্পর্কে আরও তথ্যের জন্য, কনফিগারেশন বিকল্পগুলি দেখুন।
অঙ্গভঙ্গি সনাক্তকারী 3টি ইনপুট ডেটা প্রকার সমর্থন করে: স্থির চিত্র, ভিডিও ফাইল এবং লাইভ ভিডিও স্ট্রিম। টাস্ক তৈরি করার সময় আপনাকে আপনার ইনপুট ডেটা টাইপের সাথে সম্পর্কিত চলমান মোড নির্দিষ্ট করতে হবে। কীভাবে টাস্ক তৈরি করতে হয় এবং অনুমান চালাতে হয় তা দেখতে আপনার ইনপুট ডেটা টাইপের সাথে সম্পর্কিত ট্যাবটি বেছে নিন।
ছবি
val baseOptionsBuilder = BaseOptions.builder().setModelAssetPath(MP_RECOGNIZER_TASK) val baseOptions = baseOptionBuilder.build() val optionsBuilder = GestureRecognizer.GestureRecognizerOptions.builder() .setBaseOptions(baseOptions) .setMinHandDetectionConfidence(minHandDetectionConfidence) .setMinTrackingConfidence(minHandTrackingConfidence) .setMinHandPresenceConfidence(minHandPresenceConfidence) .setRunningMode(RunningMode.IMAGE) val options = optionsBuilder.build() gestureRecognizer = GestureRecognizer.createFromOptions(context, options)
ভিডিও
val baseOptionsBuilder = BaseOptions.builder().setModelAssetPath(MP_RECOGNIZER_TASK) val baseOptions = baseOptionBuilder.build() val optionsBuilder = GestureRecognizer.GestureRecognizerOptions.builder() .setBaseOptions(baseOptions) .setMinHandDetectionConfidence(minHandDetectionConfidence) .setMinTrackingConfidence(minHandTrackingConfidence) .setMinHandPresenceConfidence(minHandPresenceConfidence) .setRunningMode(RunningMode.VIDEO) val options = optionsBuilder.build() gestureRecognizer = GestureRecognizer.createFromOptions(context, options)
লাইভ স্ট্রিম
val baseOptionsBuilder = BaseOptions.builder().setModelAssetPath(MP_RECOGNIZER_TASK) val baseOptions = baseOptionBuilder.build() val optionsBuilder = GestureRecognizer.GestureRecognizerOptions.builder() .setBaseOptions(baseOptions) .setMinHandDetectionConfidence(minHandDetectionConfidence) .setMinTrackingConfidence(minHandTrackingConfidence) .setMinHandPresenceConfidence(minHandPresenceConfidence) .setResultListener(this::returnLivestreamResult) .setErrorListener(this::returnLivestreamError) .setRunningMode(RunningMode.LIVE_STREAM) val options = optionsBuilder.build() gestureRecognizer = GestureRecognizer.createFromOptions(context, options)
জেসচার রিকগনিজার উদাহরণ কোড বাস্তবায়ন ব্যবহারকারীকে প্রক্রিয়াকরণ মোডগুলির মধ্যে স্যুইচ করতে দেয়। পদ্ধতিটি টাস্ক তৈরির কোডটিকে আরও জটিল করে তোলে এবং আপনার ব্যবহারের ক্ষেত্রে উপযুক্ত নাও হতে পারে। আপনি GestureRecognizerHelper.kt
ফাইলের setupGestureRecognizer()
ফাংশনে এই কোডটি দেখতে পারেন।
কনফিগারেশন বিকল্প
এই টাস্কে Android অ্যাপের জন্য নিম্নলিখিত কনফিগারেশন বিকল্প রয়েছে:
বিকল্পের নাম | বর্ণনা | মান পরিসীমা | ডিফল্ট মান | |
---|---|---|---|---|
runningMode | টাস্কের জন্য চলমান মোড সেট করে। তিনটি মোড আছে: IMAGE: একক ইমেজ ইনপুট জন্য মোড. ভিডিও: একটি ভিডিওর ডিকোড করা ফ্রেমের মোড। লাইভ_স্ট্রিম: ইনপুট ডেটার লাইভস্ট্রিমের মোড, যেমন ক্যামেরা থেকে। এই মোডে, ফলাফল শ্রোতাকে অ্যাসিঙ্ক্রোনাসভাবে ফলাফল পেতে একটি শ্রোতা সেট আপ করতে কল করতে হবে। | { IMAGE, VIDEO, LIVE_STREAM } | IMAGE | |
numHands | GestureRecognizer দ্বারা সর্বাধিক সংখ্যক হাত সনাক্ত করা যেতে পারে। | Any integer > 0 | 1 | |
minHandDetectionConfidence | হাত শনাক্তকরণের ন্যূনতম আত্মবিশ্বাসের স্কোর পাম সনাক্তকরণ মডেলে সফল বলে বিবেচিত হবে। | 0.0 - 1.0 | 0.5 | |
minHandPresenceConfidence | হাতের ল্যান্ডমার্ক সনাক্তকরণ মডেলে হাতের উপস্থিতি স্কোরের সর্বনিম্ন আত্মবিশ্বাসের স্কোর। জেসচার রিকগনিজারের ভিডিও মোড এবং লাইভ স্ট্রিম মোডে, হ্যান্ড ল্যান্ডমার্ক মডেল থেকে হাতের উপস্থিতি আত্মবিশ্বাসী স্কোর এই থ্রেশহোল্ডের নীচে থাকলে, এটি পাম সনাক্তকরণ মডেলটিকে ট্রিগার করে। অন্যথায়, একটি লাইটওয়েট হ্যান্ড ট্র্যাকিং অ্যালগরিদম পরবর্তী ল্যান্ডমার্ক সনাক্তকরণের জন্য হাতের অবস্থান নির্ধারণ করতে ব্যবহৃত হয়। | 0.0 - 1.0 | 0.5 | |
minTrackingConfidence | হ্যান্ড ট্র্যাকিং সফল বলে বিবেচিত হওয়ার জন্য সর্বনিম্ন আত্মবিশ্বাসের স্কোর। এটি বর্তমান ফ্রেমের হাত এবং শেষ ফ্রেমের মধ্যে বাউন্ডিং বক্স IoU থ্রেশহোল্ড৷ জেসচার রিকগনিজারের ভিডিও মোড এবং স্ট্রীম মোডে, ট্র্যাকিং ব্যর্থ হলে, জেসচার রেকগনিজার হাত সনাক্তকরণ ট্রিগার করে। অন্যথায়, হাত সনাক্তকরণ এড়িয়ে গেছে। | 0.0 - 1.0 | 0.5 | |
cannedGesturesClassifierOptions | ক্যানড অঙ্গভঙ্গি ক্লাসিফায়ার আচরণ কনফিগার করার জন্য বিকল্প। ক্যানড অঙ্গভঙ্গিগুলি হল ["None", "Closed_Fist", "Open_Palm", "Pointing_Up", "Thumb_Down", "Thumb_Up", "Victory", "ILoveYou"] |
|
| |
customGesturesClassifierOptions | কাস্টম অঙ্গভঙ্গি ক্লাসিফায়ার আচরণ কনফিগার করার জন্য বিকল্প। |
|
| |
resultListener | ইঙ্গিত শনাক্তকারী লাইভ স্ট্রীম মোডে থাকলে ফলাফল শ্রোতাকে অ্যাসিঙ্ক্রোনাসভাবে শ্রেণীবিভাগের ফলাফল পেতে সেট করে। চলমান মোড LIVE_STREAM এ সেট করা থাকলেই কেবল ব্যবহার করা যাবে৷ | ResultListener | N/A | N/A |
errorListener | একটি ঐচ্ছিক ত্রুটি শ্রোতা সেট করে। | ErrorListener | N/A | N/A |
ডেটা প্রস্তুত করুন
জেসচার রিকগনিজার ছবি, ভিডিও ফাইল এবং লাইভ স্ট্রিম ভিডিওর সাথে কাজ করে। টাস্কটি ডেটা ইনপুট প্রিপ্রসেসিং পরিচালনা করে, যার মধ্যে আকার পরিবর্তন, ঘূর্ণন এবং মান স্বাভাবিককরণ সহ।
নিম্নলিখিত কোডটি প্রসেসিংয়ের জন্য ডেটা কীভাবে হস্তান্তর করতে হয় তা প্রদর্শন করে। থিসিস নমুনাগুলিতে চিত্র, ভিডিও ফাইল এবং লাইভ ভিডিও স্ট্রিম থেকে ডেটা কীভাবে পরিচালনা করা যায় তার বিশদ অন্তর্ভুক্ত রয়েছে।
ছবি
import com.google.mediapipe.framework.image.BitmapImageBuilder import com.google.mediapipe.framework.image.MPImage // Convert the input Bitmap object to an MPImage object to run inference val mpImage = BitmapImageBuilder(image).build()
ভিডিও
import com.google.mediapipe.framework.image.BitmapImageBuilder import com.google.mediapipe.framework.image.MPImage val argb8888Frame = if (frame.config == Bitmap.Config.ARGB_8888) frame else frame.copy(Bitmap.Config.ARGB_8888, false) // Convert the input Bitmap object to an MPImage object to run inference val mpImage = BitmapImageBuilder(argb8888Frame).build()
লাইভ স্ট্রিম
import com.google.mediapipe.framework.image.BitmapImageBuilder import com.google.mediapipe.framework.image.MPImage // Convert the input Bitmap object to an MPImage object to run inference val mpImage = BitmapImageBuilder(rotatedBitmap).build()
জেসচার রিকগনিজার উদাহরণ কোডে, GestureRecognizerHelper.kt
ফাইলে ডেটা প্রস্তুতি পরিচালনা করা হয়।
টাস্ক চালান
অঙ্গভঙ্গি শনাক্তকারী অনুমানগুলিকে ট্রিগার করার জন্য recognize
, recognizeForVideo
এবং recognizeAsync
ফাংশন ব্যবহার করে। অঙ্গভঙ্গি শনাক্তকরণের জন্য, এতে ইনপুট ডেটা প্রিপ্রসেস করা, ছবিতে হাত শনাক্ত করা, হাতের ল্যান্ডমার্ক শনাক্ত করা এবং ল্যান্ডমার্ক থেকে হাতের অঙ্গভঙ্গি শনাক্ত করা জড়িত।
নিম্নলিখিত কোডটি প্রদর্শন করে কিভাবে টাস্ক মডেলের সাথে প্রক্রিয়াকরণ চালানো যায়। এই নমুনাগুলিতে চিত্র, ভিডিও ফাইল এবং লাইভ ভিডিও স্ট্রিম থেকে ডেটা কীভাবে পরিচালনা করতে হয় তার বিশদ অন্তর্ভুক্ত রয়েছে।
ছবি
val result = gestureRecognizer?.recognize(mpImage)
ভিডিও
val timestampMs = i * inferenceIntervalMs gestureRecognizer?.recognizeForVideo(mpImage, timestampMs) ?.let { recognizerResult -> resultList.add(recognizerResult) }
লাইভ স্ট্রিম
val mpImage = BitmapImageBuilder(rotatedBitmap).build() val frameTime = SystemClock.uptimeMillis() gestureRecognizer?.recognizeAsync(mpImage, frameTime)
নিম্নলিখিত নোট করুন:
- ভিডিও মোড বা লাইভ স্ট্রিম মোডে চলাকালীন, আপনাকে অবশ্যই অঙ্গভঙ্গি শনাক্তকারী টাস্কে ইনপুট ফ্রেমের টাইমস্ট্যাম্প প্রদান করতে হবে।
- ইমেজ বা ভিডিও মোডে চলাকালীন, অঙ্গভঙ্গি শনাক্তকারী কাজটি বর্তমান থ্রেডটিকে অবরুদ্ধ করবে যতক্ষণ না এটি ইনপুট চিত্র বা ফ্রেম প্রক্রিয়াকরণ শেষ করে। ইউজার ইন্টারফেস ব্লক করা এড়াতে, একটি ব্যাকগ্রাউন্ড থ্রেডে প্রসেসিং চালান।
- লাইভ স্ট্রীম মোডে চলার সময়, জেসচার রিকগনিজার টাস্ক বর্তমান থ্রেডটিকে ব্লক করে না কিন্তু অবিলম্বে ফিরে আসে। এটি প্রতিবার একটি ইনপুট ফ্রেম প্রক্রিয়াকরণ শেষ হলে এটি স্বীকৃতির ফলাফল সহ তার ফলাফল শ্রোতাকে আহ্বান করবে। জেসচার রিকগনিজার টাস্কটি অন্য ফ্রেমের প্রক্রিয়াকরণে ব্যস্ত থাকার সময় যদি স্বীকৃতি ফাংশনটি কল করা হয়, টাস্কটি নতুন ইনপুট ফ্রেমটিকে উপেক্ষা করবে।
অঙ্গভঙ্গি শনাক্তকারী উদাহরণ কোডে, GestureRecognizerHelper.kt
ফাইলে recognize
, recognizeForVideo
, এবং recognizeAsync
ফাংশনগুলি সংজ্ঞায়িত করা হয়েছে৷
হ্যান্ডেল এবং প্রদর্শন ফলাফল
অঙ্গভঙ্গি শনাক্তকারী প্রতিটি শনাক্তকরণ চালানোর জন্য একটি অঙ্গভঙ্গি সনাক্তকরণ ফলাফল বস্তু তৈরি করে। ফলাফল বস্তুতে চিত্র স্থানাঙ্কে হাতের ল্যান্ডমার্ক, বিশ্ব স্থানাঙ্কে হ্যান্ড ল্যান্ডমার্ক, হ্যান্ডেডনেস (বাম/ডান হাত), এবং সনাক্ত করা হাতের হাতের অঙ্গভঙ্গি বিভাগ রয়েছে।
নিম্নলিখিত এই টাস্ক থেকে আউটপুট ডেটার একটি উদাহরণ দেখায়:
ফলাফলপ্রাপ্ত GestureRecognizerResult
এ চারটি উপাদান রয়েছে এবং প্রতিটি উপাদান একটি অ্যারে, যেখানে প্রতিটি উপাদান একটি একক শনাক্ত করা হাতের শনাক্ত ফলাফল ধারণ করে।
হাতেখড়ি
শনাক্ত করা হাত বাম বা ডান হাত কিনা তা বোঝায়।
অঙ্গভঙ্গি
সনাক্ত করা হাতের স্বীকৃত অঙ্গভঙ্গি বিভাগ।
ল্যান্ডমার্ক
এখানে 21টি হ্যান্ড ল্যান্ডমার্ক রয়েছে, প্রতিটি
x
,y
এবংz
সমন্বয়ে গঠিত।x
এবংy
স্থানাঙ্কগুলি যথাক্রমে চিত্রের প্রস্থ এবং উচ্চতা দ্বারা [0.0, 1.0] এ স্বাভাবিক করা হয়।z
স্থানাঙ্কটি ল্যান্ডমার্ক গভীরতার প্রতিনিধিত্ব করে, কব্জির গভীরতাটি মূল। মান যত ছোট হবে, ল্যান্ডমার্ক ক্যামেরার কাছাকাছি হবে।z
এর মাত্রা প্রায়x
এর মতো একই স্কেল ব্যবহার করে।বিশ্ব ল্যান্ডমার্ক
21টি হাতের ল্যান্ডমার্কও বিশ্ব স্থানাঙ্কে উপস্থাপন করা হয়েছে। প্রতিটি ল্যান্ডমার্ক
x
,y
, এবংz
দ্বারা গঠিত যা হাতের জ্যামিতিক কেন্দ্রে উৎপত্তির সাথে মিটারে বাস্তব-বিশ্বের 3D স্থানাঙ্কের প্রতিনিধিত্ব করে।
GestureRecognizerResult:
Handedness:
Categories #0:
index : 0
score : 0.98396
categoryName : Left
Gestures:
Categories #0:
score : 0.76893
categoryName : Thumb_Up
Landmarks:
Landmark #0:
x : 0.638852
y : 0.671197
z : -3.41E-7
Landmark #1:
x : 0.634599
y : 0.536441
z : -0.06984
... (21 landmarks for a hand)
WorldLandmarks:
Landmark #0:
x : 0.067485
y : 0.031084
z : 0.055223
Landmark #1:
x : 0.063209
y : -0.00382
z : 0.020920
... (21 world landmarks for a hand)
নিম্নলিখিত চিত্রগুলি টাস্ক আউটপুটের একটি ভিজ্যুয়ালাইজেশন দেখায়:
Gesture Recognizer উদাহরণ কোডে, GestureRecognizerResultsAdapter.kt
ফাইলের GestureRecognizerResultsAdapter
ক্লাস ফলাফলগুলি পরিচালনা করে।