अपने ऐप्लिकेशन में कस्टम मॉडल को इंटीग्रेट करना

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

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

इस कोडलैब में, पहले लैब के ऐप्लिकेशन को दूसरे मॉडल के मॉडल से अपडेट किया जाएगा!

आपको इस रेपो को क्लोन करके, इस कोड लैब के लिए पूरा सोर्स कोड मिल सकता है. आपको Android और iOS के लिए सब डायरेक्ट्री दिखेंगी. अगर आपको इसे फ़ॉलो करना है, तो पिछले कोडलैब का कोड ImageClassifierStep1 के तौर पर उपलब्ध है. इस कोडलैब के लिए तैयार किया गया कोड ImageClassifierStep2 के तौर पर उपलब्ध है.

ज़रूरी शर्तें

  • आपको इस लर्निंग पाथ में पहले दो कोडलैब पूरे करने होंगे

आपको क्या बनाना और सीखना होगा

  • पिछले लैब में ट्रेनिंग पा चुके कस्टम मॉडल को Android या iOS ऐप्लिकेशन में इंटिग्रेट करना

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

  • Android Studio, लैब के Android वाले हिस्से के लिए developer.android.com/studio पर उपलब्ध है
  • Xcode, जो लैब के iOS हिस्से के लिए Apple App Store में उपलब्ध है

2. स्टार्टर ऐप्लिकेशन डाउनलोड करें

सबसे पहले, आपको Android या iOS कोडलैब (कोड बनाना सीखना) पर ऐप्लिकेशन बनाने की ज़रूरत होगी. अगर आपने लैब को देखा है, तो इसे ImageClassifierStep1 के नाम से जाना जाएगा. अगर आपको लैब के ज़रिए नहीं जाना है, तो रेपो से, इस्तेमाल किए जा चुके वर्शन का क्लोन बनाएं

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

f3703d45d1332d1d.png

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

3. कस्टम एमएल किट मॉडल का इस्तेमाल करने के लिए, Build.gradle को अपडेट करें

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

8fe1d04b40610047.png

  1. फ़ाइल के नीचे, डिपेंडेंसी सेटिंग ढूंढें. वहां आपको यह लाइन दिखेगी:
implementation 'com.google.mlkit:image-labeling:17.0.1'

वर्शन नंबर अलग हो सकता है. एमएल किट की साइट पर जाकर, नया वर्शन नंबर हमेशा यहां देखें: https://developers.google.com/ml-kit/vision/image-labeling/android

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

पक्का करें कि यह किसी दूसरी सेटिंग में न हो. इसे सीधे android टैग के नीचे नेस्ट किया जाना चाहिए. यहां एक उदाहरण दिया गया है:

62d546bff11d2a50.png

4. TFLite मॉडल जोड़ें

पिछले कोडलैब में, आपने अपना कस्टम मॉडल बनाया था और उसेmodel.tflite के तौर पर डाउनलोड किया था.

अपने प्रोजेक्ट में, अपना ऐसेट फ़ोल्डर ढूंढें, जिसमें फ़िलहाल flower1.jpg मौजूद है. मॉडल को उस फ़ोल्डर में इस प्रकार कॉपी करें:

  1. Android Studio में ऐसेट फ़ोल्डर पर राइट क्लिक करें. इसके बाद, खुलने वाले मेन्यू में, Finder in Finder को चुनें. (Windows पर ‘एक्सप्लोरर में दिखाएं’ और Linux पर ‘फ़ाइलों में दिखाएं’.)

db30b47e419a326b.png

  1. आपको फ़ाइल सिस्टम की डायरेक्ट्री पर ले जाया जाएगा. उस डायरेक्ट्री में model.tflite फ़ाइल को flower1.jpg. के साथ कॉपी करें

36de0c51bec1c19e.png

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

e9f4e9f394d9b357.png

अब आप अपना कोड अपडेट करने के लिए तैयार हैं.

5. कस्टम मॉडल के लिए अपना कोड अपडेट करना

सबसे पहले, कस्टम मॉडल को लोड करने के लिए कुछ कोड जोड़ें.

  1. अपनी MainActivity फ़ाइल में, setContentView(R.layout.activity_main) नाम वाली लाइन के ठीक नीचे, अपने onCreate में ये जोड़ें.

यह Model.tflite एसेट से बनाने के लिए, LocalModel का इस्तेमाल करेगा. अगर 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)

आपको उसे कस्टम मॉडल का इस्तेमाल करने के लिए बदलना होगा.

  1. पसंद के मुताबिक विकल्प ऑब्जेक्ट सेट अप करें:
val options = CustomImageLabelerOptions.Builder(localModel)
        .setConfidenceThreshold(0.7f)
        .setMaxResultCount(5)
        .build()

