एमएल किट की मदद से, इमेज में मौजूद ऑब्जेक्ट का पता लगाएं: Android

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

ML Kit एक मोबाइल SDK टूल है. यह Android और iOS ऐप्लिकेशन के लिए, Google की मशीन लर्निंग विशेषज्ञता का इस्तेमाल करता है. आपके पास अपने ऐप्लिकेशन में सामान्य चुनौतियों को हल करने या बिलकुल नया उपयोगकर्ता अनुभव बनाने के लिए, Vision and Natural Language API का इस्तेमाल करने में आसान, लेकिन असरदार ऐप्लिकेशन का इस्तेमाल करने का विकल्प है. ये सभी सुविधाएं, Google के सबसे बेहतरीन एमएल मॉडल की मदद से बनाई गई हैं. इसके लिए, आपको कोई शुल्क नहीं देना पड़ता है.

ML Kit के एपीआई, डिवाइस पर काम करते हैं. इससे रीयल-टाइम में यह सुविधा मिलती है कि आपको लाइव कैमरा स्ट्रीम को प्रोसेस करने में मदद मिल सकती है. इसका मतलब यह भी है कि यह सुविधा ऑफ़लाइन उपलब्ध है.

इस कोडलैब से, आपको अपने मौजूदा Android ऐप्लिकेशन में किसी इमेज के लिए, ऑब्जेक्ट डिटेक्शन और ट्रैकिंग (ओडीटी) जोड़ने का आसान तरीका पता चलेगा. कृपया ध्यान दें कि ML Kit ODT के इस्तेमाल को हाइलाइट करने के लिए, यह कोडलैब कुछ शॉर्टकट इस्तेमाल करता है.

आपको क्या बनाना होगा

इस कोडलैब में, ML Kit की मदद से एक Android ऐप्लिकेशन बनाया जा रहा है. आपका ऐप्लिकेशन किसी इमेज में मौजूद ऑब्जेक्ट का पता लगाने के लिए, एमएल किट ऑब्जेक्ट डिटेक्शन और ट्रैकिंग एपीआई का इस्तेमाल करेगा.आखिर में, आपको दाईं ओर दी गई इमेज से मिलता-जुलता कुछ दिखना चाहिए.

आपको इनके बारे में जानकारी मिलेगी

  • अपने Android ऐप्लिकेशन में एमएल किट SDK टूल इंटिग्रेट करने का तरीका
  • ML किट ऑब्जेक्ट डिटेक्शन और ट्रैकिंग एपीआई

आपको इन चीज़ों की ज़रूरत होगी

  • Android Studio का नया वर्शन (v4.1.2+)
  • Android Studio एम्युलेटर या फ़िज़िकल Android डिवाइस
  • सैंपल कोड
  • Kotlin में Android डेवलपमेंट की बुनियादी जानकारी

यह कोडलैब, ML Kit पर फ़ोकस है. ऐसे कॉन्सेप्ट और कोड ब्लॉक कर दिए जाते हैं जो काम के नहीं होते. वे आपको दिए जाते हैं, ताकि आप उन्हें आसानी से कॉपी करके चिपका सकें.

2. सेट अप करें

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

इस कोडलैब के लिए सभी कोड डाउनलोड करने के लिए, नीचे दिए गए लिंक पर क्लिक करें:

डाउनलोड की गई ZIP फ़ाइल को अनपैक करें. इससे एक रूट फ़ोल्डर (mlkit-android-main) खुल जाएगा, जिसमें आपकी ज़रूरत के सभी संसाधन मौजूद होंगे. इस कोडलैब के लिए, आपको सिर्फ़ object-detection सबडायरेक्ट्री में शामिल सोर्स की ज़रूरत होगी.

mlkit-android रिपॉज़िटरी में ऑब्जेक्ट की पहचान करने वाली सबडायरेक्ट्री में दो डायरेक्ट्री होती हैं:

  • android_studio_folder.pngस्टार्टर—शुरुआती कोड जिसे आपने इस कोडलैब के लिए बनाया है.
  • android_studio_folder.pngफ़ाइनल—तैयार सैंपल ऐप्लिकेशन के लिए कोड पूरा किया गया.

3. प्रोजेक्ट में एमएल किट ऑब्जेक्ट डिटेक्शन और ट्रैकिंग एपीआई जोड़ें

Android Studio में ऐप्लिकेशन इंपोर्ट करना

चलिए, Android Studio में स्टार्टर ऐप्लिकेशन इंपोर्ट करके शुरुआत करते हैं.

