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