অ্যান্ড্রয়েডের জন্য অবজেক্ট ডিটেকশন গাইড

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

কোড উদাহরণ

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

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

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

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

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

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

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

মূল উপাদান

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

  • ObjectDetectorHelper.kt - অবজেক্ট ডিটেক্টর শুরু করে এবং মডেল এবং প্রতিনিধি নির্বাচন পরিচালনা করে
  • MainActivity.kt - অ্যাপ্লিকেশন বাস্তবায়ন করে এবং ব্যবহারকারী ইন্টারফেস উপাদান একত্রিত করে
  • OverlayView.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

মডেল দ্বারা ব্যবহৃত পথ নির্দিষ্ট করতে BaseOptions.Builder.setModelAssetPath() পদ্ধতি ব্যবহার করুন। একটি কোড উদাহরণের জন্য, পরবর্তী বিভাগ দেখুন।

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

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

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

ছবি

ObjectDetectorOptions options =
  ObjectDetectorOptions.builder()
    .setBaseOptions(BaseOptions.builder().setModelAssetPath(‘model.tflite’).build())
    .setRunningMode(RunningMode.IMAGE)
    .setMaxResults(5)
    .build();
objectDetector = ObjectDetector.createFromOptions(context, options);
    

ভিডিও

ObjectDetectorOptions options =
  ObjectDetectorOptions.builder()
    .setBaseOptions(BaseOptions.builder().setModelAssetPath(‘model.tflite’).build())
    .setRunningMode(RunningMode.VIDEO)
    .setMaxResults(5)
    .build();
objectDetector = ObjectDetector.createFromOptions(context, options);
    

লাইভ স্ট্রিম

ObjectDetectorOptions options =
  ObjectDetectorOptions.builder()
    .setBaseOptions(BaseOptions.builder().setModelAssetPath(‘model.tflite’).build())
    .setRunningMode(RunningMode.LIVE_STREAM)
    .setMaxResults(5)
    .setResultListener((result, inputImage) -> {
      // Process the detection result here.
    })
    .setErrorListener((result, inputImage) -> {
      // Process the classification errors here.
    })
   .build();
objectDetector = ObjectDetector.createFromOptions(context, options);
    

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

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

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

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

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

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

লাইভ_স্ট্রিম: ইনপুট ডেটার লাইভস্ট্রিমের মোড, যেমন ক্যামেরা থেকে। এই মোডে, ফলাফল শ্রোতাকে অ্যাসিঙ্ক্রোনাসভাবে ফলাফল পেতে একটি শ্রোতা সেট আপ করতে কল করতে হবে।
{ IMAGE, VIDEO, LIVE_STREAM } IMAGE
displayNamesLocales টাস্কের মডেলের মেটাডেটাতে প্রদত্ত প্রদর্শন নামের জন্য ব্যবহার করার জন্য লেবেলের ভাষা সেট করে, যদি উপলব্ধ থাকে। ইংরেজির জন্য ডিফল্ট হল en । আপনি TensorFlow Lite Metadata Writer API ব্যবহার করে একটি কাস্টম মডেলের মেটাডেটাতে স্থানীয় লেবেল যোগ করতে পারেন স্থানীয় কোড en
maxResults ফিরতে সর্বোচ্চ স্কোর করা শনাক্তকরণ ফলাফলের ঐচ্ছিক সর্বোচ্চ সংখ্যা সেট করে। যেকোনো ইতিবাচক সংখ্যা -1 (সমস্ত ফলাফল ফেরত দেওয়া হয়)
scoreThreshold ভবিষ্যদ্বাণী স্কোর থ্রেশহোল্ড সেট করে যা মডেল মেটাডেটাতে প্রদত্ত একটিকে ওভাররাইড করে (যদি থাকে)। এই মানের নিচের ফলাফল প্রত্যাখ্যান করা হয়। কোন ভাসা সেট করা হয়নি
categoryAllowlist অনুমোদিত বিভাগের নামের ঐচ্ছিক তালিকা সেট করে। যদি খালি না থাকে, শনাক্তকরণ ফলাফল যার বিভাগের নাম এই সেটে নেই তা ফিল্টার আউট করা হবে। সদৃশ বা অজানা বিভাগের নাম উপেক্ষা করা হয়। এই বিকল্পটি categoryDenylist সাথে পারস্পরিকভাবে একচেটিয়া এবং একটি ত্রুটিতে উভয় ফলাফল ব্যবহার করে। কোনো স্ট্রিং সেট করা হয়নি
categoryDenylist অনুমোদিত নয় এমন বিভাগের নামের ঐচ্ছিক তালিকা সেট করে। খালি না থাকলে, এই সেটে যার বিভাগের নাম আছে তা সনাক্তকরণের ফলাফলগুলি ফিল্টার করা হবে৷ সদৃশ বা অজানা বিভাগের নাম উপেক্ষা করা হয়। এই বিকল্পটি categoryAllowlist সাথে পারস্পরিকভাবে একচেটিয়া এবং একটি ত্রুটিতে উভয় ফলাফল ব্যবহার করে। কোনো স্ট্রিং সেট করা হয়নি
resultListener যখন অবজেক্ট ডিটেক্টর লাইভ স্ট্রীম মোডে থাকে তখন ফলাফল শ্রোতাকে অ্যাসিঙ্ক্রোনাসভাবে সনাক্তকরণের ফলাফল পেতে সেট করে। আপনি যখন রানমোডকে LIVE_STREAM-এ সেট করেন তখনই আপনি এই বিকল্পটি ব্যবহার করতে পারেন৷ প্রযোজ্য নয় সেট করা হয়নি

