অ্যান্ড্রয়েডের জন্য হ্যান্ড ল্যান্ডমার্ক সনাক্তকরণ গাইড, অ্যান্ড্রয়েডের জন্য হ্যান্ড ল্যান্ডমার্ক সনাক্তকরণ গাইড

MediaPipe হ্যান্ড ল্যান্ডমার্কার টাস্ক আপনাকে একটি ছবিতে হাতের ল্যান্ডমার্ক সনাক্ত করতে দেয়। এই নির্দেশাবলী আপনাকে দেখায় কিভাবে Android অ্যাপের সাথে Hand Landmarker ব্যবহার করতে হয়। এই নির্দেশাবলীতে বর্ণিত কোড নমুনা GitHub এ উপলব্ধ।

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

কোড উদাহরণ

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

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

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

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

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

  1. নিম্নলিখিত কমান্ড ব্যবহার করে গিট সংগ্রহস্থল ক্লোন করুন:
    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. ঐচ্ছিকভাবে, স্পার্স চেকআউট ব্যবহার করার জন্য আপনার গিট ইন্সট্যান্স কনফিগার করুন, যাতে আপনার কাছে হ্যান্ড ল্যান্ডমার্কার উদাহরণ অ্যাপের জন্য শুধুমাত্র ফাইল থাকে:
    cd mediapipe
    git sparse-checkout init --cone
    git sparse-checkout set examples/hand_landmarker/android
    

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

মূল উপাদান

নিম্নলিখিত ফাইলগুলিতে এই হাতের ল্যান্ডমার্ক সনাক্তকরণ উদাহরণ অ্যাপ্লিকেশনের জন্য গুরুত্বপূর্ণ কোড রয়েছে:

  • HandLandmarkerHelper.kt - হ্যান্ড ল্যান্ডমার্ক ডিটেক্টর শুরু করে এবং মডেল এবং প্রতিনিধি নির্বাচন পরিচালনা করে।
  • MainActivity.kt - HandLandmarkerHelper কল করা সহ অ্যাপ্লিকেশনটি প্রয়োগ করে।

সেটআপ

এই বিভাগে বিশেষভাবে হ্যান্ড ল্যান্ডমার্কার ব্যবহার করার জন্য আপনার উন্নয়ন পরিবেশ এবং কোড প্রকল্পগুলি সেট আপ করার জন্য মূল পদক্ষেপগুলি বর্ণনা করে। প্ল্যাটফর্ম সংস্করণ প্রয়োজনীয়তা সহ 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 প্যারামিটারের মধ্যে মডেলের পাথ নির্দিষ্ট করুন। উদাহরণ কোডে, মডেলটিকে HandLandmarkerHelper.kt ফাইলে সংজ্ঞায়িত করা হয়েছে:

baseOptionBuilder.setModelAssetPath(MP_HAND_LANDMARKER_TASK)

টাস্ক তৈরি করুন

MediaPipe হ্যান্ড ল্যান্ডমার্কার টাস্কটি সেট আপ করতে createFromOptions() ফাংশন ব্যবহার করে। createFromOptions() ফাংশন কনফিগারেশন বিকল্পের জন্য মান গ্রহণ করে। কনফিগারেশন বিকল্প সম্পর্কে আরও তথ্যের জন্য, কনফিগারেশন বিকল্পগুলি দেখুন।

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

ছবি

val baseOptionsBuilder = BaseOptions.builder().setModelAssetPath(MP_HAND_LANDMARKER_TASK)
val baseOptions = baseOptionBuilder.build()

val optionsBuilder =
    HandLandmarker.HandLandmarkerOptions.builder()
        .setBaseOptions(baseOptions)
        .setMinHandDetectionConfidence(minHandDetectionConfidence)
        .setMinTrackingConfidence(minHandTrackingConfidence)
        .setMinHandPresenceConfidence(minHandPresenceConfidence)
        .setNumHands(maxNumHands)
        .setRunningMode(RunningMode.IMAGE)

val options = optionsBuilder.build()

handLandmarker =
    HandLandmarker.createFromOptions(context, options)
    

ভিডিও

val baseOptionsBuilder = BaseOptions.builder().setModelAssetPath(MP_HAND_LANDMARKER_TASK)
val baseOptions = baseOptionBuilder.build()

