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 के लिए सेटअप गाइड.

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

इन फ़ाइलों में इस इमेज का ज़रूरी कोड शामिल है क्लासिफ़िकेशन का उदाहरण:

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

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

टास्क बनाएं

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

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

इमेज

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)
    

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

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

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

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

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

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

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

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

इमेज

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 क्लास ClassificationResultsAdapter.kt फ़ाइल नतीजों को हैंडल करती है:

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]
        }
    }
}