ডেটা প্রস্তুত করুন

অবজেক্ট ডিটেক্টরে পাঠানোর আগে আপনাকে ইনপুট ইমেজ বা ফ্রেমটিকে com.google.mediapipe.framework.image.MPImage অবজেক্টে রূপান্তর করতে হবে।

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

ছবি

import com.google.mediapipe.framework.image.BitmapImageBuilder;
import com.google.mediapipe.framework.image.MPImage;

// Load an image on the user’s device as a Bitmap object using BitmapFactory.

// Convert an Android’s Bitmap object to a MediaPipe’s Image object.
Image mpImage = new BitmapImageBuilder(bitmap).build();
    

ভিডিও

import com.google.mediapipe.framework.image.BitmapImageBuilder;
import com.google.mediapipe.framework.image.MPImage;

// Load a video file on the user's device using MediaMetadataRetriever

// From the video’s metadata, load the METADATA_KEY_DURATION and
// METADATA_KEY_VIDEO_FRAME_COUNT values. Use these values
// to calculate the timestamp of each frame later.

// Loop through the video and load each frame as a Bitmap object.

// Convert the Android’s Bitmap object to a MediaPipe’s Image object.
Image mpImage = new BitmapImageBuilder(frame).build();
    

লাইভ স্ট্রিম

import com.google.mediapipe.framework.image.MediaImageBuilder;
import com.google.mediapipe.framework.image.MPImage;

// Create a CameraX’s ImageAnalysis to continuously receive frames
// from the device’s camera. Configure it to output frames in RGBA_8888
// format to match with what is required by the model.

// For each Android’s ImageProxy object received from the ImageAnalysis,
// extract the encapsulated Android’s Image object and convert it to
// a MediaPipe’s Image object.
android.media.Image mediaImage = imageProxy.getImage()
MPImage mpImage = new MediaImageBuilder(mediaImage).build();
    

অবজেক্ট ডিটেক্টর উদাহরণ কোডে, detectImage() , detectVideoFile() , detectLivestreamFrame() ফাংশনের মধ্যে ObjectDetectorHelper ক্লাসে ডেটা প্রস্তুতি পরিচালনা করা হয়।

টাস্ক চালান

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

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

ছবি

ObjectDetectorResult detectionResult = objectDetector.detect(image);
    

ভিডিও

// Calculate the timestamp in milliseconds of the current frame.
long frame_timestamp_ms = 1000 * video_duration * frame_index / frame_count;

// Run inference on the frame.
ObjectDetectorResult detectionResult =
    objectDetector.detectForVideo(image, frameTimestampMs);
    

লাইভ স্ট্রিম

// Run inference on the frame. The detection results will be available
// via the `resultListener` provided in the `ObjectDetectorOptions` when
// the object detector was created.
objectDetector.detectAsync(image, frameTimestampMs);
    

অবজেক্ট ডিটেক্টর কোডের উদাহরণ এই প্রতিটি মোডের বাস্তবায়নকে আরও বিস্তারিতভাবে দেখায় detect() , detectVideoFile() , এবং detectAsync() । উদাহরণ কোড ব্যবহারকারীকে প্রক্রিয়াকরণ মোডগুলির মধ্যে স্যুইচ করার অনুমতি দেয় যা আপনার ব্যবহারের ক্ষেত্রে প্রয়োজন নাও হতে পারে।

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

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

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

অনুমান চালানোর পরে, অবজেক্ট ডিটেক্টর টাস্ক একটি ObjectDetectorResult অবজেক্ট প্রদান করে যা ইনপুট ইমেজে পাওয়া বস্তুগুলির বর্ণনা দেয়।

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

ObjectDetectorResult:
 Detection #0:
  Box: (x: 355, y: 133, w: 190, h: 206)
  Categories:
   index       : 17
   score       : 0.73828
   class name  : dog
 Detection #1:
  Box: (x: 103, y: 15, w: 138, h: 369)
  Categories:
   index       : 17
   score       : 0.73047
   class name  : dog

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

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