1. शुरू करने से पहले
इस सीरीज़ के पहले कोडलैब में, आपने एक बहुत ही सामान्य ऐप्लिकेशन बनाया था. इसमें इमेज के कॉन्टेंट को पार्स करने के लिए, इमेज लेबलिंग का इस्तेमाल किया गया था. आपने उसे एक डेज़ी की तस्वीर दिखाई और उसने बताया कि उसे पंखुड़ी या आसमान जैसी चीज़ें दिखीं. इसके बाद, दूसरे कोडलैब में आपने Python पर स्विच किया, ताकि एक नया, कस्टम मॉडल तैयार किया जा सके. यह मॉडल पांच अलग-अलग तरह के फूलों की पहचान कर सकता है.
इस कोडलैब में, आपको पहले लैब के ऐप्लिकेशन को दूसरे लैब के मॉडल से अपडेट करना होगा!
इस कोड लैब का पूरा सोर्स कोड पाने के लिए, इस रेपो को क्लोन करें. आपको Android और iOS के लिए सब-डायरेक्ट्री दिखेंगी. अगर आपको साथ-साथ कोड लिखना है, तो पिछले कोडलैब का कोड ImageClassifierStep1 के तौर पर उपलब्ध है. इस कोडलैब का पूरा कोड, ImageClassifierStep2 के तौर पर उपलब्ध है.
ज़रूरी शर्तें
- आपने इस लर्निंग पाथ के पहले दो कोडलैब पूरे किए हों
आपको क्या बनाने और सीखने को मिलेगा
- पिछले लैब में ट्रेन किए गए कस्टम मॉडल को Android या iOS ऐप्लिकेशन में इंटिग्रेट करना
आपको किन चीज़ों की ज़रूरत होगी
- Android Studio, जो लैब के Android वाले हिस्से के लिए developer.android.com/studio पर उपलब्ध है
- लैब के iOS हिस्से के लिए, Apple App Store में उपलब्ध Xcode
2. स्टार्टर ऐप्लिकेशन डाउनलोड करना
सबसे पहले, आपको Android या iOS पर अपना पहला कंप्यूटर विज़न ऐप्लिकेशन बनाने से जुड़े कोडलैब से ऐप्लिकेशन डाउनलोड करना होगा. अगर आपने लैब पूरा कर लिया है, तो इसे ImageClassifierStep1 कहा जाएगा. अगर आपको लैब में नहीं जाना है, तो repo से, तैयार किए गए वर्शन को क्लोन किया जा सकता है
इसे Android Studio में खोलें. इसके बाद, ज़रूरी अपडेट करें. जब यह तैयार हो जाए, तो ऐप्लिकेशन को चलाकर देखें कि यह काम कर रहा है या नहीं. आपको कुछ ऐसा दिखेगा:

यह एक सामान्य ऐप्लिकेशन है. हालांकि, इसमें कुछ ही कोड के साथ बहुत काम के फ़ंक्शन दिखाए गए हैं. हालांकि, अगर आपको इस फूल को सिर्फ़ फूल के तौर पर नहीं, बल्कि डेज़ी के तौर पर पहचानना है, तो आपको ऐप्लिकेशन को अपडेट करना होगा. ऐसा करने के लिए, आपको इमेज क्लासिफ़ायर के लिए कस्टम मॉडल बनाने वाले कोडलैब में दिए गए कस्टम मॉडल का इस्तेमाल करना होगा.
3. कस्टम एमएल किट मॉडल का इस्तेमाल करने के लिए, build.gradle फ़ाइल को अपडेट करना
- Android Studio का इस्तेमाल करके, ऐप्लिकेशन-लेवल की
build.gradleफ़ाइल ढूंढें. ऐसा करने का सबसे आसान तरीका, प्रोजेक्ट एक्सप्लोरर में है. पक्का करें कि सबसे ऊपर Android चुना गया हो. इसके बाद, आपको सबसे नीचे Gradle Scripts का फ़ोल्डर दिखेगा. - मॉड्यूल के लिए बनाए गए फ़ोल्डर को खोलें. इसमें आपके ऐप्लिकेशन का नाम होगा. इसके बाद, ‘.app' लिखा होगा. यह इस तरह दिखेगा – (Module: ImageClassifierStep1.app):

