
दो साल पहले, Google के प्रमुख सुंदर पिचाई ने कहा था कि मोबाइल से कंपनी पहले AI बनती है और मशीन सीखने पर ध्यान केंद्रित करती है। एक साल बाद, मशीन लर्निंग किट जारी किया गया - एक उपकरण का सेट जिसके साथ आप प्रभावी रूप से आईओएस और एंड्रॉइड पर एमएल का उपयोग कर सकते हैं।
संयुक्त राज्य अमेरिका में एमएल किट के बारे में बहुत बात है, लेकिन रूसी में लगभग कोई जानकारी नहीं है। और जब से हम इसे Yandex.Money में कुछ कार्यों के लिए उपयोग करते हैं, मैंने अपने अनुभव को साझा करने और उदाहरणों के साथ दिखाने का फैसला किया कि इसका उपयोग कैसे करें दिलचस्प चीजें करने के लिए।
मेरा नाम Yura है। पिछले साल मैं Yandex में काम कर रहा हूं। एक मोबाइल वॉलेट पर कोई भी टीम नहीं है। हम मोबाइल में मशीन सीखने के बारे में बात करेंगे।
लगभग। संपादकीय कर्मचारी: यह पोस्ट Yandex.Money मेटाप एंड्रॉइड पैरानॉयड से यूरी चेचेकिन की रिपोर्ट "मोबाइल पहले से एआई पहले" की एक पुनर्प्रकाशन है ।
एमएल किट क्या है?
यह Google का मोबाइल एसडीके है जो एंड्रॉइड और आईओएस उपकरणों पर मशीन सीखने का उपयोग करना आसान बनाता है। एमएल या कृत्रिम बुद्धि में विशेषज्ञ होना आवश्यक नहीं है, क्योंकि कोड की कुछ पंक्तियों में आप बहुत जटिल चीजों को लागू कर सकते हैं। इसके अलावा, यह जानना आवश्यक नहीं है कि तंत्रिका नेटवर्क या मॉडल अनुकूलन कैसे काम करते हैं।
एमएल किट क्या कर सकता है?
बुनियादी सुविधाएँ काफी व्यापक हैं। उदाहरण के लिए, आप टेक्स्ट को पहचान सकते हैं, चेहरे, वस्तुओं को ढूंढ सकते हैं और ट्रैक कर सकते हैं, छवियों और अपने स्वयं के वर्गीकरण मॉडल के लिए लेबल बना सकते हैं, बारकोड और क्यूआर टैग स्कैन कर सकते हैं।
हमने पहले से ही Yandex.Money एप्लिकेशन में QR कोड मान्यता का उपयोग किया है।
एक एमएल किट भी है
- मील का पत्थर मान्यता;
- जिस भाषा में पाठ लिखा गया है, उसकी परिभाषा;
- डिवाइस पर ग्रंथों का अनुवाद;
- किसी पत्र या संदेश का त्वरित उत्तर।
बॉक्स से बाहर बड़ी संख्या में विधियों के अलावा, कस्टम मॉडल के लिए समर्थन है, जो व्यावहारिक रूप से अंतहीन संभावनाएं देता है - उदाहरण के लिए, आप काले और सफेद तस्वीरों को रंगीन कर सकते हैं और उन्हें रंग बना सकते हैं।
यह महत्वपूर्ण है कि आपको इसके लिए किसी भी सेवा, एपीआई या बैकएंड का उपयोग करने की आवश्यकता नहीं है। सब कुछ सीधे डिवाइस पर किया जा सकता है, इसलिए हम उपयोगकर्ता ट्रैफ़िक को लोड नहीं करते हैं, नेटवर्क से संबंधित त्रुटियों का एक गुच्छा नहीं मिलता है, हमें मामलों का एक गुच्छा संसाधित नहीं करना है, उदाहरण के लिए, इंटरनेट की कमी, कनेक्शन का नुकसान और इसी तरह। इसके अलावा, डिवाइस पर यह एक नेटवर्क के माध्यम से बहुत तेजी से काम करता है।

