Android के लिए इमेज एम्बेड करने की गाइड

MediaPipe Image Embedder टास्क से आप इमेज डेटा को संख्या के रूप में निरूपित कर सकते है ML से जुड़े इमेज प्रोसेसिंग टास्क को पूरा करने के लिए. उदाहरण के लिए, एक जैसी दो इमेज. ये निर्देश आपको वेब ब्राउज़र पर Android ऐप्लिकेशन के साथ इमेज एम्बेडर.

क्षमताओं, मॉडल, और कॉन्फ़िगरेशन के विकल्पों के बारे में ज़्यादा जानकारी पाने के लिए इस टास्क की खास जानकारी देखें.

कोड का उदाहरण

MediaPipe Tasks के उदाहरण कोड से, इमेज एम्बेडर को आसानी से लागू किया जा सकता है Android के लिए ऐप. इस उदाहरण में, असली Android डिवाइस के कैमरे का इस्तेमाल इन कामों के लिए किया गया है लगातार इमेज एम्बेड की जा सकती हैं. साथ ही, सेव की गई इमेज फ़ाइलों के साथ भी एम्बेडर को चलाया जा सकता है डिवाइस पर.

इस ऐप्लिकेशन का इस्तेमाल, अपने Android ऐप्लिकेशन को शुरू करने के लिए किया जा सकता है. इसके अलावा, इसे रेफ़रंस के तौर पर भी इस्तेमाल किया जा सकता है को अपडेट करें. इमेज एम्बेडर का उदाहरण कोड यहां होस्ट किया गया है GitHub.

कोड डाउनलोड करें

नीचे दिए गए निर्देशों में आपको उदाहरण की स्थानीय कॉपी बनाने का तरीका बताया गया है git कमांड लाइन टूल का इस्तेमाल करके कोड बनाना और उसमें बदलाव करना.

उदाहरण कोड डाउनलोड करने के लिए:

  1. नीचे दिए गए कमांड का इस्तेमाल करके git रिपॉज़िटरी का क्लोन बनाएं:
    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. वैकल्पिक रूप से, विरल चेकआउट का इस्तेमाल करने के लिए अपने git इंस्टेंस को कॉन्फ़िगर करें, ताकि सिर्फ़ इमेज एम्बेडर के उदाहरण ऐप्लिकेशन के लिए फ़ाइलें:
    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 Image Embedder टास्क के लिए एक प्रशिक्षित मॉडल की ज़रूरत है, जो इसके साथ काम कर सके टास्क. इमेज एम्बेडर के लिए तैयार किए गए उपलब्ध मॉडल के बारे में ज़्यादा जानकारी के लिए, देखें टास्क की खास जानकारी मॉडल सेक्शन.

मॉडल चुनें और डाउनलोड करें, और फिर उसे अपनी प्रोजेक्ट डायरेक्ट्री में सेव करें:

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

ModelAssetPath पैरामीटर में मॉडल का पाथ तय करें. इस उदाहरण के लिए, मॉडल को इसके setupImageEmbedder() फ़ंक्शन में तय किया गया है ImageEmbedderHelper.kt फ़ाइल:

पाथ की जानकारी देने के लिए, BaseOptions.Builder.setModelAssetPath() तरीके का इस्तेमाल करें इस्तेमाल किया जाता है. यह विधि अगले अगले सेक्शन में जाएं.

टास्क बनाएं

टास्क बनाने के लिए, createFromOptions फ़ंक्शन का इस्तेमाल किया जा सकता है. कॉन्टेंट बनाने createFromOptions फ़ंक्शन, एम्बेडर को सेट करने के लिए कॉन्फ़िगरेशन के विकल्प स्वीकार करता है के विकल्प. कॉन्फ़िगरेशन के विकल्पों के बारे में ज़्यादा जानकारी पाने के लिए, कॉन्फ़िगरेशन देखें खास जानकारी.

इमेज एम्बेडर टास्क तीन इनपुट डेटा टाइप के साथ काम करता है: स्टिल इमेज, वीडियो फ़ाइलें, साथ ही, लाइव वीडियो स्ट्रीम भी दिखेंगी. आपको इससे जुड़ा दौड़ने मोड तय करना होगा आपके इनपुट डेटा टाइप को टास्क बनाते समय डालें. इससे जुड़ा टैब चुनें अपने इनपुट डेटा टाइप को देखें, ताकि टास्क बनाने और अनुमान लगाने का तरीका देखा जा सके.

इमेज

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);
    