- फ़ाइल में सबसे नीचे, डिपेंडेंसी सेटिंग ढूंढें. आपको यह लाइन दिखेगी:
implementation 'com.google.mlkit:image-labeling:17.0.1'
वर्शन नंबर अलग हो सकता है. ML Kit की साइट पर जाकर, हमेशा सबसे नए वर्शन का नंबर देखें. इसके लिए, इस लिंक पर जाएं: https://developers.google.com/ml-kit/vision/image-labeling/android
- इसे कस्टम इमेज लेबलिंग लाइब्रेरी के रेफ़रंस से बदलें. इसका वर्शन नंबर यहां देखा जा सकता है: https://developers.google.com/ml-kit/vision/image-labeling/custom-models/android
implementation 'com.google.mlkit:image-labeling-custom:16.3.1'
- इसके अलावा, आपको पिछले लैब में बनाया गया .tflite मॉडल जोड़ना होगा. Android Studio आपके ऐप्लिकेशन को कंपाइल करते समय, इस मॉडल को कंप्रेस नहीं करेगा. इसलिए, पक्का करें कि आपने इसी
build.gradleफ़ाइल के Android सेक्शन में इस सेटिंग का इस्तेमाल किया हो:
aaptOptions{
noCompress "tflite"
}
पक्का करें कि यह किसी अन्य सेटिंग में न हो. इसे सीधे तौर पर android टैग के नीचे नेस्ट किया जाना चाहिए. यहां एक उदाहरण दिया गया है:

4. TFLite मॉडल जोड़ना
पिछले कोडलैब में, आपने अपना कस्टम मॉडल बनाया था और उसे model.tflite के तौर पर डाउनलोड किया था.
अपने प्रोजेक्ट में, ऐसेट फ़ोल्डर ढूंढें. इसमें फ़िलहाल flower1.jpg मौजूद है. मॉडल को उस फ़ोल्डर में इस तरह कॉपी करें:
- Android Studio में, Assets फ़ोल्डर पर राइट क्लिक करें. इसके बाद, जो मेन्यू खुले उसमें Finder में दिखाएं को चुनें. (Windows पर ‘Explorer में दिखाएं' और Linux पर ‘फ़ाइलों में दिखाएं'.)

- आपको फ़ाइल सिस्टम पर मौजूद डायरेक्ट्री पर ले जाया जाएगा.
model.tfliteफ़ाइल को उस डायरेक्ट्री में कॉपी करें. साथ ही,flower1.jpg.को भी कॉपी करें

Android Studio, आपके ऐसेट फ़ोल्डर में दोनों फ़ाइलें दिखाने के लिए अपडेट हो जाएगा:

