Android पर AutoML से ट्रेनिंग पाने वाले मॉडल की मदद से, इमेज में मौजूद ऑब्जेक्ट पहचानें

AutoML Vision Edge इस्तेमाल करके, अपने मॉडल को ट्रेनिंग देने के बाद, तो अपने ऐप्लिकेशन में इसका इस्तेमाल करके इमेज में मौजूद ऑब्जेक्ट का पता लगाया जा सकता है.

AutoML Vision Edge से ट्रेन किए गए मॉडल को इंटिग्रेट करने के दो तरीके हैं: मॉडल को अपने ऐप्लिकेशन के ऐसेट फ़ोल्डर में रखकर बंडल करें या इसे Firebase से डाइनैमिक तरीके से डाउनलोड करें.

मॉडल बंडलिंग के विकल्प
आपके ऐप्लिकेशन में शामिल
  • मॉडल आपके ऐप्लिकेशन के APK का हिस्सा है
  • Android डिवाइस के ऑफ़लाइन होने पर भी, मॉडल तुरंत उपलब्ध हो जाता है
  • Firebase प्रोजेक्ट की ज़रूरत नहीं होती है
Firebase के साथ होस्ट किया गया
  • मॉडल को होस्ट करने के लिए, इसे Firebase मशीन लर्निंग
  • APK का साइज़ कम करता है
  • मॉडल को मांग पर डाउनलोड किया जाता है
  • अपने ऐप्लिकेशन को फिर से पब्लिश किए बिना, मॉडल के अपडेट पुश करें
  • Firebase रिमोट कॉन्फ़िगरेशन की मदद से आसान A/B टेस्टिंग
  • Firebase प्रोजेक्ट होना ज़रूरी है

शुरू करने से पहले

  1. अगर आपको कोई मॉडल डाउनलोड करना है, तो पक्का करें कि अपने Android प्रोजेक्ट में Firebase जोड़ना, अगर आपने पहले से ऐसा नहीं किया है. मॉडल को बंडल करते समय, इसकी ज़रूरत नहीं होती.

  2. अपने मॉड्यूल में, TensorFlow Lite टास्क लाइब्रेरी के लिए डिपेंडेंसी जोड़ें ऐप्लिकेशन-लेवल की Gradle फ़ाइल, जो आम तौर पर app/build.gradle होती है:

    अपने ऐप्लिकेशन के साथ किसी मॉडल को बंडल करने के लिए:

    dependencies {
      // ...
      // Object detection with a bundled Auto ML model
      implementation 'org.tensorflow:tensorflow-lite-task-vision:0.0.0-nightly-SNAPSHOT'
    }
    

    Firebase से मॉडल को डाइनैमिक तरीके से डाउनलोड करने के लिए, Firebase एमएल भी जोड़ें निर्भरता:

    dependencies {
      // ...
      // Object detection with an Auto ML model deployed to Firebase
      implementation platform('com.google.firebase:firebase-bom:26.1.1')
      implementation 'com.google.firebase:firebase-ml-model-interpreter'
    
      implementation 'org.tensorflow:tensorflow-lite-task-vision:0.0.0-nightly'
    }
    

1. मॉडल लोड करें

लोकल मॉडल सोर्स कॉन्फ़िगर करना

मॉडल को अपने ऐप्लिकेशन के साथ बंडल करने के लिए:

  1. ज़िप संग्रह से उस मॉडल को निकालें जिसे आपने Google Cloud Console.
  2. अपने ऐप्लिकेशन पैकेज में अपना मॉडल शामिल करें:
    1. अगर आपके प्रोजेक्ट में कोई ऐसेट फ़ोल्डर नहीं है, तो एक ऐसेट फ़ोल्डर बनाएं app/ फ़ोल्डर पर राइट-क्लिक करें, फिर नया > फ़ोल्डर > ऐसेट फ़ोल्डर.
    2. ऐसेट में, एम्बेड किए गए मेटाडेटा के साथ अपनी tflite मॉडल फ़ाइल को कॉपी करें फ़ोल्डर खोलें.
  3. यह पक्का करने के लिए कि अपने ऐप्लिकेशन की build.gradle फ़ाइल में यह जोड़ें ऐप्लिकेशन बनाते समय, Gradle, मॉडल फ़ाइल को कंप्रेस नहीं करता:

    android {
        // ...
        aaptOptions {
            noCompress "tflite"
        }
    }
    

    मॉडल फ़ाइल, ऐप्लिकेशन पैकेज में शामिल की जाएगी और रॉ ऐसेट के तौर पर काम करता है.

Firebase से होस्ट किए गए मॉडल सोर्स को कॉन्फ़िगर करना

