অ্যান্ড্রয়েডের জন্য ইমেজ সেগমেন্টেশন গাইড

মিডিয়াপাইপ ইমেজ সেগমেন্টার টাস্ক আপনাকে পটভূমি ঝাপসা করার মতো ভিজ্যুয়াল এফেক্ট প্রয়োগ করার জন্য পূর্বনির্ধারিত বিভাগের উপর ভিত্তি করে চিত্রগুলিকে অঞ্চলে ভাগ করতে দেয়। এই নির্দেশাবলী আপনাকে দেখায় কিভাবে 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/image_segmentation/android
    

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

মূল উপাদান

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

  • ImageSegmenterHelper.kt - ইমেজ সেগমেন্টার টাস্ক শুরু করে এবং মডেল এবং প্রতিনিধি নির্বাচন পরিচালনা করে।
  • CameraFragment.kt - একটি ক্যামেরার জন্য ইউজার ইন্টারফেস এবং কন্ট্রোল কোড প্রদান করে।
  • GalleryFragment.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() পদ্ধতি ব্যবহার করুন। এই পদ্ধতিটি পরবর্তী বিভাগে কোড উদাহরণে উল্লেখ করা হয়েছে।

ইমেজ সেগমেন্টার উদাহরণ কোডে , setupImageSegmenter() ফাংশনে ImageSegmenterHelper.kt ক্লাসে মডেলটিকে সংজ্ঞায়িত করা হয়েছে।

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

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

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

ছবি

ImageSegmenterOptions options =
  ImageSegmenterOptions.builder()
    .setBaseOptions(
      BaseOptions.builder().setModelAssetPath("model.tflite").build())
    .setRunningMode(RunningMode.IMAGE)
    .setOutputCategoryMask(true)
    .setOutputConfidenceMasks(false)
    .build();
imagesegmenter = ImageSegmenter.createFromOptions(context, options);
    

ভিডিও

ImageSegmenterOptions options =
  ImageSegmenterOptions.builder()
    .setBaseOptions(
      BaseOptions.builder().setModelAssetPath("model.tflite").build())
    .setRunningMode(RunningMode.VIDEO)
    .setOutputCategoryMask(true)
    .setOutputConfidenceMasks(false)
    .build();
imagesegmenter = ImageSegmenter.createFromOptions(context, options);
    

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

ImageSegmenterOptions options =
  ImageSegmenterOptions.builder()
    .setBaseOptions(
      BaseOptions.builder().setModelAssetPath("model.tflite").build())
    .setRunningMode(RunningMode.LIVE_STREAM)
    .setOutputCategoryMask(true)
    .setOutputConfidenceMasks(false)
    .setResultListener((result, inputImage) -> {
         // Process the segmentation result here.
    })
    .setErrorListener((result, inputImage) -> {
         // Process the segmentation errors here.
    })
    .build()
imagesegmenter = ImageSegmenter.createFromOptions(context, options)
    

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

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

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

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

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

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

লাইভ_স্ট্রিম: ইনপুট ডেটার লাইভস্ট্রিমের মোড, যেমন ক্যামেরা থেকে। এই মোডে, ফলাফল শ্রোতাকে অ্যাসিঙ্ক্রোনাসভাবে ফলাফল পেতে একটি শ্রোতা সেট আপ করতে কল করতে হবে।
{ IMAGE, VIDEO, LIVE_STREAM } IMAGE
outputCategoryMask যদি True তে সেট করা হয়, আউটপুটে একটি uint8 ইমেজ হিসাবে একটি সেগমেন্টেশন মাস্ক অন্তর্ভুক্ত থাকে, যেখানে প্রতিটি পিক্সেল মান বিজয়ী বিভাগের মান নির্দেশ করে। { True, False } False
outputConfidenceMasks যদি True তে সেট করা হয়, আউটপুটে একটি ফ্লোট মান চিত্র হিসাবে একটি সেগমেন্টেশন মাস্ক অন্তর্ভুক্ত থাকে, যেখানে প্রতিটি ফ্লোট মান বিভাগের আত্মবিশ্বাস স্কোর মানচিত্র উপস্থাপন করে। { True, False } True
displayNamesLocale টাস্কের মডেলের মেটাডেটাতে প্রদত্ত প্রদর্শন নামের জন্য ব্যবহার করার জন্য লেবেলের ভাষা সেট করে, যদি উপলব্ধ থাকে। ইংরেজির জন্য ডিফল্ট হল en । আপনি TensorFlow Lite Metadata Writer API ব্যবহার করে একটি কাস্টম মডেলের মেটাডেটাতে স্থানীয় লেবেল যোগ করতে পারেন স্থানীয় কোড en
resultListener ইমেজ সেগমেন্টার লাইভ স্ট্রীম মোডে থাকলে অ্যাসিঙ্ক্রোনাসভাবে সেগমেন্টেশন ফলাফল পেতে ফলাফল শ্রোতাকে সেট করে। চলমান মোড LIVE_STREAM এ সেট করা থাকলেই কেবল ব্যবহার করা যাবে৷ N/A N/A
errorListener একটি ঐচ্ছিক ত্রুটি শ্রোতা সেট করে। N/A সেট না

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

