Android के लिए ऑब्जेक्ट का पता लगाने वाली गाइड

ऑब्जेक्ट डिटेक्टर टास्क की मदद से, ऑब्जेक्ट की कई क्लास की मौजूदगी और जगह का पता लगाया जा सकता है. उदाहरण के लिए, ऑब्जेक्ट का पता लगाने वाला टूल, किसी इमेज में मौजूद कुत्तों की पहचान कर सकता है. ये निर्देश आपको बताते हैं कि Android पर ऑब्जेक्ट डिटेक्टर टास्क को कैसे इस्तेमाल किया जाता है. इन निर्देशों में दिया गया कोड सैंपल, GitHub पर उपलब्ध है. वेब डेमो पर जाकर, इस टास्क को देखा जा सकता है. इस टास्क की क्षमताओं, मॉडल, और कॉन्फ़िगरेशन विकल्पों के बारे में ज़्यादा जानकारी के लिए, खास जानकारी देखें.

कोड का उदाहरण

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

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

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

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

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

  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 Studio में इंपोर्ट किया जा सकता है. इसके बाद, ऐप्लिकेशन को चलाया जा सकता है. निर्देशों के लिए, Android के लिए सेटअप गाइड देखें.

मुख्य कॉम्पोनेंट

इन फ़ाइलों में ऑब्जेक्ट डिटेक्टर उदाहरण ऐप्लिकेशन का ज़रूरी कोड मौजूद है:

  • ObjectDetectorHelper.kt - ऑब्जेक्ट डिटेक्टर को शुरू करता है और मॉडल और प्रतिनिधि चुनने की प्रक्रिया को मैनेज करता है
  • MainActivity.kt - ऐप्लिकेशन को लागू करता है और यूज़र इंटरफ़ेस के कॉम्पोनेंट इकट्ठा करता है
  • OverlayView.kt - नतीजों को हैंडल और दिखाता है

सेटअप

इस सेक्शन में ऑब्जेक्ट डिटेक्टर का इस्तेमाल करने के लिए, अपने डेवलपमेंट एनवायरमेंट को सेट अप करने और कोड प्रोजेक्ट को सेट करने के मुख्य चरणों के बारे में बताया गया है. MediaPipe Tasks का इस्तेमाल करने और प्लैटफ़ॉर्म के वर्शन की ज़रूरी शर्तों के साथ-साथ अपना डेवलपमेंट एनवायरमेंट सेट अप करने से जुड़ी सामान्य जानकारी के लिए, 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 फ़ंक्शन, कॉन्फ़िगरेशन के विकल्पों को स्वीकार करता है. इनमें रनिंग मोड, डिसप्ले नेम की स्थान-भाषा, ज़्यादा से ज़्यादा नतीजे, कॉन्फ़िडेंस थ्रेशोल्ड, कैटगरी की अनुमति वाली सूची, और ब्लॉकलिस्ट शामिल हैं. अगर कॉन्फ़िगरेशन का विकल्प नहीं दिया गया है, तो डिफ़ॉल्ट वैल्यू का इस्तेमाल किया जाएगा. कॉन्फ़िगरेशन के विकल्पों के बारे में ज़्यादा जानकारी के लिए, कॉन्फ़िगरेशन की खास जानकारी देखें.

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

Image

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 टास्क के लिए, रनिंग मोड सेट करता है. इसके तीन मोड होते हैं:

इमेज: सिंगल इमेज इनपुट के लिए मोड.

वीडियो: वीडियो के डिकोड किए गए फ़्रेम का मोड.

