1. शुरू करने से पहले
ML Kit एक मोबाइल SDK टूल है. यह Android और iOS ऐप्लिकेशन में, डिवाइस पर मशीन लर्निंग की Google की विशेषज्ञता को जोड़ता है. अपने ऐप्लिकेशन में आम तौर पर आने वाली समस्याओं को हल करने या उपयोगकर्ताओं के लिए नए अनुभव बनाने के लिए, विज़न और नेचुरल लैंग्वेज एपीआई का इस्तेमाल किया जा सकता है. ये एपीआई, आसानी से इस्तेमाल किए जा सकते हैं और इनमें बेहतरीन सुविधाएं मौजूद हैं. ये सभी सुविधाएं, Google के सबसे बेहतरीन एमएल मॉडल की मदद से काम करती हैं. साथ ही, ये आपको बिना किसी शुल्क के उपलब्ध कराई जाती हैं.
ML Kit के सभी एपीआई, डिवाइस पर काम करते हैं. इससे, रीयल-टाइम में इस्तेमाल के उदाहरणों को पूरा किया जा सकता है. उदाहरण के लिए, लाइव कैमरा स्ट्रीम को प्रोसेस करना. इसका मतलब यह भी है कि यह सुविधा ऑफ़लाइन भी उपलब्ध है.
इस कोडलैब में, अपने मौजूदा Android ऐप्लिकेशन में किसी इमेज के लिए ऑब्जेक्ट डिटेक्शन और ट्रैकिंग (ODT) की सुविधा को जोड़ने का आसान तरीका बताया गया है. कृपया ध्यान दें कि इस कोडलैब में, ML Kit ODT के इस्तेमाल को हाइलाइट करने के लिए कुछ शॉर्टकट इस्तेमाल किए गए हैं.
आपको क्या बनाना है
इस कोडलैब में, आपको ML Kit की मदद से Android ऐप्लिकेशन बनाना है. आपका ऐप्लिकेशन, किसी इमेज में ऑब्जेक्ट का पता लगाने के लिए, ML Kit के ऑब्जेक्ट का पता लगाने और ट्रैक करने वाले एपीआई का इस्तेमाल करेगा.आखिर में, आपको दाईं ओर दी गई इमेज जैसी कोई इमेज दिखेगी. |
आपको इनके बारे में जानकारी मिलेगी
- अपने Android ऐप्लिकेशन में ML Kit SDK टूल को इंटिग्रेट करने का तरीका
- ML Kit का ऑब्जेक्ट का पता लगाने और ट्रैक करने वाला एपीआई
आपको इन चीज़ों की ज़रूरत होगी
- Android Studio का नया वर्शन (v4.1.2+)
- Android Studio एमुलेटर या कोई Android डिवाइस
- सैंपल कोड
- Kotlin में Android डेवलपमेंट की बुनियादी जानकारी
इस कोडलैब में, ML Kit पर फ़ोकस किया गया है. काम के नहीं लगने वाले कॉन्सेप्ट और कोड ब्लॉक को हटा दिया जाता है. साथ ही, उन्हें कॉपी करके चिपकाया जा सकता है.
2. सेट अप करें
कोड डाउनलोड करना
इस कोडलैब का पूरा कोड डाउनलोड करने के लिए, इस लिंक पर क्लिक करें:
डाउनलोड की गई ज़िप फ़ाइल को अनपैक करें. इससे, रूट फ़ोल्डर (mlkit-android-main
) अनपैक हो जाएगा. इसमें आपको ज़रूरी सभी संसाधन मिलेंगे. इस कोडलैब के लिए, आपको सिर्फ़ object-detection
सबडायरेक्ट्री में मौजूद सोर्स की ज़रूरत होगी.
mlkit-android डेटा स्टोर करने की जगह में, ऑब्जेक्ट-डिटेक्शन सब-डायरेक्ट्री में दो डायरेक्ट्री होती हैं:
- starter—इस कोडलैब के लिए इस्तेमाल किया जाने वाला स्टार्टर कोड.
- final—पूरे किए गए सैंपल ऐप्लिकेशन के लिए पूरा कोड.
3. प्रोजेक्ट में ML Kit के ऑब्जेक्ट की पहचान करने और ट्रैकिंग एपीआई को जोड़ना
ऐप्लिकेशन को Android Studio में इंपोर्ट करना
चलिए, Android Studio में स्टार्टर ऐप्लिकेशन इंपोर्ट करके शुरू करते हैं.
Android Studio खोलें और प्रोजेक्ट इंपोर्ट करें (Gradle, Eclipse ADT वगैरह) को चुनें. इसके बाद, पहले डाउनलोड किए गए सोर्स कोड से starter
फ़ोल्डर चुनें.
ML Kit के ऑब्जेक्ट का पता लगाने और ट्रैकिंग की सुविधा के लिए डिपेंडेंसी जोड़ना
ML Kit की डिपेंडेंसी की मदद से, अपने ऐप्लिकेशन में ML Kit ODT SDK टूल को इंटिग्रेट किया जा सकता है. अपने प्रोजेक्ट की app/build.gradle
फ़ाइल के आखिर में ये लाइनें जोड़ें:
build.gradle
dependencies {
// ...
implementation 'com.google.mlkit:object-detection:16.2.4'
}
अपने प्रोजेक्ट को Gradle फ़ाइलों के साथ सिंक करना
यह पक्का करने के लिए कि आपके ऐप्लिकेशन के लिए सभी डिपेंडेंसी उपलब्ध हों, आपको इस समय अपने प्रोजेक्ट को ग्रेडल फ़ाइलों के साथ सिंक करना चाहिए.
Android Studio टूलबार से, Gradle फ़ाइलों के साथ प्रोजेक्ट सिंक करें ( ) को चुनें.
(अगर यह बटन बंद है, तो पक्का करें कि आपने सिर्फ़ starter/app/build.gradle
को इंपोर्ट किया हो, न कि पूरा रिपॉज़िटरी.)
4. स्टार्टर ऐप्लिकेशन चलाना
प्रोजेक्ट को Android Studio में इंपोर्ट करने और ML Kit के ऑब्जेक्ट का पता लगाने और ट्रैकिंग के लिए डिपेंडेंसी जोड़ने के बाद, ऐप्लिकेशन को पहली बार चलाया जा सकता है.
अपने Android डिवाइस को यूएसबी के ज़रिए होस्ट से कनेक्ट करें या Android Studio एमुलेटर शुरू करें. इसके बाद, Android Studio टूलबार में चालू करें ( ) पर क्लिक करें.
ऐप्लिकेशन चलाना और उसके बारे में ज़्यादा जानना
इसके बाद, ऐप्लिकेशन आपके Android डिवाइस पर लॉन्च हो जाएगा. इसमें कुछ बोइलरप्लेट कोड हैं, जिनकी मदद से फ़ोटो कैप्चर की जा सकती है या कोई प्रीसेट इमेज चुनी जा सकती है. साथ ही, इसे ऑब्जेक्ट की पहचान करने और ट्रैक करने वाली उस पाइपलाइन में फ़ीड किया जा सकता है जिसे इस कोडलैब में बनाया जाएगा. कोड लिखने से पहले, आइए ऐप्लिकेशन के बारे में थोड़ा जानें.
सबसे पहले, सबसे नीचे एक बटन ( ) है. इस पर क्लिक करके:
- अपने डिवाइस/एम्युलेटर में इंटिग्रेट किया गया कैमरा ऐप्लिकेशन खोलें
- कैमरा ऐप्लिकेशन में जाकर फ़ोटो लें
- स्टार्टर ऐप्लिकेशन में कैप्चर की गई इमेज पाना
- इमेज दिखाएं
फ़ोटो लें बटन को आज़माएं. फ़ोटो लेने के लिए, निर्देशों का पालन करें. फ़ोटो स्वीकार करें और देखें कि वह स्टार्टर ऐप्लिकेशन में दिख रही है या नहीं.
यह सुविधा कैसे काम करती है, यह जानने के लिए कुछ बार दोहराएं:
दूसरा, आपके पास तीन प्रीसेट इमेज में से किसी एक को चुनने का विकल्प है. अगर Android एमुलेटर पर काम किया जा रहा है, तो ऑब्जेक्ट का पता लगाने वाले कोड की जांच करने के लिए, इन इमेज का इस्तेमाल बाद में किया जा सकता है.
तीन प्रीसेट इमेज में से कोई एक चुनें. देखें कि इमेज बड़े व्यू में दिख रही है या नहीं:
5. डिवाइस पर ऑब्जेक्ट की पहचान करने की सुविधा जोड़ना
इस चरण में, आपको स्टार्टर ऐप्लिकेशन में इमेज में ऑब्जेक्ट का पता लगाने की सुविधा जोड़नी होगी. जैसा कि आपने पिछले चरण में देखा था, स्टार्टर ऐप्लिकेशन में डिवाइस पर कैमरा ऐप्लिकेशन से फ़ोटो लेने के लिए, बूलिप్లेट कोड शामिल होता है. ऐप्लिकेशन में तीन प्रीसेट इमेज भी हैं. अगर 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) {
}
फ़िलहाल, फ़ंक्शन खाली है. ML Kit ODT लागू करने के लिए, यहां दिया गया तरीका अपनाएं! इस दौरान, Android Studio आपको ज़रूरी इंपोर्ट जोड़ने के लिए कहेगा:
com.google.mlkit.vision.common.InputImage
com.google.mlkit.vision.objects.ObjectDetection
com.google.mlkit.vision.objects.defaults.ObjectDetectorOptions
पहला चरण: InputImage बनाना
ML Kit, Bitmap
से InputImage
बनाने के लिए एक आसान एपीआई उपलब्ध कराता है. इसके बाद, ML Kit के एपीआई में InputImage
फ़ीड किया जा सकता है.
// Step 1: create ML Kit's InputImage object
val image = InputImage.fromBitmap(bitmap, 0)
ऊपर दिया गया कोड, runObjectDetection(bitmap:Bitmap)
के सबसे ऊपर जोड़ें.
दूसरा चरण: डिटेक्टर इंस्टेंस बनाना
ML Kit, बिल्डर डिज़ाइन पैटर्न का पालन करती है. आपको कॉन्फ़िगरेशन को बिल्डर को पास करना होगा. इसके बाद, उससे डिटेक्टर पाना होगा. कॉन्फ़िगर करने के लिए तीन विकल्प हैं. इस कोडलैब में, बोल्ड में दिए गए विकल्पों का इस्तेमाल किया गया है:
- डिटेक्टर मोड (एक इमेज या स्ट्रीम)
- ऑब्जेक्ट का पता लगाने का मोड (एक या एक से ज़्यादा ऑब्जेक्ट का पता लगाने की सुविधा)
- क्लासिफ़िकेशन मोड (चालू या बंद)
यह कोडलैब, एक इमेज में एक से ज़्यादा ऑब्जेक्ट का पता लगाने और उनकी कैटगरी तय करने के लिए है. इसे अभी जोड़ें:
// 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
( 0.0 से 1.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 टूलबार में, चालू करें ( ) पर क्लिक करके, कोडलैब चलाएं. कोई प्रीसेट इमेज चुनें या फ़ोटो लें. इसके बाद, IDE में logcat विंडो( ) देखें.
आपको कुछ ऐसा दिखेगा:
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% भरोसा—यह सलाद था).
तकनीकी तौर पर, ML Kit की ऑब्जेक्ट डिटेक्शन सुविधा को काम करने के लिए, आपको बस इतना ही करना होगा: फ़िलहाल, आपको यह सुविधा मिल गई है! बधाई हो!
यूज़र इंटरफ़ेस (यूआई) की बात करें, तो आप अब भी उसी चरण में हैं जहां से आपने शुरुआत की थी. हालांकि, यूज़र को बेहतर अनुभव देने के लिए, यूआई पर पहचाने गए नतीजों का इस्तेमाल किया जा सकता है. जैसे, बॉउंडिंग बॉक्स बनाना: चलिए, अगले चरण पर चलते हैं – पहचाने गए नतीजों को पोस्ट-प्रोसेस करना!
6. पहचान के नतीजों को पोस्ट-प्रोसेस करना
पिछले चरणों में, logcat में पता लगाए गए नतीजे को प्रिंट किया जाता है: यह आसान और तेज़ तरीका है.
इस सेक्शन में, आपको इमेज में नतीजे का इस्तेमाल करना होगा:
- इमेज पर बाउंडिंग बॉक्स बनाना
- बॉउंडिंग बॉक्स के अंदर कैटगरी का नाम और कॉन्फ़िडेंस लेवल दिखाना
विज़ुअलाइज़ेशन की सुविधाओं को समझना
कोडलैब में कुछ बोइलरप्लेट कोड मौजूद है, ताकि आपको पहचान के नतीजे को विज़ुअलाइज़ करने में मदद मिल सके. विज़ुअलाइज़ेशन कोड को आसान बनाने के लिए, इन सुविधाओं का इस्तेमाल करें:
data class BoxWithText(val box: Rect, val text: String)
यह एक डेटा क्लास है, जिसमें विज़ुअलाइज़ेशन के लिए ऑब्जेक्ट का पता लगाने का नतीजा सेव किया जाता है.box
, बॉउंडिंग बॉक्स है जहां ऑब्जेक्ट की जगह की जानकारी होती है. साथ ही,text
, ऑब्जेक्ट के बॉउंडिंग बॉक्स के साथ दिखाने के लिए, ऑब्जेक्ट का पता लगाने की स्ट्रिंग होती है.fun drawDetectionResult(bitmap: Bitmap, detectionResults: List<BoxWithText>): Bitmap
यह तरीका, इनपुटbitmap
पर ऑब्जेक्ट की पहचान करने के नतीजों कोdetectionResults
में दिखाता है और उसकी बदली हुई कॉपी दिखाता है.
यहां drawDetectionResult
यूटिलिटी तरीके के आउटपुट का उदाहरण दिया गया है:
ML Kit की मदद से, ऑब्जेक्ट की पहचान करने के नतीजे को विज़ुअलाइज़ करना
इनपुट इमेज के ऊपर, ML Kit की ऑब्जेक्ट की पहचान करने की सुविधा का नतीजा दिखाने के लिए, विज़ुअलाइज़ेशन की सुविधाओं का इस्तेमाल करें.
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)
}
- विज़ुअलाइज़ेशन का नतीजा दिखाने के लिए, ML Kit के
DetectedObject
को पार्स करकेBoxWithText
ऑब्जेक्ट की सूची बनाई जाती है. - इसके बाद,
drawDetectionResult
यूटिलिटी के तरीके का इस्तेमाल करके, इनपुट इमेज के ऊपर पहचान के नतीजे को ड्रॉ करें और उसे स्क्रीन पर दिखाएं.
इसे चलाना
अब Android Studio टूलबार में, चालू करें ( ) पर क्लिक करें.
ऐप्लिकेशन लोड होने के बाद, कैमरा आइकॉन वाले बटन को दबाएं. इसके बाद, अपने कैमरे को किसी ऑब्जेक्ट पर फ़ोकस करें और फ़ोटो लें. इसके बाद, Camera ऐप्लिकेशन में जाकर फ़ोटो स्वीकार करें या किसी भी प्रीसेट इमेज पर आसानी से टैप करें. आपको ऑब्जेक्ट का पता चलने के नतीजे दिखेंगे. ML Kit के नए ODT का इस्तेमाल करने के लिए, बटन को फिर से दबाएं या कोई दूसरी इमेज चुनें और कुछ बार दोहराएं!
7. बधाई हो!
आपने अपने ऐप्लिकेशन में ऑब्जेक्ट की पहचान करने की सुविधाएं जोड़ने के लिए, ML Kit का इस्तेमाल किया है:
- तीन एपीआई के साथ तीन चरण
- इनपुट इमेज बनाना
- डिटेक्टर बनाना
- डिटेक्टर को इमेज भेजना
इसे चालू करने के लिए, आपको बस इतना ही करना है!
आगे बढ़ते हुए, आपको मॉडल को बेहतर बनाने का विकल्प मिल सकता है: जैसा कि आप देख सकते हैं कि डिफ़ॉल्ट मॉडल सिर्फ़ पांच कैटगरी की पहचान कर सकता है. मॉडल को चाकू, कांटे, और बोतल की भी पहचान नहीं है. कस्टम मॉडल को ट्रेन करने का तरीका जानने के लिए, डिवाइस पर मशीन लर्निंग - ऑब्जेक्ट डिटेक्शन के लर्निंग पाथवे में मौजूद अन्य कोडलैब देखें.
हमने क्या-क्या शामिल किया है
- अपने Android ऐप्लिकेशन में ML Kit की ऑब्जेक्ट का पता लगाने और ट्रैकिंग की सुविधा जोड़ने का तरीका
- इमेज में ऑब्जेक्ट का पता लगाने के लिए, ML Kit में डिवाइस पर ऑब्जेक्ट का पता लगाने और ट्रैक करने की सुविधा इस्तेमाल करने का तरीका
अगले चरण
- ज़्यादा इमेज और लाइव वीडियो के साथ ML Kit ODT को एक्सप्लोर करें. इससे, आपको ऑब्जेक्ट की पहचान करने और उसे कैटगरी में बांटने की सटीक जानकारी और परफ़ॉर्मेंस का अनुभव मिलेगा
- कस्टम मॉडल को ट्रेन करने का तरीका जानने के लिए, डिवाइस पर मशीन लर्निंग - ऑब्जेक्ट का पता लगाने के लिए लर्निंग पाथवे लेख पढ़ें
- अपने Android ऐप्लिकेशन में ML Kit ODT लागू करना