Android এর জন্য পোজ ল্যান্ডমার্ক সনাক্তকরণ গাইড

MediaPipe Pose Landmarker টাস্ক আপনাকে একটি ছবি বা ভিডিওতে মানবদেহের ল্যান্ডমার্ক সনাক্ত করতে দেয়। আপনি শরীরের মূল অবস্থানগুলি সনাক্ত করতে, অঙ্গবিন্যাস বিশ্লেষণ করতে এবং আন্দোলনগুলিকে শ্রেণীবদ্ধ করতে এই কাজটি ব্যবহার করতে পারেন। এই কাজটি মেশিন লার্নিং (ML) মডেল ব্যবহার করে যা একক ছবি বা ভিডিওর সাথে কাজ করে। টাস্কটি ইমেজ কোঅর্ডিনেট এবং 3-ডাইমেনশনাল ওয়ার্ল্ড কোঅর্ডিনেটে বডি পোজ ল্যান্ডমার্ককে আউটপুট করে।

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

কোড উদাহরণ

MediaPipe টাস্কের উদাহরণ কোড হল Android এর জন্য একটি Pose Landmarker অ্যাপের একটি সহজ বাস্তবায়ন। উদাহরণটি একটি অবিচ্ছিন্ন ভিডিও স্ট্রীমে ভঙ্গি সনাক্ত করতে একটি শারীরিক অ্যান্ড্রয়েড ডিভাইসে ক্যামেরা ব্যবহার করে। অ্যাপটি ডিভাইস গ্যালারি থেকে ছবি এবং ভিডিওতে ভঙ্গিও শনাক্ত করতে পারে।

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

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

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

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

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

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

মূল উপাদান

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

  • PoseLandmarkerHelper.kt - পোজ ল্যান্ডমার্কার শুরু করে এবং মডেল এবং প্রতিনিধি নির্বাচন পরিচালনা করে।
  • CameraFragment.kt - ডিভাইসের ক্যামেরা পরিচালনা করে এবং ছবি এবং ভিডিও ইনপুট ডেটা প্রক্রিয়া করে।
  • GalleryFragment.kt - আউটপুট ইমেজ বা ভিডিও প্রদর্শন করতে OverlayView এর সাথে ইন্টারঅ্যাক্ট করে।
  • OverlayView.kt - সনাক্ত করা ভঙ্গির জন্য প্রদর্শন প্রয়োগ করে।

সেটআপ

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

নির্ভরতা

পোজ ল্যান্ডমার্কার টাস্ক com.google.mediapipe:tasks-vision লাইব্রেরি ব্যবহার করে। আপনার Android অ্যাপের build.gradle ফাইলে এই নির্ভরতা যোগ করুন:

dependencies {
    implementation 'com.google.mediapipe:tasks-vision:latest.release'
}

মডেল

MediaPipe Pose Landmarker টাস্কের জন্য একটি প্রশিক্ষিত মডেল বান্ডিল প্রয়োজন যা এই কাজের সাথে সামঞ্জস্যপূর্ণ। পোজ ল্যান্ডমার্কারের জন্য উপলব্ধ প্রশিক্ষিত মডেল সম্পর্কে আরও তথ্যের জন্য, টাস্ক ওভারভিউ মডেল বিভাগটি দেখুন।

মডেল নির্বাচন করুন এবং ডাউনলোড করুন এবং আপনার প্রকল্প ডিরেক্টরির মধ্যে এটি সংরক্ষণ করুন:

<dev-project-root>/src/main/assets

ModelAssetPath প্যারামিটারের মধ্যে মডেলের পাথ নির্দিষ্ট করুন। উদাহরণ কোডে, মডেলটিকে PoseLandmarkerHelper.kt ফাইলে সংজ্ঞায়িত করা হয়েছে:

val modelName = "pose_landmarker_lite.task"
baseOptionsBuilder.setModelAssetPath(modelName)

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

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

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

ছবি

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

val optionsBuilder = 
    poseLandmarker.poseLandmarkerOptions.builder()
        .setBaseOptions(baseOptionsBuilder.build())
        .setMinPoseDetectionConfidence(minPoseDetectionConfidence)
        .setMinTrackingConfidence(minPoseTrackingConfidence)
        .setMinPosePresenceConfidence(minposePresenceConfidence)
        .setNumPoses(maxNumPoses)
        .setRunningMode(RunningMode.IMAGE)

val options = optionsBuilder.build()
poseLandmarker = poseLandmarker.createFromOptions(context, options)
    

ভিডিও

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

val optionsBuilder = 
    poseLandmarker.poseLandmarkerOptions.builder()
        .setBaseOptions(baseOptionsBuilder.build())
        .setMinPoseDetectionConfidence(minPoseDetectionConfidence)
        .setMinTrackingConfidence(minPoseTrackingConfidence)
        .setMinPosePresenceConfidence(minposePresenceConfidence)
        .setNumPoses(maxNumPoses)
        .setRunningMode(RunningMode.VIDEO)

val options = optionsBuilder.build()
poseLandmarker = poseLandmarker.createFromOptions(context, options)
    

সরাসরি সম্প্রচার

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

val optionsBuilder = 
    poseLandmarker.poseLandmarkerOptions.builder()
        .setBaseOptions(baseOptionsBuilder.build())
        .setMinPoseDetectionConfidence(minPoseDetectionConfidence)
        .setMinTrackingConfidence(minPoseTrackingConfidence)
        .setMinPosePresenceConfidence(minposePresenceConfidence)
        .setNumPoses(maxNumPoses)
        .setResultListener(this::returnLivestreamResult)
        .setErrorListener(this::returnLivestreamError)
        .setRunningMode(RunningMode.LIVE_STREAM)

