অ্যান্ড্রয়েডের জন্য ইমেজ এম্বেডিং গাইড

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

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

কোড উদাহরণ

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_embedder/android
    

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

মূল উপাদান

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

  • ImageEmbedderHelper.kt : ইমেজ এমবেডার শুরু করে এবং মডেল ও প্রতিনিধি নির্বাচন পরিচালনা করে।
  • MainActivity.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 প্যারামিটারের মধ্যে মডেলের পাথ নির্দিষ্ট করুন। উদাহরণ কোডে, ImageEmbedderHelper.kt ফাইলে setupImageEmbedder() ফাংশনে মডেলটি সংজ্ঞায়িত করা হয়েছে:

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

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

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

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

ছবি

ImageEmbedderOptions options =
  ImageEmbedderOptions.builder()
    .setBaseOptions(
      BaseOptions.builder().setModelAssetPath("model.tflite").build())
    .setQuantize(true)
    .setRunningMode(RunningMode.IMAGE)
    .build();
imageEmbedder = ImageEmbedder.createFromOptions(context, options);
    

ভিডিও

ImageEmbedderOptions options =
  ImageEmbedderOptions.builder()
    .setBaseOptions(
      BaseOptions.builder().setModelAssetPath("model.tflite").build())
    .setQuantize(true)
    .setRunningMode(RunningMode.VIDEO)
    .build();
imageEmbedder = ImageEmbedder.createFromOptions(context, options);
    

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

ImageEmbedderOptions options =
  ImageEmbedderOptions.builder()
    .setBaseOptions(
      BaseOptions.builder().setModelAssetPath("model.tflite").build())
    .setQuantize(true)
    .setRunningMode(RunningMode.LIVE_STREAM)
    .setResultListener((result, inputImage) -> {
         // Process the embedding result here.
    })
    .build();
imageEmbedder = ImageEmbedder.createFromOptions(context, options);
    

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

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

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

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

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

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

লাইভ_স্ট্রিম: ইনপুট ডেটার লাইভস্ট্রিমের মোড, যেমন ক্যামেরা থেকে। এই মোডে, ফলাফল শ্রোতাকে অ্যাসিঙ্ক্রোনাসভাবে ফলাফল পেতে একটি শ্রোতা সেট আপ করতে কল করতে হবে।
{ IMAGE, VIDEO, LIVE_STREAM } IMAGE
l2_normalize L2 আদর্শের সাথে প্রত্যাবর্তিত বৈশিষ্ট্য ভেক্টরকে স্বাভাবিক করতে হবে কিনা। এই বিকল্পটি ব্যবহার করুন শুধুমাত্র যদি মডেলটিতে ইতিমধ্যে একটি নেটিভ L2_NORMALIZATION TFLite Op না থাকে৷ বেশিরভাগ ক্ষেত্রে, এটি ইতিমধ্যেই হয় এবং এইভাবে এই বিকল্পের প্রয়োজন ছাড়াই TFLite অনুমানের মাধ্যমে L2 স্বাভাবিককরণ অর্জন করা হয়। Boolean False
quantize প্রত্যাবর্তিত এমবেডিং স্কেলার কোয়ান্টাইজেশনের মাধ্যমে বাইটে পরিমাপ করা উচিত কিনা। এমবেডিংগুলিকে পরোক্ষভাবে ইউনিট-নর্ম হিসাবে ধরে নেওয়া হয় এবং তাই যে কোনও মাত্রা [-1.0, 1.0]-এ একটি মান থাকার নিশ্চয়তা দেওয়া হয়। যদি এটি না হয় তবে l2_normalize বিকল্পটি ব্যবহার করুন। Boolean False
resultListener ইমেজ এমবেডার যখন লাইভ স্ট্রিম মোডে থাকে তখন অ্যাসিঙ্ক্রোনাসভাবে এম্বেডিং ফলাফল পেতে ফলাফল শ্রোতাকে সেট করে। চলমান মোড LIVE_STREAM এ সেট করা থাকলেই কেবল ব্যবহার করা যাবে৷ 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();
    

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

টাস্ক চালান

অনুমানগুলি ট্রিগার করতে আপনি আপনার চলমান মোডের সাথে সম্পর্কিত embed ফাংশনটিকে কল করতে পারেন। ইমেজ এমবেডার API ইনপুট ইমেজ বা ফ্রেমের জন্য এমবেডিং ভেক্টর প্রদান করে।

ছবি

ImageEmbedderResult embedderResult = imageEmbedder.embed(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.
ImageEmbedderResult embedderResult =
    imageEmbedder.embedForVideo(image, frameTimestampMs);
    

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


// Run inference on the frame. The embedding results will be available
// via the `resultListener` provided in the `ImageEmbedderOptions` when
// the image embedder was created.
imageEmbedder.embedAsync(image, frameTimestampMs);
    

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

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

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

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

ইনফারেন্স চালানোর পরে, ইমেজ এমবেডার টাস্কটি একটি ImageEmbedderResult অবজেক্ট প্রদান করে যাতে ইনপুট ইমেজের জন্য এমবেডিংয়ের একটি তালিকা (হয় ফ্লোটিং পয়েন্ট বা স্কেলার-কোয়ান্টাইজড) থাকে।

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

ImageEmbedderResult:
  Embedding #0 (sole embedding head):
    float_embedding: {0.0, 0.0, ..., 0.0, 1.0, 0.0, 0.0, 2.0}
    head_index: 0

এই ফলাফলটি নিম্নলিখিত চিত্রটি এম্বেড করে প্রাপ্ত হয়েছিল:

আপনি ImageEmbedder.cosineSimilarity ফাংশন ব্যবহার করে দুটি এম্বেডিংয়ের সাদৃশ্য তুলনা করতে পারেন। একটি উদাহরণের জন্য নিম্নলিখিত কোড দেখুন.

// Compute cosine similarity.
double similarity = ImageEmbedder.cosineSimilarity(
  result.embeddingResult().embeddings().get(0),
  otherResult.embeddingResult().embeddings().get(0));