Android Studio खोलें, Import Project (Gredle, Eclipse ADT वगैरह) चुनें और पहले से डाउनलोड किए गए सोर्स कोड से starter फ़ोल्डर चुनें.

7c0f27882a2698ac.png

एमएल किट ऑब्जेक्ट की पहचान करने और उसे ट्रैक करने के लिए डिपेंडेंसी जोड़ना

ML Kit डिपेंडेंसी की मदद से, अपने ऐप्लिकेशन में ML Kit ODT SDK टूल को इंटिग्रेट किया जा सकता है. अपने प्रोजेक्ट की app/build.gradle फ़ाइल के आखिर में ये लाइनें जोड़ें:

build.gradle

dependencies {
  // ...
  implementation 'com.google.mlkit:object-detection:16.2.4'
}

अपने प्रोजेक्ट को Gradle फ़ाइलों के साथ सिंक करना

यह पक्का करने के लिए कि आपके ऐप्लिकेशन पर सभी डिपेंडेंसी उपलब्ध हों, आपको इस समय अपने प्रोजेक्ट को Gradle फ़ाइलों के साथ सिंक करना चाहिए.

Android Studio के टूलबार से, Gradle फ़ाइलों के साथ प्रोजेक्ट सिंक करें ( b451ab2d04d835f9.png) चुनें.