यह डिफ़ॉल्ट विकल्पों को एक कस्टमाइज़ किए गए सेट से बदल देता है. कॉन्फ़िडेंस थ्रेशोल्ड से, अनुमानों की क्वालिटी के लिए एक स्टैंडर्ड तय होता है. अगर इस कोडलैब के सबसे ऊपर दिए गए सैंपल पर दोबारा नज़र डालें, जहां इमेज डेज़ी (डेज़ी) थी, तो आपको चार अनुमान दिखेंगे. हर अनुमान के बगल में 'आकाश' होगी. यानी .7632.

हाई कॉन्फ़िडेंस थ्रेशोल्ड का इस्तेमाल करके, कम क्वालिटी वाले नतीजों को असरदार तरीके से फ़िल्टर किया जा सकता है. उदाहरण के लिए, इसे 0.9 पर सेट करने से, इससे कम प्राथमिकता वाला कोई लेबल नहीं दिखेगा. setMaxResultCount(), कई क्लास वाले मॉडल के लिए काम का है. हालांकि, इस मॉडल में सिर्फ़ पांच क्लास हैं, इसलिए इसे 5 पर ही रहने दिया जाएगा.

अब जब आपके पास लेबलर के लिए विकल्प हैं, तो आप लेबलर के इंस्टैंशिएशन को बदलकर यह कर सकते हैं:

val labeler = ImageLabeling.getClient(options)

आपके बाकी के कोड बिना किसी बदलाव के चलेंगे. इसे आज़माएं!

dd40c36c4edbb33.png

यहां देखा जा सकता है कि इस फूल की पहचान अब डेज़ी के फूल के रूप में की गई थी, जिसकी .959 संभावना थी!

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

8556a5fbea487842.png

यह उसकी पहचान गुलाब की तरह है.

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

6. iOS Start ऐप्लिकेशन डाउनलोड करें

  1. सबसे पहले, आपको पहले कोडलैब वाले ऐप्लिकेशन से ऐप्लिकेशन की ज़रूरत होगी. अगर आप लैब को देख चुके हैं, तो इसे ImageClassifierStep1 के नाम से जाना जाएगा. अगर आपको लैब के ज़रिए नहीं जाना है, तो रेपो से, इस्तेमाल किए जा चुके वर्शन का क्लोन बनाएं. कृपया ध्यान दें कि रेपो में पॉड और .xcworkspace मौजूद नहीं हैं. इसलिए, अगले चरण पर जाने से पहले, ‘pod install' को ज़रूर चलाएं .xcproject वाली एक डायरेक्ट्री से.
  2. ImageClassifierStep1.xcworkspace को Xcode में खोलें. ध्यान दें कि आपको .xcproject के बजाय .xcworkspace का इस्तेमाल करना चाहिए, क्योंकि आपने पॉड का इस्तेमाल करके ML Kit बंडल किया है. इसके बाद, Workspace में इन्हें लोड किया जाएगा.

इस लैब के बाकी बचे हिस्से के लिए, मैं iPhone सिम्युलेटर में ऐप्लिकेशन चलाऊंगी. इस ऐप्लिकेशन को कोडलैब के बिल्ड टारगेट के साथ काम करना चाहिए. अगर आपको अपने डिवाइस का इस्तेमाल करना है, तो आपको अपने प्रोजेक्ट की सेटिंग में बिल्ड टारगेट में बदलाव करना होगा, ताकि वह आपके iOS वर्शन से मैच कर सके.

इसे चलाएं और आपको कुछ ऐसा दिखेगा:

9e151ed18f99fb98.png

ध्यान दें कि सबसे सामान्य कैटगरी हैं - पंखुड़ी, फूल, आसमान. पिछले कोडलैब में बनाए गए मॉडल को, पांच तरह के फूलों का पता लगाने की ट्रेनिंग दी गई थी. इनमें एक डेज़ी भी शामिल है.

कोडलैब के इस मॉड्यूल के बाकी बचे हिस्से में, आपको यह दिखेगा कि अपने ऐप्लिकेशन को कस्टम मॉडल से अपग्रेड करने में क्या करना होगा.

7. कस्टम एमएल किट इमेज लेबलर पॉड का इस्तेमाल करें

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

  1. अपनी प्रोजेक्ट डायरेक्ट्री में podfile नाम की फ़ाइल ढूंढें. इसे खोलें और आपको कुछ ऐसा दिखेगा:
platform :ios, '10.0'

target 'ImageClassifierStep1' do
        pod 'GoogleMLKit/ImageLabeling'
end
  1. पॉड एलान को ImageLabeling से बदलकर ImageLabelingCustom करें, जैसे कि:
platform :ios, '10.0'

target 'ImageClassifierStep1' do
        pod 'GoogleMLKit/ImageLabelingCustom'
end
  1. काम पूरा होने के बाद, पॉडफ़ाइल (.xcworkspace) और पॉडफ़ाइल वाली डायरेक्ट्री पर जाने के लिए, टर्मिनल का इस्तेमाल करें. इसके बाद, pod install चलाएं.

bb5d78eb7c7ab975.png