रिमोट तरीके से होस्ट किए गए मॉडल का इस्तेमाल करने के लिए, RemoteModel ऑब्जेक्ट बनाएं, वह नाम दर्ज करना होगा जिसे आपने मॉडल को प्रकाशित करते समय असाइन किया था:

Java

// Specify the name you assigned when you deployed the model.
FirebaseCustomRemoteModel remoteModel =
        new FirebaseCustomRemoteModel.Builder("your_model").build();

Kotlin

// Specify the name you assigned when you deployed the model.
val remoteModel =
    FirebaseCustomRemoteModel.Builder("your_model_name").build()

इसके बाद, उन शर्तों को तय करते हुए मॉडल डाउनलोड टास्क शुरू करें को डाउनलोड करने की अनुमति देनी है. अगर मॉडल डिवाइस पर नहीं है या नया डिवाइस है, तो मॉडल का वर्शन उपलब्ध है, तो टास्क एसिंक्रोनस रूप से Firebase से मिला मॉडल:

Java

DownloadConditions downloadConditions = new DownloadConditions.Builder()
        .requireWifi()
        .build();
RemoteModelManager.getInstance().download(remoteModel, downloadConditions)
        .addOnSuccessListener(new OnSuccessListener<Void>() {
            @Override
            public void onSuccess(@NonNull Task<Void> task) {
                // Success.
            }
        });

Kotlin

val downloadConditions = DownloadConditions.Builder()
    .requireWifi()
    .build()
RemoteModelManager.getInstance().download(remoteModel, downloadConditions)
    .addOnSuccessListener {
        // Success.
    }

कई ऐप्लिकेशन अपने इनिशलाइज़ेशन कोड में डाउनलोड का काम शुरू करते हैं, लेकिन आपके द्वारा मॉडल का उपयोग करने की आवश्यकता से पहले किसी भी समय ऐसा कर सकते है.

अपने मॉडल से ऑब्जेक्ट डिटेक्टर बनाएं

अपने मॉडल सोर्स को कॉन्फ़िगर करने के बाद, किसी एक से ObjectDetector ऑब्जेक्ट बनाएं विकल्प मिलते हैं.

अगर आपके पास सिर्फ़ लोकल बंडल वाला मॉडल है, तो अपने मॉडल फ़ाइल और कॉन्फ़िडेंस स्कोर को कॉन्फ़िगर करें थ्रेशोल्ड को पूरा करें जिसे आपको लागू करना हो (अपने मॉडल का आकलन करना देखें):

Java

// Initialization
ObjectDetectorOptions options = ObjectDetectorOptions.builder()
    .setScoreThreshold(0)  // Evaluate your model in the Google Cloud console
                           // to determine an appropriate value.
    .build();
ObjectDetector objectDetector = ObjectDetector.createFromFileAndOptions(context, modelFile, options);

Kotlin

// Initialization
val options = ObjectDetectorOptions.builder()
    .setScoreThreshold(0)  // Evaluate your model in the Google Cloud console
                           // to determine an appropriate value.
    .build()
val objectDetector = ObjectDetector.createFromFileAndOptions(context, modelFile, options)

अगर आपके पास रिमोट तौर पर होस्ट किया गया मॉडल है, तो आपको यह देखना होगा कि डाउनलोड करने की सुविधा देता है. मॉडल के डाउनलोड होने की स्थिति देखी जा सकती है टास्क बनाने के लिए, मॉडल मैनेजर के isModelDownloaded() तरीके का इस्तेमाल करें.

हालांकि, आपको ऑब्जेक्ट डिटेक्टर को चलाने से पहले ही इसकी पुष्टि करनी होगी, अगर रिमोट तौर पर होस्ट किया गया मॉडल और लोकल बंडल्ड मॉडल, दोनों होने चाहिए, तो इससे ऑब्जेक्ट डिटेक्टर को इंस्टैंशिएट करते समय इस जांच को करने का ध्यान रखें: एक रिमोट मॉडल से ऑब्जेक्ट डिटेक्टर और अगर उसे डाउनलोड किया गया है, तो नहीं करते हैं.

Java

FirebaseModelManager.getInstance().isModelDownloaded(remoteModel)
        .addOnSuccessListener(new OnSuccessListener<Boolean>() {
            @Override
            public void onSuccess(Boolean isDownloaded) {
            }
        });

Kotlin

FirebaseModelManager.getInstance().isModelDownloaded(remoteModel)
        .addOnSuccessListener { success ->

        }

अगर आपके पास सिर्फ़ रिमोट तौर पर होस्ट किया गया मॉडल है, तो आपको मॉडल से जुड़ी सेटिंग बंद करनी चाहिए सुविधा—उदाहरण के लिए, आपके यूज़र इंटरफ़ेस (यूआई) के किसी हिस्से को धूसर करना या छिपाना—जब तक तो यह पुष्टि की जाती है कि मॉडल डाउनलोड किया गया है. लिसनर को अटैच करके ऐसा किया जा सकता है को मॉडल मैनेजर की download() मेथड से चुनें.

