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

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

कोड का उदाहरण

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

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

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

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

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

  1. नीचे दिए गए कमांड का इस्तेमाल करके git रिपॉज़िटरी का क्लोन बनाएं:
    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. इसके अलावा, स्पार्स चेकआउट का इस्तेमाल करने के लिए अपना git इंस्टेंस कॉन्फ़िगर करें, इसलिए आपके पास सिर्फ़ Object Detector उदाहरण ऐप्लिकेशन की फ़ाइलें होती हैं:
    cd mediapipe
    git sparse-checkout init --cone
    git sparse-checkout set examples/object_detection/android
    

उदाहरण के तौर पर दिए गए कोड का लोकल वर्शन बनाने के बाद, प्रोजेक्ट को इंपोर्ट किया जा सकता है और इस ऐप्लिकेशन को चलाएं. निर्देशों के लिए, इसे देखें Android के लिए सेटअप गाइड.

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

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

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

सेटअप

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

डिपेंडेंसी

ऑब्जेक्ट डिटेक्टर, com.google.mediapipe:tasks-vision लाइब्रेरी का इस्तेमाल करता है. इसे जोड़ें आपकी build.gradle फ़ाइल पर निर्भरता Android ऐप्लिकेशन डेवलपमेंट प्रोजेक्ट. इसके साथ ज़रूरी डिपेंडेंसी इंपोर्ट करें यह कोड डालें:

dependencies {
    implementation 'com.google.mediapipe:tasks-vision:latest.release'
}

मॉडल

MediaPipe ऑब्जेक्ट डिटेक्टर टास्क के लिए एक प्रशिक्षित मॉडल की ज़रूरत है, जो इसके साथ काम कर सके टास्क. ऑब्जेक्ट डिटेक्टर के लिए उपलब्ध ट्रेन किए गए मॉडल के बारे में ज़्यादा जानकारी के लिए, देखें टास्क की खास जानकारी मॉडल सेक्शन.

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

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

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

टास्क बनाएं

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

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

इमेज

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

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

आपको इनपुट इमेज या फ़्रेम को 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 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 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()
MPImage mpImage = new MediaImageBuilder(mediaImage).build();
    

ऑब्जेक्ट डिटेक्टर के उदाहरण कोड में, डेटा तैयार करने का काम ObjectDetectorHelper detectImage(), detectVideoFile(), detectLivestreamFrame() में मौजूद क्लास फ़ंक्शन.

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

जिस डेटा के साथ काम किया जा रहा है उसके आधार पर, ObjectDetector.detect...() तरीका इस्तेमाल किया जा सकता है. इस्तेमाल की जाने वाली चीज़ें अलग-अलग इमेज के लिए detect(), वीडियो फ़ाइलों में फ़्रेम के लिए detectForVideo(), और वीडियो स्ट्रीम के लिए detectAsync(). जब किसी डिवाइस पर गतिविधि की पहचान की जाती है वीडियो स्ट्रीम है, तो पक्का करें कि आपने डिटेक्शन को एक अलग थ्रेड पर चलाया हो, ताकि आप यूज़र इंटरफ़ेस थ्रेड को ब्लॉक करती है.

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

इमेज

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