(अगर यह बटन बंद है, तो पक्का करें कि आप सिर्फ़ starter/app/build.gradle इंपोर्ट करें, न कि पूरा रिपॉज़िटरी.

4. स्टार्टर ऐप्लिकेशन चलाएं

आपने प्रोजेक्ट को Android Studio में इंपोर्ट कर लिया है और एमएल किट ऑब्जेक्ट की पहचान करने और उसे ट्रैक करने के लिए डिपेंडेंसी जोड़ दी है. इसलिए, अब आप इस ऐप्लिकेशन को पहली बार इस्तेमाल कर सकते हैं.

अपने Android डिवाइस को, यूएसबी के ज़रिए अपने होस्ट से कनेक्ट करें या Android Studio एम्युलेटर चालू करें. इसके बाद,Android Studio के टूलबार में Run ( execute.png) पर क्लिक करें.

ऐप्लिकेशन का इस्तेमाल करना और उसके बारे में जानना

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

सबसे पहले, सबसे नीचे इन चीज़ों के लिए एक बटन ( c6d965d639c3646.png) होता है:

  • आपके डिवाइस/एम्युलेटर में इंटिग्रेट किया गया कैमरा ऐप्लिकेशन दिखाता है
  • अपने कैमरा ऐप्लिकेशन से फ़ोटो लें
  • शुरुआती ऐप्लिकेशन में कैप्चर की गई इमेज पाएं
  • इमेज दिखाओ

फ़ोटो क्लिक करें बटन का इस्तेमाल करके, फ़ोटो लेने के लिए निर्देशों का पालन करें. इसके बाद, फ़ोटो को स्वीकार करें और उसे शुरुआती ऐप्लिकेशन में देखें.

यह देखने के लिए कि यह कैसे काम करता है, कुछ बार दोहराएं:

9ec541980dbe2d31.png 8312dde41425ba4b.png fa8492bfc1914ff0.png

दूसरी, 3 प्रीसेट इमेज में से किसी को भी चुना जा सकता है. अगर आप किसी Android एम्युलेटर पर चल रहे हैं, तो आप इन इमेज का इस्तेमाल बाद में ऑब्जेक्ट डिटेक्शन कोड की जांच करने के लिए कर सकते हैं.

तीन प्रीसेट इमेज में से कोई इमेज चुनें. देखें कि इमेज बड़े व्यू में दिखती है या नहीं:

1dd41b3ec978f1d9.png

5. डिवाइस पर मौजूद ऑब्जेक्ट की पहचान करने की सुविधा जोड़ें

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

अगर आपने पहले से तय की गई इमेज से या कैमरा ऐप्लिकेशन की मदद से फ़ोटो ली है, तो बॉयलरप्लेट कोड उस इमेज को Bitmap इंस्टेंस में डीकोड करता है. साथ ही, उसे स्क्रीन पर दिखाता है और इमेज के साथ runObjectDetection तरीके का इस्तेमाल करता है.

इस चरण में, ऑब्जेक्ट की पहचान करने के लिए, आपको runObjectDetection तरीके में कोड जोड़ना होगा!

डिवाइस पर मौजूद ऑब्जेक्ट को पहचानने की सुविधा को किसी इमेज पर सेट अप करना और चलाना

ML Kit ODT को सेट अप करने के लिए, तीन एपीआई की मदद से सिर्फ़ तीन आसान चरण हैं:

  • इमेज तैयार करें: InputImage
  • कोई डिटेक्टर ऑब्जेक्ट बनाएं: ObjectDetection.getClient(options)
  • ऊपर दिए गए दो ऑब्जेक्ट को कनेक्ट करें: process(image)

इन्हें MainActivity.kt फ़ाइल में, runObjectDetection(bitmap: Bitmap) फ़ंक्शन में हासिल किया जा सकता है.

/**
 * ML Kit Object Detection Function
 */
private fun runObjectDetection(bitmap: Bitmap) {
}

फ़िलहाल, फ़ंक्शन खाली है. एमएल किट ओडीटी को लागू करने के लिए, यह तरीका अपनाएं! साथ ही, Android Studio आपको ज़रूरी इंपोर्ट जोड़ने के लिए कहेगा:

  • com.google.mlkit.vision.common.InputImage
  • com.google.mlkit.vision.objects.ObjectDetection
  • com.google.mlkit.vision.objects.defaults.ObjectDetectorOptions

पहला चरण: इनपुट इमेज बनाएं

एमएल किट, Bitmap से InputImage बनाने के लिए एक आसान एपीआई उपलब्ध कराता है. इसके बाद, InputImage को ML Kit API में फ़ीड किया जा सकता है.

// Step 1: create ML Kit's InputImage object
val image = InputImage.fromBitmap(bitmap, 0)

ऊपर दिए गए कोड को runObjectDetection(bitmap:Bitmap) के ऊपरी हिस्से में जोड़ें.

दूसरा चरण: डिटेक्टर इंस्टेंस बनाना

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

  • डिटेक्टर मोड (सिंगल इमेज या स्ट्रीम)
  • पहचान मोड (एक या कई ऑब्जेक्ट की पहचान)
  • क्लासिफ़िकेशन मोड (चालू या बंद)

यह कोडलैब एक इमेज के लिए है - एक से ज़्यादा ऑब्जेक्ट की पहचान और वर्गीकरण. इसे अभी जोड़ें:

// Step 2: acquire detector object
val options = ObjectDetectorOptions.Builder()
   .setDetectorMode(ObjectDetectorOptions.SINGLE_IMAGE_MODE)
   .enableMultipleObjects()
   .enableClassification()
   .build()
val objectDetector = ObjectDetection.getClient(options)

तीसरा चरण: इमेज को डिटेक्टर में फ़ीड करें

ऑब्जेक्ट की पहचान और उन्हें अलग-अलग ग्रुप में बांटने की प्रोसेस, एक साथ प्रोसेस नहीं की जाती:

  • आपने process() का इस्तेमाल करके, डिटेक्टर को इमेज भेजी.
  • डिटेक्टर इस पर काफ़ी मेहनत करता है.
  • डिटेक्टर, आपको कॉलबैक के ज़रिए नतीजे की जानकारी देता है.

नीचे दिया गया कोड वही काम करता है (कॉपी करके उसे fun runObjectDetection(bitmap:Bitmap)): में मौजूदा कोड में जोड़ें

// Step 3: feed given image to detector and setup callback
objectDetector.process(image)
   .addOnSuccessListener {
       // Task completed successfully
        debugPrint(it)
   }
   .addOnFailureListener {
       // Task failed with an exception
       Log.e(TAG, it.message.toString())
   }

पूरा होने पर, पहचान करने वाला आपको यह सूचना देता है:

  • पता लगाए गए ऑब्जेक्ट की कुल संख्या. पता लगाए गए हर ऑब्जेक्ट के बारे में यह जानकारी दी गई है:
  • trackingId: एक पूर्णांक जिसका इस्तेमाल, क्रॉस फ़्रेम को ट्रैक करने के लिए किया जाता है. इस कोडलैब में इसका इस्तेमाल नहीं किया जाता.
  • boundingBox: ऑब्जेक्ट का बाउंडिंग बॉक्स.
  • कैटगरी तय करने की सुविधा चालू होने पर ही, पता लगाए गए ऑब्जेक्ट के लिए, लेबल की सूची labels::
  • index (इस लेबल के लिए इंडेक्स पाएं)
  • text ("फ़ैशन का सामान", "खाना", "घर के सामान", "जगह", "पौधे" समेत इस लेबल का टेक्स्ट पाएं)
  • confidence ( 1.0 के साथ 0.0 से 1.0 के बीच के फ़्लोट का मतलब है 100%)

आपने शायद देखा होगा कि debugPrint() के साथ कोड, पता लगाए गए नतीजे के लिए Printf तरह की प्रोसेसिंग करता है.

इसे MainActivity क्लास में जोड़ें:

private fun debugPrint(detectedObjects: List<DetectedObject>) {
   detectedObjects.forEachIndexed { index, detectedObject ->
       val box = detectedObject.boundingBox

       Log.d(TAG, "Detected object: $index")
       Log.d(TAG, " trackingId: ${detectedObject.trackingId}")
       Log.d(TAG, " boundingBox: (${box.left}, ${box.top}) - (${box.right},${box.bottom})")
       detectedObject.labels.forEach {
           Log.d(TAG, " categories: ${it.text}")
           Log.d(TAG, " confidence: ${it.confidence}")
       }
   }
}

अब आप पहचाने जाने के लिए इमेज स्वीकार करने के लिए तैयार हैं!

Android Studio के टूलबार में Run ( execute.png) पर क्लिक करके, कोडलैब चलाएं. कोई प्रीसेट इमेज चुनें या फ़ोटो लें. इसके बाद, IDE में logcat विंडो( 16bd6ea224cf8cf1.png) देखें.

आपको इससे मिलता-जुलता कुछ दिखेगा:

D/MLKit Object Detection: Detected object: 0
D/MLKit Object Detection:  trackingId: null
D/MLKit Object Detection:  boundingBox: (481, 2021) - (2426,3376)
D/MLKit Object Detection:  categories: Food
D/MLKit Object Detection:  confidence: 0.90234375
D/MLKit Object Detection: Detected object: 1
D/MLKit Object Detection:  trackingId: null
D/MLKit Object Detection:  boundingBox: (2639, 2633) - (3058,3577)
D/MLKit Object Detection: Detected object: 2
D/MLKit Object Detection:  trackingId: null
D/MLKit Object Detection:  boundingBox: (3, 1816) - (615,2597)
D/MLKit Object Detection:  categories: Home good
D/MLKit Object Detection:  confidence: 0.75390625

...इसका मतलब है कि डिटेक्टर ने तीन ऑब्जेक्ट देखे:

  • कैटगरी हैं खाना और घर के लिए अच्छा.
  • दूसरी कैटगरी के लिए कोई कैटगरी नहीं मिली, क्योंकि उसकी क्लास की जानकारी नहीं है.
  • नहीं trackingId (क्योंकि यह एक इमेज की पहचान करने वाला मोड है).
  • boundingBox रेक्टैंगल के अंदर की पोज़िशन (उदाहरण के लिए, (481, 2021) – (2426, 3376))
  • डिटेक्टर को पूरा भरोसा है कि पहला फ़ूड है (90% भरोसा है—यह सलाद था).

एमएल किट ऑब्जेक्ट पहचानने की सुविधा का इस्तेमाल करने के लिए, तकनीकी तौर पर इतना ही काफ़ी है: फ़िलहाल, आपको सारी ज़रूरी जानकारी मिल गई है! बधाई हो!

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

6. जांच के नतीजे प्रोसेस होने के बाद

पिछले चरणों में, पहचाने गए नतीजे को logcat में प्रिंट किया जा सकता है: आसान और तेज़.

इस सेक्शन में, इस नतीजे को इमेज में इस्तेमाल करने के बारे में बताया गया है:

  • इमेज पर बाउंडिंग बॉक्स बनाएं
  • बाउंडिंग बॉक्स के अंदर श्रेणी नाम और विश्वास बनाएं

विज़ुअलाइज़ेशन की उपयोगिता के बारे में समझना

कोडलैब में कुछ बॉयलरप्लेट कोड होते हैं, जिनकी मदद से आपको जांच के नतीजे को विज़ुअलाइज़ करने में मदद मिलती है. हमारे विज़ुअलाइज़ेशन कोड को आसान बनाने के लिए, इन सुविधाओं का फ़ायदा उठाएं:

  • data class BoxWithText(val box: Rect, val text: String) यह डेटा क्लास है. इसमें विज़ुअलाइज़ेशन के लिए, ऑब्जेक्ट की पहचान करने वाले नतीजे को सेव किया जाता है. box बाउंडिंग बॉक्स है, जहां ऑब्जेक्ट पता लगाता है. साथ ही, text, ऑब्जेक्ट के बाउंडिंग बॉक्स के साथ दिखाने के लिए, खोज के नतीजे में मिलने वाली स्ट्रिंग है.
  • fun drawDetectionResult(bitmap: Bitmap, detectionResults: List<BoxWithText>): Bitmap यह तरीका, इनपुट bitmap पर ऑब्जेक्ट की पहचान करने वाले नतीजे को detectionResults में दिखाता है और इसकी बदली गई कॉपी दिखाता है.

यहां drawDetectionResult उपयोगिता तरीके के आउटपुट का एक उदाहरण दिया गया है:

58c6f1d4ddb00dfa.png

एमएल किट की पहचान करने के नतीजे को विज़ुअलाइज़ करना

इनपुट इमेज के ऊपर, एमएल किट ऑब्जेक्ट की पहचान करने के नतीजे को ड्रॉ करने के लिए, विज़ुअलाइज़ेशन यूटिलिटी का इस्तेमाल करें.

वहां जाएं, जहां debugPrint() को कॉल किया जाता है और उसके नीचे यह कोड स्निपेट जोड़ें:

// Parse ML Kit's DetectedObject and create corresponding visualization data
val detectedObjects = it.map { obj ->
    var text = "Unknown"

    // We will show the top confident detection result if it exist
    if (obj.labels.isNotEmpty()) {
        val firstLabel = obj.labels.first()
        text = "${firstLabel.text}, ${firstLabel.confidence.times(100).toInt()}%"
    }
    BoxWithText(obj.boundingBox, text)
}

// Draw the detection result on the input bitmap
val visualizedResult = drawDetectionResult(bitmap, detectedObjects)

// Show the detection result on the app screen
runOnUiThread {
    inputImageView.setImageBitmap(visualizedResult)
}
  • विज़ुअलाइज़ेशन का नतीजा दिखाने के लिए, सबसे पहले एमएल किट के DetectedObject को पार्स करें और BoxWithText ऑब्जेक्ट की सूची बनाएं.
  • इसके बाद, drawDetectionResult यूटिलिटी तरीके का इस्तेमाल करके इनपुट इमेज के ऊपर, पहचान का नतीजा बनाएं और उसे स्क्रीन पर दिखाएं.

इसे चलाएं

अब Android Studio के टूलबार में, Run ( execute.png) पर क्लिक करें.

ऐप्लिकेशन लोड होने के बाद, कैमरा आइकॉन वाला बटन दबाएं, अपने कैमरे को किसी चीज़ पर फ़ोकस करें, फ़ोटो लें, फ़ोटो लें (कैमरा ऐप्लिकेशन में) या किसी भी प्रीसेट इमेज पर आसानी से टैप करें. आपको जांच के नतीजे दिखेंगे; नए एमएल किट ओडीटी का अनुभव पाने के लिए, बटन को फिर से दबाएं या कोई दूसरी इमेज चुनें!

a03109cb30d5014d.png

7. बधाई हो!

आपने अपने ऐप्लिकेशन में ऑब्जेक्ट पहचानने की सुविधाएं जोड़ने के लिए, एमएल किट का इस्तेमाल किया है:

  • तीन एपीआई वाले तीन चरण
  • इनपुट इमेज बनाएं
  • डिटेक्टर बनाएं
  • डिटेक्टर को इमेज भेजें

इसे चालू करने के लिए आपको बस इतना ही करना है!

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

इसमें हमने इन विषयों के बारे में बताया

  • अपने Android ऐप्लिकेशन में एमएल किट ऑब्जेक्ट डिटेक्शन और ट्रैकिंग जोड़ने का तरीका
  • इमेज में मौजूद ऑब्जेक्ट का पता लगाने के लिए, एमएल किट में ऑन-डिवाइस ऑब्जेक्ट की पहचान करने और उसे ट्रैक करने की सुविधा कैसे इस्तेमाल करें

अगले चरण

  • एमएल किट ओडीटी की मदद से, ज़्यादा इमेज और लाइव वीडियो देखें. इससे, गेम की क्वालिटी का पता लगाने और डेटा की कैटगरी तय करने की सटीक जानकारी और परफ़ॉर्मेंस
  • कस्टम मॉडल को ट्रेनिंग देने का तरीका जानने के लिए, डिवाइस पर मौजूद मशीन लर्निंग - ऑब्जेक्ट डिटेक्शन का लर्निंग पाथवे देखें
  • अपने Android ऐप्लिकेशन में ML Kit ODT लागू करें

ज़्यादा जानें