LIVE_STREAM: इनपुट डेटा की लाइव स्ट्रीम का मोड, जैसे कि कैमरे से स्ट्रीम किया जाने वाला मोड. इस मोड में, रिज़ल्ट पहचानकर्ता को लिसनर को सेट अप करने के लिए कॉल किया जाना चाहिए, ताकि वह एसिंक्रोनस तरीके से नतीजे पा सके.
{IMAGE, VIDEO, LIVE_STREAM} IMAGE
displayNamesLocales अगर यह उपलब्ध हो, तो टास्क के मॉडल के मेटाडेटा में दिए गए डिसप्ले नेम के लिए, लेबल की भाषा सेट करता है. अंग्रेज़ी के लिए डिफ़ॉल्ट रूप से en है. TensorFlow Lite Metadata Writer API का इस्तेमाल करके, कस्टम मॉडल के मेटाडेटा में स्थानीय भाषा के हिसाब से लेबल जोड़े जा सकते हैं स्थान-भाषा का कोड en
maxResults वापस लौटाने के लिए, टॉप-स्कोर किए गए पहचान के नतीजों की ज़्यादा से ज़्यादा वैकल्पिक संख्या सेट करता है. कोई भी पॉज़िटिव नंबर -1 (सभी नतीजे दिखाए जाते हैं)
scoreThreshold अनुमान के स्कोर का थ्रेशोल्ड सेट करता है, जो मॉडल मेटाडेटा (अगर कोई है) में दिए गए स्कोर को बदलता है. इस वैल्यू से कम के नतीजे अस्वीकार कर दिए गए हैं. कोई भी फ़्लोट सेट नहीं किया गया है
categoryAllowlist अनुमति वाली कैटगरी के नामों की वैकल्पिक सूची सेट करता है. अगर यह खाली नहीं है, तो जिन कैटगरी का नाम इस सेट में नहीं होगा उन्हें फ़िल्टर कर दिया जाएगा. श्रेणी के डुप्लीकेट या अज्ञात नामों पर ध्यान नहीं दिया जाता है. यह विकल्प categoryDenylist के साथ म्यूचुअली एक्सक्लूसिव है और दोनों नतीजों का इस्तेमाल करने में गड़बड़ी है. कोई भी स्ट्रिंग सेट नहीं किया गया है
categoryDenylist उन कैटगरी के नामों की वैकल्पिक सूची सेट करता है जिनकी अनुमति नहीं है. अगर यह खाली नहीं है, तो पहचान के जिन नतीजों की कैटगरी का नाम इस सेट में होगा उन्हें फ़िल्टर करके बाहर कर दिया जाएगा. श्रेणी के डुप्लीकेट या अज्ञात नामों पर ध्यान नहीं दिया जाता है. यह विकल्प categoryAllowlist के साथ म्यूचुअली एक्सक्लूसिव है और इसका इस्तेमाल करने पर दोनों में गड़बड़ी होगी. कोई भी स्ट्रिंग सेट नहीं किया गया है
resultListener जब ऑब्जेक्ट डिटेक्टर लाइव स्ट्रीम मोड में होता है, तब नतीजे लिसनर को पहचान के नतीजे एसिंक्रोनस तरीके से पाने के लिए सेट करता है. इस विकल्प का इस्तेमाल सिर्फ़ तब किया जा सकता है, जब runningMode को LIVE_STREAM पर सेट किया जाता है. लागू नहीं सेट नहीं किया गया है

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

ऑब्जेक्ट डिटेक्टर को पास करने से पहले, आपको इनपुट इमेज या फ़्रेम को com.google.mediapipe.framework.image.MPImage ऑब्जेक्ट में बदलना होगा.

यहां दिए गए उदाहरणों में बताया गया है कि हर उपलब्ध डेटा टाइप के लिए, डेटा को प्रोसेस करने के लिए कैसे तैयार किया जाता है:

Image

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() का इस्तेमाल करें. किसी वीडियो स्ट्रीम पर डिटेक्शन चलाते समय, यूज़र इंटरफ़ेस थ्रेड को ब्लॉक होने से बचाने के लिए, पक्का करें कि आप डिटेक्शन को किसी अलग थ्रेड पर चलाएं.

नीचे दिए गए कोड सैंपल, इन अलग-अलग डेटा मोड में ऑब्जेक्ट डिटेक्टर को चलाने के आसान उदाहरण दिखाते हैं:

Image

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 क्लास देखें.