पाठ मान्यता
कार्य: एक तस्वीर दी गई है, आपको पाठ को एक आयत में परिचालित करने की आवश्यकता है।
हम ग्रैडल में निर्भरता के साथ शुरू करते हैं। यह एक निर्भरता को जोड़ने के लिए पर्याप्त है, और हम काम करने के लिए तैयार हैं।
dependencies {
यह मेटाडेटा को निर्दिष्ट करने के लायक है जो कहता है कि प्ले मार्केट से एप्लिकेशन डाउनलोड करते समय मॉडल को डिवाइस पर डाउनलोड किया जाएगा। यदि आप ऐसा नहीं करते हैं और बिना मॉडल के एपीआई का उपयोग करते हैं, तो हमें एक त्रुटि मिलेगी, और मॉडल को पृष्ठभूमि में डाउनलोड करना होगा। यदि आपको कई मॉडलों का उपयोग करने की आवश्यकता है, तो उन्हें कॉमा द्वारा अलग करने की सलाह दी जाती है। हमारे उदाहरण में, हम ओसीआर मॉडल का उपयोग करते हैं, और बाकी का नाम प्रलेखन में पाया जा सकता है।
<application ...> ... <meta-data android:name="com.google.firebase.ml.vision.DEPENDENCIES" android:value="ocr" /> <!-- To use multiple models: android:value="ocr,model2,model3" --> </application>
प्रोजेक्ट कॉन्फ़िगरेशन के बाद, आपको इनपुट मान सेट करना होगा। ML किट FirebaseVisionImage प्रकार के साथ काम करती है, हमारे पास पाँच विधियाँ हैं, जिनमें से हस्ताक्षर मैंने नीचे लिखे थे। वे सामान्य प्रकार के एंड्रॉइड और जावा को एमएल किट के प्रकारों में परिवर्तित करते हैं, जिसके साथ काम करना सुविधाजनक है।
fun fromMediaImage(image: Image, rotation: Int): FirebaseVisionImage fun fromBitmap(bitmap: Bitmap): FirebaseVisionImage fun fromFilePath(context: Context, uri: Uri): FirebaseVisionImage fun fromByteBuffer( byteBuffer: ByteBuffer, metadata: FirebaseVisionImageMetadata ): FirebaseVisionImage fun fromByteArray( bytes: ByteArray, metadata: FirebaseVisionImageMetadata ): FirebaseVisionImage
अंतिम दो पर ध्यान दें - वे बाइट्स की एक सरणी के साथ और बाइट बफर के साथ काम करते हैं, और हमें मेटाडेटा निर्दिष्ट करने की आवश्यकता है ताकि एमएल किट समझें कि यह सब कैसे संभालना है। मेटाडेटा, वास्तव में, प्रारूप का वर्णन करता है, इस मामले में, चौड़ाई और ऊंचाई, डिफ़ॉल्ट प्रारूप, IMAGE_FORMAT_NV21 और रोटेशन।
val metadata = FirebaseVisionImageMetadata.Builder() .setWidth(480) .setHeight(360) .setFormat(FirebaseVisionImageMetadata.IMAGE_FORMAT_NV21) .setRotation(rotation) .build() val image = FirebaseVisionImage.fromByteBuffer(buffer, metadata)
जब इनपुट डेटा एकत्र किया जाता है, तो एक डिटेक्टर बनाएं जो पाठ को पहचान लेगा।
डिवाइस पर और क्लाउड में दो प्रकार के डिटेक्टर होते हैं, उन्हें एक पंक्ति में शाब्दिक रूप से बनाया जाता है। यह ध्यान देने योग्य है कि डिवाइस पर डिटेक्टर केवल अंग्रेजी के साथ काम करता है। क्लाउड डिटेक्टर 20 से अधिक भाषाओं का समर्थन करता है, उन्हें विशेष सेटलंगेजहिंट विधि में निर्दिष्ट किया जाना चाहिए।
समर्थित भाषाओं की संख्या 20 से अधिक है, वे सभी आधिकारिक वेबसाइट पर हैं। हमारे उदाहरण में, केवल अंग्रेजी और रूसी।
आपके पास इनपुट और एक डिटेक्टर होने के बाद, बस इस डिटेक्टर पर processImage विधि को कॉल करें। हमें एक कार्य के रूप में परिणाम मिलता है, जिस पर हम दो कॉलबैक लटकाते हैं - सफलता के लिए और त्रुटि के लिए। मानक छूट एक त्रुटि के लिए आता है, और FirebaseVisionText प्रकार onSuccessListener से सफलता के लिए आता है।
val result: Task<FirebaseVisionText> = detector.processImage(image) .addOnSuccessListener { result: FirebaseVisionText ->
प्रकार के साथ काम कैसे करें FirebaseVisionText?
इसमें टेक्स्ट ब्लॉक (टेक्स्टब्लॉक) शामिल हैं, जो बदले में लाइनों (लाइन), और तत्वों की रेखाओं (तत्व) से मिलकर बने होते हैं। वे एक दूसरे में निहित हैं।
इसके अलावा, इन वर्गों में से प्रत्येक में पाँच विधियाँ हैं जो ऑब्जेक्ट के बारे में अलग-अलग डेटा लौटाती हैं। एक आयत वह क्षेत्र है जहां पाठ स्थित है, आत्मविश्वास मान्यता प्राप्त पाठ की सटीकता है, कोने बिंदु दक्षिणावर्त हैं, ऊपरी बाएं कोने से शुरू होता है, मान्यता प्राप्त भाषाएं और स्वयं पाठ।
FirebaseVisionText contains a list of FirebaseVisionText.TextBlock which contains a list of FirebaseVisionText.Line which is composed of a list of FirebaseVisionText.Element. fun getBoundingBox(): Rect
यह किस लिए है?
हम चित्र और उसके अलग-अलग अनुच्छेदों, टुकड़ों, रेखाओं या सिर्फ शब्दों में पूरे पाठ को पहचान सकते हैं। और एक उदाहरण के रूप में, हम प्रत्येक चरण में एक पाठ ले सकते हैं, इस पाठ की सीमाओं को ले सकते हैं, और आकर्षित कर सकते हैं। बहुत सहज है।
हम अपने आवेदन में इस उपकरण का उपयोग बैंक कार्ड को पहचानने के लिए करते हैं, जिन पर लेबल गैर-मानक स्थित हैं। सभी कार्ड मान्यता पुस्तकालय अच्छी तरह से काम नहीं करते हैं, और कस्टम कार्ड के लिए एमएल किट बहुत उपयोगी होगी। चूंकि थोड़ा पाठ है, इसलिए इस तरह से प्रक्रिया करना बहुत आसान है।
फोटो में वस्तुओं की पहचान

एक उदाहरण के रूप में निम्नलिखित टूल का उपयोग करना, मैं यह दिखाना चाहूंगा कि ऑपरेशन का सिद्धांत लगभग समान है। इस मामले में, वस्तु पर दर्शाया गया है की मान्यता। हम दो डिटेक्टर भी बनाते हैं, एक डिवाइस पर, दूसरा क्लाउड पर, हम मापदंडों के रूप में न्यूनतम सटीकता निर्दिष्ट कर सकते हैं। डिफ़ॉल्ट 0.5 है, 0.7 इंगित किया गया है, और जाने के लिए तैयार है। हमें परिणाम FirebaseImageLabel के रूप में भी मिलता है, यह लेबल की एक सूची है, जिसमें से प्रत्येक में एक आईडी, विवरण और सटीकता शामिल है।
हेरोल्ड खुशी छुपा रहा है

आप समझने की कोशिश कर सकते हैं कि हेरोल्ड दर्द को कितनी अच्छी तरह छिपाता है और क्या वह एक ही समय में खुश है। हम एक चेहरा पहचान उपकरण का उपयोग करते हैं, जो चेहरे की विशेषताओं को पहचानने के अलावा, यह बता सकता है कि कोई व्यक्ति कितना खुश है। जैसा कि यह निकला, हेरोल्ड 93% खुश है। या वह दर्द को बहुत अच्छी तरह से छुपाता है।

आसान से आसान, लेकिन थोड़ा और अधिक जटिल। कस्टम मॉडल।
कार्य: फोटो में दर्शाया गया है का वर्गीकरण।
मैंने लैपटॉप की एक तस्वीर ली और मॉडेम, डेस्कटॉप कंप्यूटर और कीबोर्ड को पहचान लिया। सच लगता है। एक हजार क्लासिफायर हैं, और वह उनमें से तीन लेता है जो इस तस्वीर का सबसे अच्छा वर्णन करते हैं।

कस्टम मॉडल के साथ काम करते समय, हम उनके साथ डिवाइस पर और क्लाउड के माध्यम से भी काम कर सकते हैं।
यदि हम क्लाउड के माध्यम से काम करते हैं, तो आपको फायरबेस कंसोल, एमएल किट टैब और कस्टम टैप पर जाना होगा, जहां हम अपने मॉडल को टेन्सरफ्लो लाइट में अपलोड कर सकते हैं, क्योंकि एमएल किट इस संकल्प के साथ मॉडल के साथ काम करता है। यदि हम इसे किसी डिवाइस पर उपयोग करते हैं, तो हम मॉडल को प्रोजेक्ट के किसी भी हिस्से में एक परिसंपत्ति के रूप में रख सकते हैं।

हम दुभाषिया पर निर्भरता को इंगित करते हैं, जो कस्टम मॉडल के साथ काम कर सकते हैं, और इंटरनेट के साथ काम करने की अनुमति के बारे में मत भूलना।
<uses-permission android:name="android.permission.INTERNET" /> dependencies {
उन मॉडलों के लिए जो डिवाइस पर हैं, आपको ग्रैडल में संकेत करना होगा कि मॉडल को संकुचित नहीं किया जाना चाहिए, क्योंकि यह विकृत हो सकता है।
android {
जब हमने अपने वातावरण में सब कुछ कॉन्फ़िगर किया है, तो हमें विशेष परिस्थितियों को सेट करना होगा, जिसमें शामिल हैं, उदाहरण के लिए, वाई-फाई के उपयोग के लिए भी चार्जिंग की आवश्यकता होती है और एंड्रॉइड एन के साथ डिवाइस निष्क्रिय उपलब्ध होते हैं - इन स्थितियों से संकेत मिलता है कि फोन चार्ज हो रहा है या स्टैंडबाय मोड में है।
var conditionsBuilder: FirebaseModelDownloadConditions.Builder = FirebaseModelDownloadConditions.Builder().requireWifi() if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
जब हम एक रिमोट मॉडल बनाते हैं, तो हम इनिशियलाइज़ेशन और अपडेट की शर्तों को सेट करते हैं, साथ ही फ्लैग को कहते हैं कि क्या हमारा मॉडल अपडेट होना चाहिए। मॉडल का नाम हमें उसी से मेल खाना चाहिए जिसे हमने फायरबेस कंसोल में निर्दिष्ट किया है। जब हमने रिमोट मॉडल बनाया, तो हमें इसे फायरबेस मॉडल मैनेजर में पंजीकृत करना चाहिए।
val cloudSource: FirebaseRemoteModel = FirebaseRemoteModel.Builder("my_cloud_model") .enableModelUpdates(true) .setInitialDownloadConditions(conditions) .setUpdatesDownloadConditions(conditions) .build() FirebaseModelManager.getInstance().registerRemoteModel(cloudSource)
हम स्थानीय मॉडल के लिए एक ही चरण करते हैं, इसका नाम, मॉडल का पथ निर्दिष्ट करते हैं, और फायरबेस मॉडल प्रबंधक में इसे पंजीकृत करते हैं।
val localSource: FirebaseLocalModel = FirebaseLocalModel.Builder("my_local_model") .setAssetFilePath("my_model.tflite") .build() FirebaseModelManager.getInstance().registerLocalModel(localSource)
उसके बाद, आपको ऐसे विकल्प बनाने की आवश्यकता है जहां हम अपने मॉडल के नाम निर्दिष्ट करते हैं, दूरस्थ मॉडल स्थापित करते हैं, स्थानीय मॉडल स्थापित करते हैं और इन विकल्पों के साथ एक दुभाषिया बनाते हैं। हम या तो एक दूरस्थ मॉडल, या केवल एक स्थानीय एक निर्दिष्ट कर सकते हैं, और दुभाषिया खुद समझ जाएगा कि किसके साथ काम करना है।
val options: FirebaseModelOptions = FirebaseModelOptions.Builder() .setRemoteModelName("my_cloud_model") .setLocalModelName("my_local_model") .build() val interpreter = FirebaseModelInterpreter.getInstance(options)
एमएल किट को कस्टम मॉडल के इनपुट और आउटपुट डेटा के प्रारूप के बारे में कुछ भी नहीं पता है, इसलिए आपको उन्हें निर्दिष्ट करने की आवश्यकता है।
इनपुट डेटा एक बहुआयामी सरणी है, जहां 1 छवियों की संख्या है, 224x224 संकल्प है, और 3 एक तीन-चैनल आरजीबी छवि है। खैर, डेटा प्रकार बाइट्स है।
val input = intArrayOf(1, 224, 224, 3)
आउटपुट मान 1000 क्लासीफायर हैं। हम निर्दिष्ट बहुआयामी सरणियों के साथ बाइट्स में इनपुट और आउटपुट मान का प्रारूप सेट करते हैं। बाइट्स के अलावा, फ्लोट, लॉन्ग, इंट भी उपलब्ध हैं।
अब हम इनपुट मान सेट करते हैं। हम बिटमैप लेते हैं, इसे 224 से 224 तक संपीड़ित करते हैं, इसे बाइटबफ़र में परिवर्तित करते हैं और एक विशेष बिल्डर का उपयोग करके फायरबेसमॉडेल इनपुट का उपयोग करके इनपुट मान बनाते हैं।
val bitmap = Bitmap.createScaledBitmap(yourInputImage, 224, 224, true) val imgData = convertBitmapToByteBuffer(bitmap) val inputs: FirebaseModelInputs = FirebaseModelInputs.Builder() .add(imageData) .build()
और अब, जब एक दुभाषिया होता है, तो इनपुट और आउटपुट मानों का प्रारूप और इनपुट मान स्वयं, हम रन विधि का उपयोग करके अनुरोध को निष्पादित कर सकते हैं। हम उपरोक्त सभी को मापदंडों के रूप में स्थानांतरित करते हैं, और परिणामस्वरूप हमें FirebaseModelOutput मिलता है, जिसके अंदर हमारे द्वारा निर्दिष्ट प्रकार का एक जेनेरिक होता है। इस मामले में, यह एक बाइट सरणी था, जिसके बाद हम प्रसंस्करण शुरू कर सकते हैं। यह ठीक उसी हजार क्लासिफायर हैं जो हमने अनुरोध किए थे, और हम प्रदर्शित करते हैं, उदाहरण के लिए, शीर्ष 3 सबसे उपयुक्त।
interpreter.run(inputs, inputOutputOptions) .addOnSuccessListener { result: FirebaseModelOutputs -> val labelProbArray = result.getOutput<Array<ByteArray>>(0)
एक दिन कार्यान्वयन
सब कुछ लागू करने में काफी आसान है, और अंतर्निहित उपकरणों के साथ वस्तुओं की मान्यता केवल एक दिन में महसूस की जा सकती है। यह टूल iOS और Android पर उपलब्ध है, इसके अलावा, आप दोनों प्लेटफॉर्म के लिए एक ही TensorFlow मॉडल का उपयोग कर सकते हैं।
इसके अलावा, बॉक्स के कई तरीके उपलब्ध हैं जो कई मामलों को कवर कर सकते हैं। अधिकांश एपीआई डिवाइस पर उपलब्ध हैं, अर्थात, इंटरनेट के बिना भी मान्यता काम करेगी।
और सबसे महत्वपूर्ण बात - कस्टम मॉडलों के लिए समर्थन जो किसी भी कार्य के लिए पसंद किए जा सकते हैं।
उपयोगी लिंक
एमएल किट प्रलेखन
जीथब एमएल किट डेमो प्रोजेक्ट
फायरबेस के साथ मोबाइल के लिए मशीन सीखना (Google I / O'19)
मोबाइल डेवलपर्स के लिए मशीन लर्निंग SDK (Google I / O'18)
Firebase ML Kit (Medium.com) का उपयोग करके क्रेडिट कार्ड स्कैनर बनाना