मॉडल डाउनलोड हो जाने के बाद, इमेज की मदद से ऑब्जेक्ट डिटेक्टर बनाएं मॉडल फ़ाइल:

Java

FirebaseModelManager.getInstance().getLatestModelFile(remoteModel)
        .addOnCompleteListener(new OnCompleteListener<File>() {
            @Override
            public void onComplete(@NonNull Task<File> task) {
                File modelFile = task.getResult();
                if (modelFile != null) {
                    ObjectDetectorOptions options = ObjectDetectorOptions.builder()
                            .setScoreThreshold(0)
                            .build();
                    objectDetector = ObjectDetector.createFromFileAndOptions(
                            getApplicationContext(), modelFile.getPath(), options);
                }
            }
        });

Kotlin

FirebaseModelManager.getInstance().getLatestModelFile(remoteModel)
        .addOnSuccessListener { modelFile ->
            val options = ObjectDetectorOptions.builder()
                    .setScoreThreshold(0f)
                    .build()
            objectDetector = ObjectDetector.createFromFileAndOptions(
                    applicationContext, modelFile.path, options)
        }

2. इनपुट इमेज तैयार करें

इसके बाद, हर उस इमेज के लिए जिसे आप लेबल करना चाहते हैं, अपनेTensorImage इमेज. Bitmap से TensorImage ऑब्जेक्ट बनाया जा सकता है. इसके लिए, fromBitmap तरीका:

Java

TensorImage image = TensorImage.fromBitmap(bitmap);

Kotlin

val image = TensorImage.fromBitmap(bitmap)

अगर आपका इमेज डेटा Bitmap में नहीं है, तो पिक्सल कलेक्शन को लोड किया जा सकता है, जैसा कि यहां दिखाया गया है TensorFlow Lite के दस्तावेज़ देखने के लिए.

3. ऑब्जेक्ट डिटेक्टर चलाएं

किसी इमेज में ऑब्जेक्ट का पता लगाने के लिए, TensorImage ऑब्जेक्ट को ObjectDetector का detect() तरीका.

Java

List<Detection> results = objectDetector.detect(image);

Kotlin

val results = objectDetector.detect(image)

4. लेबल किए गए ऑब्जेक्ट के बारे में जानकारी पाना

अगर ऑब्जेक्ट की पहचान करने की कार्रवाई पूरी हो जाती है, तो यह Detection की सूची दिखाता है ऑब्जेक्ट हैं. हर Detection ऑब्जेक्ट ऐसी चीज़ दिखाता है जिसका पता इमेज. आपको हर ऑब्जेक्ट का बाउंडिंग बॉक्स और उसके लेबल मिल सकते हैं.

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

Java

for (Detection result : results) {
    RectF bounds = result.getBoundingBox();
    List<Category> labels = result.getCategories();
}

Kotlin

for (result in results) {
    val bounds = result.getBoundingBox()
    val labels = result.getCategories()
}

रीयल-टाइम परफ़ॉर्मेंस को बेहतर बनाने के लिए सलाह

अगर आपको रीयल-टाइम ऐप्लिकेशन में इमेज को लेबल करना है, तो इन निर्देशों का पालन करें सबसे सही फ़्रेमरेट हासिल करने के लिए दिशा-निर्देश:

  • इमेज लेबलर को कॉल थ्रॉटल करें. अगर कोई नया वीडियो फ़्रेम उपलब्ध होने पर, फ़्रेम छोड़ें. उदाहरण के लिए, क्विकस्टार्ट सैंपल ऐप्लिकेशन में VisionProcessorBase क्लास.
  • अगर ग्राफ़िक ओवरले करने के लिए, इमेज लेबलर के आउटपुट का इस्तेमाल किया जा रहा है इनपुट इमेज को चुनने के बाद, सबसे पहले नतीजा पाएं. इसके बाद, इमेज को रेंडर करें और ओवरले को एक ही चरण में पूरा करें. ऐसा करके, डिसप्ले सरफ़ेस पर रेंडर हो जाता है हर इनपुट फ़्रेम के लिए सिर्फ़ एक बार. CameraSourcePreview और क्विकस्टार्ट सैंपल ऐप्लिकेशन में GraphicOverlay क्लास उदाहरण के लिए.
  • Camera2 API का इस्तेमाल करने पर, इमेज यहां कैप्चर करें ImageFormat.YUV_420_888 फ़ॉर्मैट.

    अगर पुराने Camera API का इस्तेमाल किया जा रहा है, तो इमेज यहां कैप्चर करें ImageFormat.NV21 फ़ॉर्मैट.