अब कोड अपडेट किया जा सकता है.
5. कस्टम मॉडल के लिए अपना कोड अपडेट करना
पहला चरण, कस्टम मॉडल को लोड करने के लिए कुछ कोड जोड़ना होगा.
- अपनी
MainActivityफ़ाइल में,onCreateके नीचे यह लाइन जोड़ें. यह लाइन,setContentView(R.layout.activity_main)के ठीक नीचे होनी चाहिए.
यह LocalModel का इस्तेमाल करके, model.tflite ऐसेट से बनाएगा. अगर Android Studio में ‘LocalModel' लाल रंग में दिखता है, तो इसका मतलब है कि कोई समस्या है. लाइब्रेरी इंपोर्ट करने के लिए, ALT + Enter दबाएं. इससे आपके लिए, com.google.mlkit.common.model.LocalModel में एक इंपोर्ट जुड़ जाएगा.
val localModel = LocalModel.Builder()
.setAssetFilePath("model.tflite")
.build()
इससे पहले, btn.setOnClickListener हैंडलर में डिफ़ॉल्ट मॉडल का इस्तेमाल किया जा रहा था. इसे इस कोड से सेट अप किया गया था:
val labeler = ImageLabeling.getClient(ImageLabelerOptions.DEFAULT_OPTIONS)
कस्टम मॉडल का इस्तेमाल करने के लिए, आपको इसे बदलना होगा.
- कस्टम विकल्प ऑब्जेक्ट सेट अप करें:
val options = CustomImageLabelerOptions.Builder(localModel)
.setConfidenceThreshold(0.7f)
.setMaxResultCount(5)
.build()
इससे डिफ़ॉल्ट विकल्पों की जगह, पसंद के मुताबिक बनाए गए विकल्पों का सेट इस्तेमाल किया जाता है. कॉन्फ़िडेंस थ्रेशोल्ड, अनुमानों की क्वालिटी के लिए एक बार सेट करता है. इस कोडलैब में सबसे ऊपर दिए गए सैंपल में, इमेज एक डेज़ी की थी. इसमें चार अनुमान लगाए गए थे. हर अनुमान के बगल में एक वैल्यू दी गई थी. जैसे, ‘आकाश’ के लिए .7632.
ज़्यादा कॉन्फ़िडेंस थ्रेशोल्ड का इस्तेमाल करके, कम क्वालिटी वाले नतीजों को आसानी से फ़िल्टर किया जा सकता है. उदाहरण के लिए, इसे 0.9 पर सेट करने से, इससे कम प्राथमिकता वाला कोई भी लेबल नहीं दिखेगा. setMaxResultCount(), कई क्लास वाले मॉडल में काम आता है. हालांकि, इस मॉडल में सिर्फ़ पांच क्लास हैं. इसलिए, इसे पांच पर ही छोड़ दें.
अब आपके पास लेबलर के लिए विकल्प हैं. इसलिए, लेबलर के इंस्टैंटिएशन को इनमें बदला जा सकता है:
val labeler = ImageLabeling.getClient(options)
आपके बाकी कोड में कोई बदलाव नहीं किया जाएगा. इसे आज़माएं!

यहां देखा जा सकता है कि अब इस फूल की पहचान डेज़ी के तौर पर की गई है. इसकी संभावना 0.959 है!
मान लें कि आपने दूसरी फूल की इमेज जोड़ी और उसे फिर से चलाया:

यह इसे गुलाब के तौर पर पहचानता है.
आपको लग सकता है कि इसमें सिर्फ़ "गुलाब" के बजाय, गुलाब क्यों लिखा है. ऐसा इसलिए है, क्योंकि डेटासेट में फ़ोल्डर के नामों से लेबल दिए गए हैं. अफ़सोस की बात है कि फ़ोल्डर के नाम थोड़े अलग-अलग हैं. कभी-कभी एकवचन (जैसे, ‘डेज़ी') और कभी-कभी बहुवचन (जैसे, ‘गुलाब') का इस्तेमाल किया गया है. इसे इमेज में मौजूद आइटम की गिनती करने वाले मॉडल के साथ भ्रमित न करें – यह उससे कहीं ज़्यादा सामान्य है और सिर्फ़ फूलों की पहचान कर सकता है!
6. iOS Start ऐप्लिकेशन डाउनलोड करें
- सबसे पहले, आपको पहले कोडलैब का ऐप्लिकेशन चाहिए होगा. अगर आपने लैब पूरा कर लिया है, तो इसे ImageClassifierStep1 कहा जाएगा. अगर आपको लैब में नहीं जाना है, तो repo से, पूरा हो चुका वर्शन क्लोन किया जा सकता है. कृपया ध्यान दें कि पॉड और .xcworkspace, रेपो में मौजूद नहीं हैं. इसलिए, अगले चरण पर जाने से पहले, .xcproject वाली डायरेक्ट्री से ‘pod install' कमांड चलाएं.
ImageClassifierStep1.xcworkspaceको Xcode में खोलें. ध्यान दें कि आपको .xcworkspace का इस्तेमाल करना चाहिए, न कि .xcproject का. ऐसा इसलिए, क्योंकि आपने पॉड का इस्तेमाल करके ML Kit को बंडल किया है. साथ ही, वर्कस्पेस इन्हें लोड करेगा.
इस लैब के बाकी हिस्से के लिए, मैं ऐप्लिकेशन को iPhone सिम्युलेटर में चलाऊंगा. यह सिम्युलेटर, कोडलैब के बिल्ड टारगेट के साथ काम करता है. अगर आपको अपने डिवाइस का इस्तेमाल करना है, तो हो सकता है कि आपको अपने प्रोजेक्ट की सेटिंग में जाकर, बिल्ड टारगेट को अपने iOS वर्शन के हिसाब से बदलना पड़े.
इसे चलाएं. इसके बाद, आपको कुछ ऐसा दिखेगा:

ध्यान दें कि यहां बहुत सामान्य क्लासिफ़िकेशन दिए गए हैं – पंखुड़ी, फूल, आसमान. आपने पिछले कोडलैब में जो मॉडल बनाया था उसे पांच तरह के फूलों की पहचान करने के लिए ट्रेन किया गया था. इनमें यह फूल भी शामिल है, जो एक डेज़ी है.
इस कोडलैब के बाकी हिस्से में, आपको यह बताया जाएगा कि कस्टम मॉडल का इस्तेमाल करके अपने ऐप्लिकेशन को अपग्रेड करने के लिए क्या करना होगा.
7. Custom ML Kit Image Labeler Pods का इस्तेमाल करना
पहले ऐप्लिकेशन में, ML Kit Image Labeler की बुनियादी लाइब्रेरी और मॉडल पाने के लिए पॉड फ़ाइल का इस्तेमाल किया गया था. कस्टम इमेज लेबलिंग लाइब्रेरी का इस्तेमाल करने के लिए, आपको इसे अपडेट करना होगा.
- अपनी प्रोजेक्ट डायरेक्ट्री में
podfileनाम की फ़ाइल ढूंढें. इसे खोलें. इसके बाद, आपको कुछ ऐसा दिखेगा:
platform :ios, '10.0'
target 'ImageClassifierStep1' do
pod 'GoogleMLKit/ImageLabeling'
end
- पॉड के बारे में जानकारी देने वाले फ़ील्ड की वैल्यू को
ImageLabelingसे बदलकरImageLabelingCustomकरें. जैसे:
platform :ios, '10.0'
target 'ImageClassifierStep1' do
pod 'GoogleMLKit/ImageLabelingCustom'
end
- जब यह प्रोसेस पूरी हो जाए, तो टर्मिनल का इस्तेमाल करके उस डायरेक्ट्री पर जाएं जिसमें podfile और .xcworkspace मौजूद है. इसके बाद,
pod installचलाएं.

कुछ समय बाद, MLKitImageLabeling लाइब्रेरी हटा दी जाएंगी और कस्टम लाइब्रेरी जोड़ दी जाएंगी. अब अपने कोड में बदलाव करने के लिए, .xcworkspace फ़ाइल खोली जा सकती है.
8. Xcode में TFLite मॉडल जोड़ना
पिछले कोडलैब में, आपने एक कस्टम मॉडल बनाया था. साथ ही, उसे model.tflite के तौर पर डाउनलोड किया था. अगर आपके पास यह जानकारी नहीं है, तो वापस जाएं और उस कोडलैब को चलाएं. इसके अलावा, यहां जाकर कोलाब कोड देखें. अगर आपके पास Google Colab का ऐक्सेस नहीं है, तो नोटबुक इस लिंक पर उपलब्ध है
- Xcode में फ़ाइल फ़ोल्डर खुला होने पर, model.tflite को अपने प्रोजेक्ट पर खींचें और छोड़ें. यह उसी फ़ोल्डर में होना चाहिए जिसमें आपकी अन्य फ़ाइलें हैं. जैसे,
ViewController.swiftयाMain.storyboard. - फ़ाइल जोड़ने के विकल्पों वाला डायलॉग बॉक्स पॉप-अप होगा. पक्का करें कि टारगेट में जोड़ें विकल्प चुना गया हो. ऐसा न होने पर, मॉडल को किसी डिवाइस पर डिप्लॉय करने के दौरान, उसे ऐप्लिकेशन के साथ बंडल नहीं किया जाएगा.
ध्यान दें कि अगर आपने ‘Add to Targets' एंट्री से शुरुआत की है और इस लैब के हर चरण को पूरा कर रहे हैं, तो इसमें ImageClassifierStep1 होगा. अगर आपने सीधे पूरे कोड पर स्विच किया है, तो इसमें ImageClassifierStep2 होगा. जैसा कि दिखाया गया है.