val optionsBuilder =
    HandLandmarker.HandLandmarkerOptions.builder()
        .setBaseOptions(baseOptions)
        .setMinHandDetectionConfidence(minHandDetectionConfidence)
        .setMinTrackingConfidence(minHandTrackingConfidence)
        .setMinHandPresenceConfidence(minHandPresenceConfidence)
        .setNumHands(maxNumHands)
        .setRunningMode(RunningMode.VIDEO)

val options = optionsBuilder.build()

handLandmarker =
    HandLandmarker.createFromOptions(context, options)
    

লাইভ স্ট্রিম

val baseOptionsBuilder = BaseOptions.builder().setModelAssetPath(MP_HAND_LANDMARKER_TASK)
val baseOptions = baseOptionBuilder.build()

val optionsBuilder =
    HandLandmarker.HandLandmarkerOptions.builder()
        .setBaseOptions(baseOptions)
        .setMinHandDetectionConfidence(minHandDetectionConfidence)
        .setMinTrackingConfidence(minHandTrackingConfidence)
        .setMinHandPresenceConfidence(minHandPresenceConfidence)
        .setNumHands(maxNumHands)
        .setResultListener(this::returnLivestreamResult)
        .setErrorListener(this::returnLivestreamError)
        .setRunningMode(RunningMode.VIDEO)

val options = optionsBuilder.build()

handLandmarker =
    HandLandmarker.createFromOptions(context, options)
    

হ্যান্ড ল্যান্ডমার্কার উদাহরণ কোড বাস্তবায়ন ব্যবহারকারীকে প্রক্রিয়াকরণ মোডগুলির মধ্যে স্যুইচ করতে দেয়। পদ্ধতিটি টাস্ক তৈরির কোডটিকে আরও জটিল করে তোলে এবং আপনার ব্যবহারের ক্ষেত্রে উপযুক্ত নাও হতে পারে। আপনি HandLandmarkerHelper.kt ফাইলের setupHandLandmarker() ফাংশনে এই কোডটি দেখতে পারেন।

কনফিগারেশন বিকল্প

এই টাস্কে Android অ্যাপের জন্য নিম্নলিখিত কনফিগারেশন বিকল্প রয়েছে:

বিকল্পের নাম বর্ণনা মান পরিসীমা ডিফল্ট মান
runningMode টাস্কের জন্য চলমান মোড সেট করে। তিনটি মোড আছে:

IMAGE: একক ইমেজ ইনপুট জন্য মোড.

ভিডিও: একটি ভিডিওর ডিকোড করা ফ্রেমের মোড।

লাইভ_স্ট্রিম: ইনপুট ডেটার লাইভস্ট্রিমের মোড, যেমন ক্যামেরা থেকে। এই মোডে, ফলাফল শ্রোতাকে অ্যাসিঙ্ক্রোনাসভাবে ফলাফল পেতে একটি শ্রোতা সেট আপ করতে কল করতে হবে।
{ IMAGE, VIDEO, LIVE_STREAM } IMAGE
numHands হ্যান্ড ল্যান্ডমার্ক ডিটেক্টর দ্বারা সর্বাধিক সংখ্যক হাত সনাক্ত করা হয়েছে। 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
resultListener হ্যান্ড ল্যান্ডমার্কার লাইভ স্ট্রীম মোডে থাকাকালীন অ্যাসিঙ্ক্রোনাসভাবে সনাক্তকরণের ফলাফল পেতে ফলাফল শ্রোতাকে সেট করে। চলমান মোড LIVE_STREAM এ সেট করা থাকলে শুধুমাত্র প্রযোজ্য৷ N/A N/A
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()
    

হ্যান্ড ল্যান্ডমার্কার উদাহরণ কোডে, ডেটা প্রস্তুতি HandLandmarkerHelper.kt ফাইলে পরিচালনা করা হয়।

টাস্ক চালান

আপনি যে ধরণের ডেটা নিয়ে কাজ করছেন তার উপর নির্ভর করে, সেই ডেটা টাইপের জন্য নির্দিষ্ট HandLandmarker.detect...() পদ্ধতিটি ব্যবহার করুন৷ পৃথক চিত্রের জন্য detect() ব্যবহার করুন, ভিডিও ফাইলের ফ্রেমের জন্য detectForVideo() এবং ভিডিও স্ট্রীমের জন্য detectAsync() ব্যবহার করুন। আপনি যখন একটি ভিডিও স্ট্রীমে সনাক্তকরণ সম্পাদন করছেন, তখন নিশ্চিত করুন যে আপনি ব্যবহারকারী ইন্টারফেস থ্রেড ব্লক করা এড়াতে একটি পৃথক থ্রেডে সনাক্তকরণগুলি চালাচ্ছেন।

