एमएल किट की मदद से, विज़ुअल प्रॉडक्ट खोज के लिए इमेज में मौजूद ऑब्जेक्ट का पता लगाएं: Android

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

727608486a28395d.png

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

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

लर्निंग पाथवे में, Vision API Product Search की मदद से, प्रॉडक्ट के लिए खोज का बैकएंड बनाने के साथ-साथ बाकी चरणों के बारे में जानें.

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

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

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

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

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

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

यह कोडलैब, ML Kit पर फ़ोकस है. अन्य कॉन्सेप्ट और कोड ब्लॉक की पढ़ाई नहीं की जाती है. यहां आपको सिर्फ़ कॉपी करके चिपकाने की सुविधा दी जाती है.

2. सेट अप करें

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

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

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

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

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

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

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

Android Studio में शुरुआती ऐप्लिकेशन इंपोर्ट करके शुरुआत करें.

Android Studio में जाकर, 'प्रोजेक्ट इंपोर्ट करें' (Gradle, Eclipse ADT वगैरह) चुनें. इसके बाद, उस सोर्स कोड से स्टार्टर फ़ोल्डर चुनें जिसे आपने पहले डाउनलोड किया है.

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 ( एक्ज़ीक्यूट करें) पर क्लिक करें.

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

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

सबसे पहले, सबसे नीचे एक बटन ( c6d965d639c3646.png) है

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

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

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

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

1290481786af21b9.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())
   }

पूरा होने पर, डिटेक्टर आपको इसकी सूचना देता है:

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

आपने शायद देखा होगा कि कोड के प्रिंट ने debugPrint() वाले Logcat के लिए, नतीजों का पता लगाया है. इसे 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 ( एक्ज़ीक्यूट करें) पर क्लिक करके कोडलैब चलाएं. कोई प्रीसेट इमेज चुनें या फ़ोटो लें. इसके बाद, 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: Fashion good
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 में प्रिंट किया था: आसान और तेज़.

इस सेक्शन में, इमेज में दिए गए नतीजे का इस्तेमाल किया जाएगा:

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

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

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

  • class ImageClickableView यह इमेज व्यू की एक क्लास है. यह पहचान नतीजे के साथ विज़ुअलाइज़ेशन और इंटरैक्शन के लिए कुछ आसान काम की जानकारी देती है.
  • fun drawDetectionResults(results: List<DetectedObject>) इस तरीके से, हर उस ऑब्जेक्ट के बीच में सफ़ेद गोले बनाए जाते हैं जिसका पता लगाया गया है.
  • fun setOnObjectClickListener(listener: ((objectImage: Bitmap) -> Unit)) यह एक कॉलबैक है, जिसे क्रॉप की गई ऐसी इमेज मिलती है जिसमें सिर्फ़ वह ऑब्जेक्ट होता है जिस पर उपयोगकर्ता ने टैप किया है. इस काटी गई इमेज को बाद के कोडलैब में इमेज सर्च बैकएंड में भेजें, ताकि आपको विज़ुअल तौर पर मिलता-जुलता नतीजा मिल सके. फ़िलहाल, इस कोडलैब में इस तरीके का इस्तेमाल नहीं किया जा सकता.

एमएल किट की पहचान करने का नतीजा दिखाएं

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

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

runOnUiThread {
    viewBinding.ivPreview.drawDetectionResults(it)
}

इसे चलाएं

अब Android Studio के टूलबार में, Run ( एक्ज़ीक्यूट करें) पर क्लिक करें.

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

5027148750dc0748.png

7. बधाई हो!

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

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

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

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

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

अगले चरण

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

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