इससे यह पक्का होगा कि मॉडल लोड किया जा सकता है. अगले चरण में, आपको इसका तरीका बताया जाएगा.
9. कस्टम मॉडल के लिए कोड अपडेट करना
- अपनी
ViewController.swiftफ़ाइल खोलें. आपको फ़ाइल में सबसे ऊपर, ‘import MLKitImageLabeling' पर गड़बड़ी दिख सकती है. ऐसा इसलिए हुआ, क्योंकि पॉड फ़ाइल अपडेट करते समय, आपने इमेज लेबलिंग की सामान्य लाइब्रेरी हटा दी थीं. इस लाइन को मिटाकर, इसकी जगह यह लाइन जोड़ें:
import MLKitVision
import MLKit
import MLKitImageLabelingCommon
import MLKitImageLabelingCustom
इन्हें तेज़ी से पढ़ने पर, ऐसा लग सकता है कि ये एक ही कोड को दोहरा रहे हैं! हालाँकि, आखिर में "सामान्य" और "कस्टम" है!
- इसके बाद, पिछले चरण में जोड़े गए कस्टम मॉडल को लोड करें.
getLabels()फ़ंक्शन ढूंढें.visionImage.orientation = image.imageOrientationवाली लाइन के नीचे, ये लाइनें जोड़ें:
// Add this code to use a custom model
let localModelFilePath = Bundle.main.path(forResource: "model", ofType: "tflite")
let localModel = LocalModel(path: localModelFilePath!)
- ImageLabeler के लिए विकल्प तय करने वाला कोड ढूंढें. ऐसा हो सकता है कि इन लाइब्रेरी को हटा दिए जाने की वजह से, आपको गड़बड़ी का मैसेज दिख रहा हो:
let options = ImageLabelerOptions()
CustomImageLabelerOptions का इस्तेमाल करने के लिए, इस कोड को उस कोड से बदलें. यह कोड, स्थानीय मॉडल के बारे में बताता है:
let options = CustomImageLabelerOptions(localModel: localModel)
...बस इतना ही! अपने ऐप्लिकेशन को अभी चलाकर देखें! इमेज को क्लासिफ़ाई करने की कोशिश करने पर, यह ज़्यादा सटीक होनी चाहिए. साथ ही, आपको यह बताना चाहिए कि यह एक डेज़ी है!

मान लें कि आपने दूसरी फूल की इमेज जोड़ी और उसे फिर से चलाया:

ऐप्लिकेशन ने यह पता लगा लिया है कि यह इमेज, ‘गुलाब' लेबल से मेल खाती है!
10. बधाई हो!
अब आपने एक ऐसे ऐप्लिकेशन से शुरुआत की है जो इमेज के कॉन्टेंट की पहचान करने के लिए, सामान्य मॉडल का इस्तेमाल करता है. इसके बाद, आपने खास चीज़ों (जैसे, फूल) की पहचान करने के लिए, अपना एमएल मॉडल बनाया. इसके बाद, आपने अपने ऐप्लिकेशन को अपडेट करके, कस्टम मॉडल का इस्तेमाल किया.
हालांकि, इस तरह से बनाए गए ऐप्लिकेशन में बहुत कम सुविधाएं होती हैं, क्योंकि यह बंडल की गई इमेज ऐसेट पर निर्भर करता है. हालांकि, एमएल वाला हिस्सा ठीक से काम कर रहा है. उदाहरण के लिए, AndroidX Camera का इस्तेमाल करके लाइव फ़ीड से फ़्रेम लिए जा सकते हैं. इसके बाद, उन्हें कैटगरी में बांटा जा सकता है. इससे यह पता चलेगा कि आपका फ़ोन किन फूलों को पहचानता है!
यहां से, आपके पास कई विकल्प उपलब्ध हैं. अगर आपके पास फूलों के अलावा किसी और चीज़ का डेटा है, तो आपके पास कंप्यूटर विज़न का इस्तेमाल करके, उन्हें पहचानने वाला ऐप्लिकेशन बनाने के लिए ज़रूरी जानकारी है. ये सिर्फ़ कुछ शुरुआती चरण हैं. आने वाले समय में, आपको और भी कई चरणों से गुज़रना होगा. हमें उम्मीद है कि आपको इन चरणों को पूरा करने में मज़ा आया होगा!