उदाहरण के तौर पर दिए गए कोड को लागू करने पर, उपयोगकर्ता एक प्रोसेसिंग से दूसरे प्रोसेस पर जा सकता है मोड. इस तरीके से टास्क बनाने का कोड ज़्यादा मुश्किल हो जाता है. ऐसा हो सकता है कि आपके इस्तेमाल के उदाहरण के हिसाब से सही हो. आप इस कोड को यहां देख सकते हैं: setupImageEmbedder() फ़ंक्शन ImageEmbedderHelper.kt फ़ाइल से लिए जाते हैं.

कॉन्फ़िगरेशन विकल्प

इस टास्क में Android ऐप्लिकेशन के लिए, नीचे दिए गए कॉन्फ़िगरेशन के विकल्प मौजूद हैं:

विकल्प का नाम ब्यौरा मान की सीमा डिफ़ॉल्ट मान
runningMode टास्क के लिए रनिंग मोड सेट करता है. तीन मोड:

अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है इमेज: सिंगल इमेज इनपुट का मोड.
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है वीडियो: किसी वीडियो के डिकोड किए गए फ़्रेम के लिए मोड.
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है LIVE_STREAM: इनपुट की लाइवस्ट्रीम करने का मोड जैसी निजी जानकारी को किसी भी समय रिकॉर्ड कर सकते हैं. इस मोड में, resultListener होना चाहिए नतीजे पाने के लिए, लिसनर सेट अप करने के लिए कॉल किया गया एसिंक्रोनस रूप से.
{IMAGE, VIDEO, LIVE_STREAM} IMAGE
l2_normalize क्या लौटाए गए फ़ीचर वेक्टर को L2 मानदंड के साथ नॉर्मलाइज़ करना है. इस विकल्प का उपयोग केवल तभी करें, जब मॉडल में पहले से कोई नेटिव नेटिव न हो L2_NORMALIZATION TFLite Op. ज़्यादातर मामलों में, पहले से ही ऐसा होता है और इसलिए, L2 नॉर्मलाइज़ेशन को TFLite अनुमान की मदद से बिना किसी ज़रूरत के पूरा किया जाता है इस विकल्प के लिए. Boolean False
quantize क्या लौटाए गए एम्बेड की संख्या को स्केलर क्वांटाइज़ेशन. एम्बेडिंग को अस्पष्ट रूप से इकाई-नॉर्म और इसलिए, किसी भी डाइमेंशन की वैल्यू [-1.0, 1.0] होने की गारंटी होती है. इस्तेमाल की जाने वाली चीज़ें तो l2_normalize विकल्प चुनना होगा. Boolean False
resultListener एम्बेड किए गए नतीजे पाने के लिए, रिज़ल्ट लिसनर को सेट करता है जब इमेज एम्बेडर लाइव स्ट्रीम में हो, तब एसिंक्रोनस रूप से उपलब्ध मोड. इसका इस्तेमाल सिर्फ़ तब किया जा सकता है, जब रनिंग मोड को LIVE_STREAM पर सेट किया गया हो लागू नहीं सेट नहीं है
errorListener गड़बड़ी की जानकारी देने वाला वैकल्पिक लिसनर सेट करता है. लागू नहीं सेट नहीं है

डेटा तैयार करें

इमेज एम्बेडर, इमेज, वीडियो फ़ाइल, और लाइव स्ट्रीम वीडियो के साथ काम करता है. टास्क यह डेटा इनपुट की प्री-प्रोसेसिंग को हैंडल करता है. इसमें साइज़ बदलना, रोटेशन, और वैल्यू शामिल है नॉर्मलाइज़ेशन.

आपको इनपुट इमेज या फ़्रेम को 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 users device as a Bitmap object using BitmapFactory.

// Convert an Androids Bitmap object to a MediaPipes 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 videos metadata, load the METADATA_KEY_DURATION and
// METADATA_KEY_VIDEO_FRAME_COUNT value. Youll need them
// to calculate the timestamp of each frame later.

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

// Convert the Androids Bitmap object to a MediaPipes Image object.
Image mpImage = new BitmapImageBuilder(frame).build();
    

लाइव स्ट्रीम

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

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

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

उदाहरण कोड में, डेटा तैयार करने का काम ImageEmbedderHelper.kt फ़ाइल से लिए जाते हैं.

टास्क को पूरा करें

ट्रिगर करने के लिए, अपने रनिंग मोड से जुड़े embed फ़ंक्शन को कॉल किया जा सकता है अनुमान. Image Embedder 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));