নিম্নলিখিত কোড নমুনাগুলি এই বিভিন্ন ডেটা মোডে হ্যান্ড ল্যান্ডমার্কার চালানোর সহজ উদাহরণগুলি দেখায়:

ছবি

val result = handLandmarker?.detect(mpImage)
    

ভিডিও

val timestampMs = i * inferenceIntervalMs

handLandmarker?.detectForVideo(mpImage, timestampMs)
    ?.let { detectionResult ->
        resultList.add(detectionResult)
    }
    

লাইভ স্ট্রিম

val mpImage = BitmapImageBuilder(rotatedBitmap).build()
val frameTime = SystemClock.uptimeMillis()

handLandmarker?.detectAsync(mpImage, frameTime)
    

নিম্নলিখিত নোট করুন:

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

Hand Landmarker উদাহরণ কোডে, detect , detectForVideo , এবং detectAsync ফাংশন HandLandmarkerHelper.kt ফাইলে সংজ্ঞায়িত করা হয়েছে।

হ্যান্ডেল এবং প্রদর্শন ফলাফল

হ্যান্ড ল্যান্ডমার্কার প্রতিটি সনাক্তকরণ চালানোর জন্য একটি হ্যান্ড ল্যান্ডমার্কার ফলাফল বস্তু তৈরি করে। ফলাফল বস্তুতে চিত্র স্থানাঙ্কে হাতের ল্যান্ডমার্ক, বিশ্ব স্থানাঙ্কে হ্যান্ড ল্যান্ডমার্ক এবং শনাক্ত করা হাতের হ্যান্ডেডনেস (বাম/ডান হাত) রয়েছে।

নিম্নলিখিত এই টাস্ক থেকে আউটপুট ডেটার একটি উদাহরণ দেখায়:

HandLandmarkerResult আউটপুটে তিনটি উপাদান রয়েছে। প্রতিটি উপাদান একটি অ্যারে, যেখানে প্রতিটি উপাদান একটি একক সনাক্ত করা হাতের জন্য নিম্নলিখিত ফলাফল ধারণ করে:

  • হাতেখড়ি

    শনাক্ত করা হাত বাম বা ডান হাত কিনা তা বোঝায়।

  • ল্যান্ডমার্ক

    এখানে 21টি হ্যান্ড ল্যান্ডমার্ক রয়েছে, প্রতিটি x , y এবং z সমন্বয়ে গঠিত। x এবং y স্থানাঙ্কগুলি যথাক্রমে চিত্রের প্রস্থ এবং উচ্চতা দ্বারা [0.0, 1.0] এ স্বাভাবিক করা হয়। z স্থানাঙ্কটি ল্যান্ডমার্ক গভীরতার প্রতিনিধিত্ব করে, কব্জির গভীরতাটি মূল। মান যত ছোট হবে, ল্যান্ডমার্ক ক্যামেরার কাছাকাছি হবে। z এর মাত্রা প্রায় x এর মতো একই স্কেল ব্যবহার করে।

  • বিশ্ব ল্যান্ডমার্ক

    21টি হাতের ল্যান্ডমার্কও বিশ্ব স্থানাঙ্কে উপস্থাপন করা হয়েছে। প্রতিটি ল্যান্ডমার্ক x , y , এবং z দ্বারা গঠিত যা হাতের জ্যামিতিক কেন্দ্রে উৎপত্তির সাথে মিটারে বাস্তব-বিশ্বের 3D স্থানাঙ্কের প্রতিনিধিত্ব করে।

HandLandmarkerResult:
  Handedness:
    Categories #0:
      index        : 0
      score        : 0.98396
      categoryName : Left
  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)

নিম্নলিখিত চিত্রটি টাস্ক আউটপুটের একটি ভিজ্যুয়ালাইজেশন দেখায়:

হ্যান্ড ল্যান্ডমার্কার উদাহরণ কোড দেখায় কিভাবে টাস্ক থেকে প্রত্যাবর্তিত ফলাফল প্রদর্শন করতে হয়, আরো বিস্তারিত জানার জন্য OverlayView ক্লাস দেখুন।