val options = optionsBuilder.build()
poseLandmarker = poseLandmarker.createFromOptions(context, options)
    

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

কনফিগারেশন অপশন

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

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

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

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

লাইভ_স্ট্রিম: ইনপুট ডেটার লাইভস্ট্রিমের মোড, যেমন ক্যামেরা থেকে। এই মোডে, ফলাফল শ্রোতাকে অ্যাসিঙ্ক্রোনাসভাবে ফলাফল পেতে একটি শ্রোতা সেট আপ করতে কল করতে হবে।
{ IMAGE, VIDEO, LIVE_STREAM } IMAGE
numposes পোজ ল্যান্ডমার্কার দ্বারা সনাক্ত করা যেতে পারে এমন সর্বোচ্চ সংখ্যক পোজ। Integer > 0 1
minPoseDetectionConfidence ভঙ্গি সনাক্তকরণের জন্য ন্যূনতম আত্মবিশ্বাসের স্কোর সফল বলে বিবেচিত হবে। Float [0.0,1.0] 0.5
minPosePresenceConfidence পোজ ল্যান্ডমার্ক সনাক্তকরণে পোজ উপস্থিতি স্কোরের সর্বনিম্ন আত্মবিশ্বাসের স্কোর। Float [0.0,1.0] 0.5
minTrackingConfidence পোজ ট্র্যাকিংয়ের জন্য ন্যূনতম আত্মবিশ্বাসের স্কোর সফল বলে বিবেচিত হবে। Float [0.0,1.0] 0.5
outputSegmentationMasks পোজ ল্যান্ডমার্কার সনাক্ত করা পোজের জন্য একটি বিভাজন মাস্ক আউটপুট করে কিনা। Boolean False
resultListener Pose Landmarker যখন লাইভ স্ট্রিম মোডে থাকে তখন ল্যান্ডমার্কারের ফলাফল অ্যাসিঙ্ক্রোনাসভাবে পেতে ফলাফল শ্রোতাকে সেট করে। চলমান মোড LIVE_STREAM এ সেট করা থাকলেই কেবল ব্যবহার করা যাবে৷ ResultListener N/A
errorListener একটি ঐচ্ছিক ত্রুটি শ্রোতা সেট করে। ErrorListener 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()
    

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

টাস্ক চালান

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

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

ছবি

val result = poseLandmarker.detect(mpImage)
    

ভিডিও

val timestampMs = i * inferenceIntervalMs

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

সরাসরি সম্প্রচার

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

poseLandmarker.detectAsync(mpImage, frameTime)
    

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

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

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

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

পোজ ল্যান্ডমার্কার প্রতিটি সনাক্তকরণ চালানোর জন্য একটি poseLandmarkerResult অবজেক্ট প্রদান করে। ফলাফল বস্তুতে প্রতিটি পোজ ল্যান্ডমার্কের জন্য স্থানাঙ্ক রয়েছে।

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

PoseLandmarkerResult:
  Landmarks:
    Landmark #0:
      x            : 0.638852
      y            : 0.671197
      z            : 0.129959
      visibility   : 0.9999997615814209
      presence     : 0.9999984502792358
    Landmark #1:
      x            : 0.634599
      y            : 0.536441
      z            : -0.06984
      visibility   : 0.999909
      presence     : 0.999958
    ... (33 landmarks per pose)
  WorldLandmarks:
    Landmark #0:
      x            : 0.067485
      y            : 0.031084
      z            : 0.055223
      visibility   : 0.9999997615814209
      presence     : 0.9999984502792358
    Landmark #1:
      x            : 0.063209
      y            : -0.00382
      z            : 0.020920
      visibility   : 0.999976
      presence     : 0.999998
    ... (33 world landmarks per pose)
  SegmentationMasks:
    ... (pictured below)

আউটপুটে প্রতিটি ল্যান্ডমার্কের জন্য স্বাভাবিক স্থানাঙ্ক ( Landmarks ) এবং বিশ্ব স্থানাঙ্ক ( WorldLandmarks ) উভয়ই রয়েছে।

আউটপুটে নিম্নলিখিত স্বাভাবিক স্থানাঙ্ক রয়েছে ( Landmarks ):

  • x এবং y : ল্যান্ডমার্ক স্থানাঙ্কগুলি চিত্রের প্রস্থ ( x ) এবং উচ্চতা ( y ) দ্বারা 0.0 এবং 1.0 এর মধ্যে স্বাভাবিক করা হয়েছে।

  • z : ল্যান্ডমার্ক গভীরতা, মূল হিসাবে নিতম্বের মধ্যবিন্দুতে গভীরতা সহ। মান যত ছোট হবে, ল্যান্ডমার্ক ক্যামেরার কাছাকাছি হবে। z এর মাত্রা প্রায় x এর মতো একই স্কেল ব্যবহার করে।

  • visibility : ল্যান্ডমার্কটি চিত্রের মধ্যে দৃশ্যমান হওয়ার সম্ভাবনা।

আউটপুটে নিম্নলিখিত বিশ্ব স্থানাঙ্ক রয়েছে ( WorldLandmarks ):

  • x , y , এবং z : মিটারে বাস্তব-বিশ্বের ত্রিমাত্রিক স্থানাঙ্ক, মূল হিসাবে নিতম্বের মধ্যবিন্দু।

  • visibility : ল্যান্ডমার্কটি চিত্রের মধ্যে দৃশ্যমান হওয়ার সম্ভাবনা।

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

ঐচ্ছিক সেগমেন্টেশন মাস্ক প্রতিটি পিক্সেল একজন শনাক্ত ব্যক্তির অন্তর্গত হওয়ার সম্ভাবনা উপস্থাপন করে। নিম্নলিখিত চিত্রটি টাস্ক আউটপুটের একটি সেগমেন্টেশন মাস্ক:

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