ইমেজ সেগমেন্টার ছবি, ভিডিও ফাইল এবং লাইভ স্ট্রিম ভিডিও নিয়ে কাজ করে। টাস্কটি ডেটা ইনপুট প্রিপ্রসেসিং পরিচালনা করে, যার মধ্যে আকার পরিবর্তন, ঘূর্ণন এবং মান স্বাভাবিককরণ সহ।

ইমেজ সেগমেন্টারে পাস করার আগে আপনাকে ইনপুট ইমেজ বা ফ্রেমটিকে একটি 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 value. You’ll need them
// 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()
Image mpImage = new MediaImageBuilder(mediaImage).build();
    

ইমেজ সেগমেন্টার উদাহরণ কোডে, segmentLiveStreamFrame() ফাংশন দ্বারা ImageSegmenterHelper ক্লাসে ডেটা প্রস্তুতি পরিচালনা করা হয়।

টাস্ক চালান

আপনি যে চলমান মোড ব্যবহার করছেন তার উপর ভিত্তি করে আপনি একটি ভিন্ন segment ফাংশন কল করুন। ইমেজ সেগমেন্টার ফাংশন ইনপুট ইমেজ বা ফ্রেমের মধ্যে চিহ্নিত সেগমেন্ট অঞ্চল ফেরত দেয়।

ছবি

ImageSegmenterResult segmenterResult = imagesegmenter.segment(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.
ImageSegmenterResult segmenterResult =
    imagesegmenter.segmentForVideo(image, frameTimestampMs);
    

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

// Run inference on the frame. The segmentations results will be available via
// the `resultListener` provided in the `ImageSegmenterOptions` when the image
// segmenter was created.
imagesegmenter.segmentAsync(image, frameTimestampMs);
    

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

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

ইমেজ সেগমেন্টার উদাহরণ কোডে, segment ফাংশন ImageSegmenterHelper.kt ফাইলে সংজ্ঞায়িত করা হয়েছে।

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

ইনফারেন্স চালানোর পরে, ইমেজ সেগমেন্টার টাস্কটি একটি ImageSegmenterResult অবজেক্ট প্রদান করে যা সেগমেন্টেশন টাস্কের ফলাফল ধারণ করে। আউটপুটের বিষয়বস্তু নির্ভর করে outputType উপর যা আপনি সেট করেছেন যখন আপনি টাস্ক কনফিগার করেছেন

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

ক্যাটাগরি আত্মবিশ্বাস

নিম্নলিখিত চিত্রগুলি একটি ক্যাটাগরি কনফিডেন্স মাস্কের জন্য টাস্ক আউটপুটের একটি ভিজ্যুয়ালাইজেশন দেখায়। কনফিডেন্স মাস্ক আউটপুটে [0, 1] এর মধ্যে ফ্লোট মান রয়েছে।

আসল ছবি এবং ক্যাটাগরি কনফিডেন্স মাস্ক আউটপুট। Pascal VOC 2012 ডেটাসেট থেকে উৎস চিত্র।

শ্রেণী মান

নিম্নলিখিত চিত্রগুলি একটি বিভাগ মান মাস্কের জন্য টাস্ক আউটপুটের একটি ভিজ্যুয়ালাইজেশন দেখায়। বিভাগ মাস্ক পরিসীমা হল [0, 255] এবং প্রতিটি পিক্সেল মান মডেল আউটপুট বিজয়ী বিভাগ সূচক প্রতিনিধিত্ব করে। মডেল চিনতে পারে এমন বিভাগগুলির মধ্যে বিজয়ী বিভাগের সূচকের সর্বোচ্চ স্কোর রয়েছে।

মূল ছবি এবং বিভাগ মাস্ক আউটপুট. Pascal VOC 2012 ডেটাসেট থেকে উৎস চিত্র।