Android डिवाइसों के लिए, इमेज क्लासिफ़िकेशन गाइड

MediaPipe इमेज क्लासिफ़ायर टास्क से आपको इमेज की कैटगरी तय करने में मदद मिलती है. इस टास्क का इस्तेमाल यह पहचानने के लिए किया जा सकता है कि ट्रेनिंग के समय तय की गई कैटगरी में से कोई इमेज क्या दिखाती है. ये निर्देश आपको Android ऐप्लिकेशन के साथ इमेज क्लासिफ़ायर का इस्तेमाल करने का तरीका बताते हैं. इन निर्देशों में जिस कोड सैंपल की जानकारी दी गई है वह GitHub पर उपलब्ध है.

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

कोड का उदाहरण

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

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

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

नीचे दी गई फ़ाइलों में इस इमेज की कैटगरी तय करने के उदाहरण वाले ऐप्लिकेशन का ज़रूरी कोड शामिल है:

  • ImageClassifierHelper.kt - इमेज क्लासिफ़ायर को शुरू करता है और मॉडल और चुने गए डेलिगेट को हैंडल करता है.
  • MainActivity.kt - ऐप्लिकेशन को लागू करता है, जिसमें ImageClassificationHelper और ClassificationResultsAdapter को कॉल करना भी शामिल है.
  • ClassificationResultsAdapter.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

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

इमेज क्लासिफ़ायर के उदाहरण कोड में, मॉडल की जानकारी ImageClassifierHelper.kt फ़ाइल में दी गई है.

टास्क बनाएं

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

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

Image

ImageClassifierOptions options =
  ImageClassifierOptions.builder()
    .setBaseOptions(
      BaseOptions.builder().setModelAssetPath("model.tflite").build())
    .setRunningMode(RunningMode.IMAGE)
    .setMaxResults(5)
    .build();
imageClassifier = ImageClassifier.createFromOptions(context, options);
    

वीडियो

ImageClassifierOptions options =
  ImageClassifierOptions.builder()
    .setBaseOptions(
      BaseOptions.builder().setModelAssetPath("model.tflite").build())
    .setRunningMode(RunningMode.VIDEO)
    .setMaxResults(5)
    .build();
imageClassifier = ImageClassifier.createFromOptions(context, options);
    

लाइव स्ट्रीम

ImageClassifierOptions options =
  ImageClassifierOptions.builder()
    .setBaseOptions(
      BaseOptions.builder().setModelAssetPath("model.tflite").build())
    .setRunningMode(RunningMode.LIVE_STREAM)
    .setMaxResults(5)
    .setResultListener((result, inputImage) -> {
         // Process the classification result here.
    })
    .setErrorListener((result, inputImage) -> {
         // Process the classification errors here.
    })
    .build()
imageClassifier = ImageClassifier.createFromOptions(context, options)
    

इमेज क्लासिफ़ायर के उदाहरण कोड को लागू करने की मदद से उपयोगकर्ता, एक से दूसरे मोड में स्विच कर सकता है. इस तरीके से टास्क बनाने का कोड ज़्यादा पेचीदा बन जाता है और हो सकता है कि यह आपके इस्तेमाल के उदाहरण के लिए सही न हो. इस कोड को ImageClassifierHelper.kt फ़ाइल के setupImageClassifier() फ़ंक्शन में देखा जा सकता है.

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

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

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

इमेज: एक इमेज के इनपुट का मोड.

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

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

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

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

इनपुट इमेज या फ़्रेम को 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 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();
    

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

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

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

Image

ImageClassifierResult classifierResult = imageClassifier.classify(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.
ImageClassifierResult classifierResult =
    imageClassifier.classifyForVideo(image, frameTimestampMs);
    

लाइव स्ट्रीम


// Run inference on the frame. The classifications results will be available 
// via the `resultListener` provided in the `ImageClassifierOptions` when 
// the image classifier was created.
imageClassifier.classifyAsync(image, frameTimestampMs);
    

निम्न पर ध्यान दें:

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

इमेज क्लासिफ़ायर के उदाहरण कोड में, classify फ़ंक्शन की जानकारी ImageClassifierHelper.kt फ़ाइल में दी गई है.

नतीजों को हैंडल करना और दिखाना

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

इस टास्क के आउटपुट डेटा का एक उदाहरण नीचे दिया गया है:

ImageClassifierResult:
 Classifications #0 (single classification head):
  head index: 0
  category #0:
   category name: "/m/01bwb9"
   display name: "Passer domesticus"
   score: 0.91406
   index: 671
  category #1:
   category name: "/m/01bwbt"
   display name: "Passer montanus"
   score: 0.00391
   index: 670

यह नतीजा, इन चीज़ों पर बर्ड क्लासिफ़ायर चलाकर मिला है:

इमेज क्लासिफ़ायर के उदाहरण कोड में, ClassificationResultsAdapter.kt फ़ाइल की ClassificationResultsAdapter क्लास इन नतीजों को हैंडल करती है:

fun updateResults(imageClassifierResult: ImageClassifierResult? = null) {
    categories = MutableList(adapterSize) { null }
    if (imageClassifierResult != null) {
        val sortedCategories = imageClassifierResult.classificationResult()
            .classifications()[0].categories().sortedBy { it.index() }
        val min = kotlin.math.min(sortedCategories.size, categories.size)
        for (i in 0 until min) {
            categories[i] = sortedCategories[i]
        }
    }
}