कुछ देर बाद, MLKitImageLabeling लाइब्रेरी हटा दी जाएँगी और कस्टम लाइब्रेरी जोड़ दी जाएँगी. अपने कोड में बदलाव करने के लिए, अब .xcworkspace खोलें.

8. Xcode में TFLite मॉडल जोड़ें

पिछले कोडलैब में, आपने एक कस्टम मॉडल बनाया और उसे Model.tflite के तौर पर डाउनलोड किया. अगर आपके पास यह मौजूद नहीं है, तो वापस जाएं और उस कोडलैब को चलाएं या यहां कोलैब कोड देखें. अगर आपके पास Google Colab का ऐक्सेस नहीं है, तो notebook इस लिंक पर उपलब्ध है

  1. Xcode में फ़ाइल फ़ोल्डर खोलने के बाद, Model.tflite को अपने प्रोजेक्ट पर खींचें और छोड़ें. यह उसी फ़ोल्डर में होना चाहिए जिसमें आपकी बाकी फ़ाइलें हैं, जैसे कि ViewController.swift या Main.storyboard.
  2. फ़ाइल जोड़ने के विकल्पों वाला एक डायलॉग पॉप-अप होगा. पक्का करें कि आपने टारगेट में जोड़ें विकल्प चुना हो. अगर ऐप्लिकेशन को डिवाइस पर डिप्लॉय किया जाता है, तो मॉडल को ऐप्लिकेशन के साथ बंडल नहीं किया जाएगा.

ध्यान दें कि ‘लक्ष्य में जोड़ें’ एंट्री में ImageClassifierStep1 होगा, अगर आपने उससे शुरू किया हो और इस लैब के सिलसिलेवार चरणों को जारी रखा हो या फिर ImageClassifierStep2 (जैसा दिखाया गया है) पर क्लिक करके, प्रोसेस को जारी रखें.

5b6a7f40c73f0f1f.png

इससे यह पक्का होगा कि मॉडल लोड किया जा सकता है. अगले चरण में आपको यह पता चलेगा कि यह कैसे किया जा सकता है.

9. कस्टम मॉडल के लिए अपना कोड अपडेट करना

  1. अपनी ViewController.swift फ़ाइल खोलें. आपको 'MLKitImageLabeling आयात करें' पर एक गड़बड़ी दिख सकती है सबसे ऊपर रखें. ऐसा इसलिए होता है, क्योंकि अपनी पॉड फ़ाइल को अपडेट करते समय, आपने इमेज को लेबल करने वाली जेनरिक लाइब्रेरी हटा दी होती हैं. इस लाइन को बेझिझक मिटाएं और इनके साथ अपडेट करें:
import MLKitVision
import MLKit
import MLKitImageLabelingCommon
import MLKitImageLabelingCustom

इन्हें तेज़ी से पढ़ना और समझना आसान हो सकता है कि ये एक ही कोड को दोहरा रहे हैं! हालांकि, यह "सामान्य" है और "पसंद के मुताबिक" आखिर में!

  1. इसके बाद, आपको पिछले चरण में जोड़ा गया कस्टम मॉडल लोड करना होगा. 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!)
  1. जेनरिक ImageLabeler के लिए विकल्पों को तय करने के लिए कोड पाएं. यह शायद आपको कोई गड़बड़ी दे रहा है, क्योंकि उन लाइब्रेरी को हटा दिया गया है:
let options = ImageLabelerOptions()

इसे इस कोड से बदलें, ताकि CustomImageLabelerOptions का इस्तेमाल किया जा सके. यह कोड लोकल मॉडल की जानकारी देता है:

let options = CustomImageLabelerOptions(localModel: localModel)

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

238cd21748a97cf4.png

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

75f3970a6b509bfe.png

ऐप्लिकेशन को पता चला है कि यह इमेज 'गुलाब' लेबल से मेल खाती है!

10. बधाई हो!

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

हालांकि, नतीजे के तौर पर मिलने वाले ऐप्लिकेशन की संख्या सीमित है, क्योंकि यह बंडल की गई इमेज ऐसेट पर निर्भर करता है. हालांकि, एमएल वाला हिस्सा सही तरीके से काम कर रहा है. उदाहरण के लिए, AndroidX Camera का इस्तेमाल करके लाइव फ़ीड से फ़्रेम लिए जा सकते हैं और उन्हें अलग-अलग कैटगरी में बांटा जा सकता है, ताकि यह देखा जा सके कि आपका फ़ोन किस तरह के फूलों की पहचान करता है!

यहां से कई काम किए जा सकते हैं. अगर आपके पास फूलों के अलावा किसी और चीज़ के लिए डेटा है, तो आपके पास इसकी बुनियाद होगी कि आपको एक ऐसा ऐप्लिकेशन बनाने की ज़रूरत पड़ेगी जो कंप्यूटर विज़न की मदद से उनकी पहचान कर सके. दुनिया भर के दर्शकों की भागीदारी बढ़ाने के लिए, ये तो सिर्फ़ कुछ शुरुआती चरण हैं. हमें उम्मीद है कि आपने इन्हें आज़माया है!