Android এর জন্য অঙ্গভঙ্গি স্বীকৃতি নির্দেশিকা

MediaPipe জেসচার রিকগনিজার টাস্ক আপনাকে রিয়েল টাইমে হাতের অঙ্গভঙ্গি চিনতে দেয় এবং সনাক্ত করা হাতের স্বীকৃত হাতের অঙ্গভঙ্গি ফলাফল এবং হ্যান্ড ল্যান্ডমার্ক প্রদান করে। এই নির্দেশাবলী আপনাকে Android অ্যাপগুলির সাথে অঙ্গভঙ্গি শনাক্তকারী কীভাবে ব্যবহার করতে হয় তা দেখায়৷ এই নির্দেশাবলীতে বর্ণিত কোড নমুনা GitHub এ উপলব্ধ।

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

কোড উদাহরণ

MediaPipe টাস্কের উদাহরণ কোড হল Android এর জন্য একটি Gesture Recognizer অ্যাপের একটি সহজ বাস্তবায়ন। উদাহরণটি ক্রমাগত হাতের অঙ্গভঙ্গি সনাক্ত করতে একটি ভৌত ​​অ্যান্ড্রয়েড ডিভাইসে ক্যামেরা ব্যবহার করে এবং স্থিরভাবে অঙ্গভঙ্গি সনাক্ত করতে ডিভাইস গ্যালারি থেকে ছবি এবং ভিডিওগুলিও ব্যবহার করতে পারে৷

আপনি অ্যাপটিকে আপনার নিজের অ্যান্ড্রয়েড অ্যাপের জন্য একটি সূচনা পয়েন্ট হিসাবে ব্যবহার করতে পারেন, বা একটি বিদ্যমান অ্যাপ পরিবর্তন করার সময় এটি উল্লেখ করতে পারেন। জেসচার রিকগনিজার উদাহরণ কোডটি গিটহাবে হোস্ট করা হয়েছে।

কোডটি ডাউনলোড করুন

নিম্নলিখিত নির্দেশাবলী আপনাকে দেখায় কিভাবে গিট কমান্ড লাইন টুল ব্যবহার করে উদাহরণ কোডের একটি স্থানীয় অনুলিপি তৈরি করতে হয়।

উদাহরণ কোড ডাউনলোড করতে:

  1. নিম্নলিখিত কমান্ড ব্যবহার করে গিট সংগ্রহস্থল ক্লোন করুন:
    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. ঐচ্ছিকভাবে, স্পার্স চেকআউট ব্যবহার করার জন্য আপনার গিট ইন্সট্যান্স কনফিগার করুন, যাতে আপনার কাছে শুধুমাত্র জেসচার রিকগনিজার উদাহরণ অ্যাপের জন্য ফাইল থাকে:
    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"]
  • প্রদর্শন নামের লোকেল: TFLite মডেল মেটাডেটার মাধ্যমে নির্দিষ্ট প্রদর্শন নামের জন্য ব্যবহার করা লোকেল, যদি থাকে।
  • সর্বাধিক ফলাফল: সর্বোচ্চ স্কোর শ্রেণীবিভাগ ফলাফল ফেরত দিতে হবে। <0 হলে, সমস্ত উপলব্ধ ফলাফল ফেরত দেওয়া হবে।
  • স্কোর থ্রেশহোল্ড: যে স্কোরের নিচে ফলাফল প্রত্যাখ্যান করা হয়েছে। 0 তে সেট করা হলে, সমস্ত উপলব্ধ ফলাফল ফেরত দেওয়া হবে।
  • ক্যাটাগরি মঞ্জুরি তালিকা: বিভাগের নামের মঞ্জুরি তালিকা। যদি খালি না থাকে, শ্রেণীবিভাগ ফলাফল যাদের এই সেটে নেই সেগুলি ফিল্টার আউট করা হবে৷ ডিনালিস্টের সাথে পারস্পরিক একচেটিয়া।
  • বিভাগ অস্বীকারকারী: বিভাগের নাম অস্বীকারকারী। যদি খালি না থাকে, শ্রেণীবিভাগের ফলাফল যার শ্রেণী এই সেটে রয়েছে তা ফিল্টার আউট করা হবে। অনুমোদিত তালিকার সাথে পারস্পরিকভাবে একচেটিয়া।
    • প্রদর্শন নামের লোকেল: any string
    • সর্বোচ্চ ফলাফল: any integer
    • স্কোর থ্রেশহোল্ড: 0.0-1.0
    • শ্রেণী অনুমোদিত তালিকা: vector of strings
    • ক্যাটাগরি ডিনালিস্ট: vector of strings
    • প্রদর্শন নামের লোকেল: "en"
    • সর্বোচ্চ ফলাফল: -1
    • স্কোর থ্রেশহোল্ড: 0
    • বিভাগ অনুমোদিত তালিকা: খালি
    • বিভাগ অস্বীকারকারী: খালি
    customGesturesClassifierOptions কাস্টম অঙ্গভঙ্গি ক্লাসিফায়ার আচরণ কনফিগার করার জন্য বিকল্প।
  • প্রদর্শন নামের লোকেল: TFLite মডেল মেটাডেটার মাধ্যমে নির্দিষ্ট প্রদর্শন নামের জন্য ব্যবহার করা লোকেল, যদি থাকে।
  • সর্বাধিক ফলাফল: সর্বোচ্চ স্কোর শ্রেণীবিভাগ ফলাফল ফেরত দিতে হবে। <0 হলে, সমস্ত উপলব্ধ ফলাফল ফেরত দেওয়া হবে।
  • স্কোর থ্রেশহোল্ড: যে স্কোরের নিচে ফলাফল প্রত্যাখ্যান করা হয়েছে। 0 তে সেট করা হলে, সমস্ত উপলব্ধ ফলাফল ফেরত দেওয়া হবে।
  • ক্যাটাগরি মঞ্জুরি তালিকা: বিভাগের নামের মঞ্জুরি তালিকা। যদি খালি না থাকে, শ্রেণীবিভাগ ফলাফল যাদের এই সেটে নেই সেগুলি ফিল্টার আউট করা হবে৷ ডিনালিস্টের সাথে পারস্পরিক একচেটিয়া।
  • বিভাগ অস্বীকারকারী: বিভাগের নাম অস্বীকারকারী। যদি খালি না থাকে, শ্রেণীবিভাগের ফলাফল যার শ্রেণী এই সেটে রয়েছে তা ফিল্টার আউট করা হবে। অনুমোদিত তালিকার সাথে পারস্পরিকভাবে একচেটিয়া।
    • প্রদর্শন নামের লোকেল: any string
    • সর্বোচ্চ ফলাফল: any integer
    • স্কোর থ্রেশহোল্ড: 0.0-1.0
    • শ্রেণী অনুমোদিত তালিকা: vector of strings
    • ক্যাটাগরি ডিনালিস্ট: vector of strings
    • প্রদর্শন নামের লোকেল: "en"
    • সর্বোচ্চ ফলাফল: -1
    • স্কোর থ্রেশহোল্ড: 0
    • বিভাগ অনুমোদিত তালিকা: খালি
    • বিভাগ অস্বীকারকারী: খালি
    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 ক্লাস ফলাফলগুলি পরিচালনা করে।