ऑटोएमएल विज़न एज का उपयोग करके अपने स्वयं के मॉडल को प्रशिक्षित करने के बाद, आप छवियों में वस्तुओं का पता लगाने के लिए इसे अपने ऐप में उपयोग कर सकते हैं।
ऑटोएमएल विज़न एज से प्रशिक्षित मॉडल को एकीकृत करने के दो तरीके हैं: आप मॉडल को अपने ऐप के एसेट फ़ोल्डर के अंदर रखकर बंडल कर सकते हैं, या आप इसे फ़ायरबेस से गतिशील रूप से डाउनलोड कर सकते हैं।
मॉडल बंडलिंग विकल्प | |
---|---|
आपके ऐप में बंडल किया गया |
|
फायरबेस के साथ होस्ट किया गया |
|
शुरू करने से पहले
यदि आप कोई मॉडल डाउनलोड करना चाहते हैं , तो सुनिश्चित करें कि आपने अपने एंड्रॉइड प्रोजेक्ट में फायरबेस जोड़ा है , यदि आपने पहले से ऐसा नहीं किया है। जब आप मॉडल को बंडल करते हैं तो इसकी आवश्यकता नहीं होती है।
TensorFlow Lite Task लाइब्रेरी के लिए निर्भरताएँ अपने मॉड्यूल की ऐप-स्तरीय ग्रेडल फ़ाइल में जोड़ें, जो आमतौर पर
app/build.gradle
है:किसी मॉडल को अपने ऐप के साथ बंडल करने के लिए:
dependencies { // ... // Object detection with a bundled Auto ML model implementation 'org.tensorflow:tensorflow-lite-task-vision:0.0.0-nightly-SNAPSHOT' }
फ़ायरबेस से किसी मॉडल को गतिशील रूप से डाउनलोड करने के लिए, फ़ायरबेस एमएल निर्भरता भी जोड़ें:
dependencies { // ... // Object detection with an Auto ML model deployed to Firebase implementation platform('com.google.firebase:firebase-bom:26.1.1') implementation 'com.google.firebase:firebase-ml-model-interpreter' implementation 'org.tensorflow:tensorflow-lite-task-vision:0.0.0-nightly' }
1. मॉडल लोड करें
स्थानीय मॉडल स्रोत कॉन्फ़िगर करें
मॉडल को अपने ऐप के साथ बंडल करने के लिए:
- Google क्लाउड कंसोल से डाउनलोड किए गए ज़िप संग्रह से मॉडल निकालें।
- अपने मॉडल को अपने ऐप पैकेज में शामिल करें:
- यदि आपके प्रोजेक्ट में एसेट फ़ोल्डर नहीं है, तो
app/
फ़ोल्डर पर राइट-क्लिक करके एक बनाएं, फिर न्यू > फ़ोल्डर > एसेट फ़ोल्डर पर क्लिक करें। - एम्बेडेड मेटाडेटा के साथ अपनी
tflite
मॉडल फ़ाइल को संपत्ति फ़ोल्डर में कॉपी करें।
- यदि आपके प्रोजेक्ट में एसेट फ़ोल्डर नहीं है, तो
यह सुनिश्चित करने के लिए कि ऐप बनाते समय ग्रैडल मॉडल फ़ाइल को संपीड़ित नहीं करता है, अपने ऐप की
build.gradle
फ़ाइल में निम्नलिखित जोड़ें:android { // ... aaptOptions { noCompress "tflite" } }
मॉडल फ़ाइल को ऐप पैकेज में शामिल किया जाएगा और कच्ची संपत्ति के रूप में उपलब्ध कराया जाएगा।
फ़ायरबेस-होस्टेड मॉडल स्रोत कॉन्फ़िगर करें
दूरस्थ रूप से होस्ट किए गए मॉडल का उपयोग करने के लिए, एक RemoteModel
ऑब्जेक्ट बनाएं, जिसमें मॉडल को प्रकाशित करते समय आपने जो नाम निर्दिष्ट किया था उसे निर्दिष्ट करें:
जावा
// Specify the name you assigned when you deployed the model.
FirebaseCustomRemoteModel remoteModel =
new FirebaseCustomRemoteModel.Builder("your_model").build();
Kotlin
// Specify the name you assigned when you deployed the model.
val remoteModel =
FirebaseCustomRemoteModel.Builder("your_model_name").build()
फिर, उन शर्तों को निर्दिष्ट करते हुए मॉडल डाउनलोड कार्य शुरू करें जिनके तहत आप डाउनलोड करने की अनुमति देना चाहते हैं। यदि मॉडल डिवाइस पर नहीं है, या यदि मॉडल का एक नया संस्करण उपलब्ध है, तो कार्य फायरबेस से मॉडल को एसिंक्रोनस रूप से डाउनलोड करेगा:
जावा
DownloadConditions downloadConditions = new DownloadConditions.Builder()
.requireWifi()
.build();
RemoteModelManager.getInstance().download(remoteModel, downloadConditions)
.addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(@NonNull Task<Void> task) {
// Success.
}
});
Kotlin
val downloadConditions = DownloadConditions.Builder()
.requireWifi()
.build()
RemoteModelManager.getInstance().download(remoteModel, downloadConditions)
.addOnSuccessListener {
// Success.
}
कई ऐप्स अपने इनिशियलाइज़ेशन कोड में डाउनलोड कार्य शुरू करते हैं, लेकिन आप मॉडल का उपयोग करने से पहले किसी भी समय ऐसा कर सकते हैं।
अपने मॉडल से एक ऑब्जेक्ट डिटेक्टर बनाएं
अपने मॉडल स्रोतों को कॉन्फ़िगर करने के बाद, उनमें से किसी एक से ObjectDetector
ऑब्जेक्ट बनाएं।
यदि आपके पास केवल स्थानीय रूप से बंडल किया गया मॉडल है, तो बस अपनी मॉडल फ़ाइल से एक ऑब्जेक्ट डिटेक्टर बनाएं और उस आत्मविश्वास स्कोर सीमा को कॉन्फ़िगर करें जिसकी आप आवश्यकता चाहते हैं ( अपने मॉडल का मूल्यांकन करें देखें):
जावा
// Initialization
ObjectDetectorOptions options = ObjectDetectorOptions.builder()
.setScoreThreshold(0) // Evaluate your model in the Google Cloud console
// to determine an appropriate value.
.build();
ObjectDetector objectDetector = ObjectDetector.createFromFileAndOptions(context, modelFile, options);
Kotlin
// Initialization
val options = ObjectDetectorOptions.builder()
.setScoreThreshold(0) // Evaluate your model in the Google Cloud console
// to determine an appropriate value.
.build()
val objectDetector = ObjectDetector.createFromFileAndOptions(context, modelFile, options)
यदि आपके पास दूरस्थ रूप से होस्ट किया गया मॉडल है, तो आपको इसे चलाने से पहले यह जांचना होगा कि इसे डाउनलोड किया गया है। आप मॉडल प्रबंधक की isModelDownloaded()
विधि का उपयोग करके मॉडल डाउनलोड कार्य की स्थिति की जांच कर सकते हैं।
यद्यपि आपको केवल ऑब्जेक्ट डिटेक्टर चलाने से पहले इसकी पुष्टि करनी होगी, यदि आपके पास दूरस्थ रूप से होस्ट किया गया मॉडल और स्थानीय रूप से बंडल किया गया मॉडल दोनों हैं, तो ऑब्जेक्ट डिटेक्टर को इंस्टेंट करते समय यह जांच करना उचित हो सकता है: रिमोट से ऑब्जेक्ट डिटेक्टर बनाएं मॉडल यदि इसे डाउनलोड किया गया है, और अन्यथा स्थानीय मॉडल से।
जावा
FirebaseModelManager.getInstance().isModelDownloaded(remoteModel)
.addOnSuccessListener(new OnSuccessListener<Boolean>() {
@Override
public void onSuccess(Boolean isDownloaded) {
}
});
Kotlin
FirebaseModelManager.getInstance().isModelDownloaded(remoteModel)
.addOnSuccessListener { success ->
}
यदि आपके पास केवल दूरस्थ रूप से होस्ट किया गया मॉडल है, तो आपको मॉडल-संबंधित कार्यक्षमता को अक्षम करना चाहिए - उदाहरण के लिए, अपने यूआई के हिस्से को ग्रे-आउट या छुपाएं - जब तक कि आप पुष्टि न करें कि मॉडल डाउनलोड हो गया है। आप श्रोता को मॉडल प्रबंधक की download()
विधि से जोड़कर ऐसा कर सकते हैं।
एक बार जब आपको पता चल जाए कि आपका मॉडल डाउनलोड हो गया है, तो मॉडल फ़ाइल से एक ऑब्जेक्ट डिटेक्टर बनाएं:
जावा
FirebaseModelManager.getInstance().getLatestModelFile(remoteModel)
.addOnCompleteListener(new OnCompleteListener<File>() {
@Override
public void onComplete(@NonNull Task<File> task) {
File modelFile = task.getResult();
if (modelFile != null) {
ObjectDetectorOptions options = ObjectDetectorOptions.builder()
.setScoreThreshold(0)
.build();
objectDetector = ObjectDetector.createFromFileAndOptions(
getApplicationContext(), modelFile.getPath(), options);
}
}
});
Kotlin
FirebaseModelManager.getInstance().getLatestModelFile(remoteModel)
.addOnSuccessListener { modelFile ->
val options = ObjectDetectorOptions.builder()
.setScoreThreshold(0f)
.build()
objectDetector = ObjectDetector.createFromFileAndOptions(
applicationContext, modelFile.path, options)
}
2. इनपुट छवि तैयार करें
फिर, प्रत्येक छवि के लिए जिसे आप लेबल करना चाहते हैं, अपनी छवि से एक TensorImage
ऑब्जेक्ट बनाएं। आप fromBitmap
विधि का उपयोग करके Bitmap
से एक TensorImage
ऑब्जेक्ट बना सकते हैं:
जावा
TensorImage image = TensorImage.fromBitmap(bitmap);
Kotlin
val image = TensorImage.fromBitmap(bitmap)
यदि आपका छवि डेटा Bitmap
में नहीं है, तो आप एक पिक्सेल सरणी लोड कर सकते हैं जैसा कि TensorFlow Lite डॉक्स में दिखाया गया है।
3. ऑब्जेक्ट डिटेक्टर चलाएँ
किसी छवि में ऑब्जेक्ट का पता लगाने के लिए, TensorImage
ऑब्जेक्ट को ObjectDetector
की detect()
विधि में पास करें।
जावा
List<Detection> results = objectDetector.detect(image);
Kotlin
val results = objectDetector.detect(image)
4. लेबल वाली वस्तुओं के बारे में जानकारी प्राप्त करें
यदि ऑब्जेक्ट डिटेक्शन ऑपरेशन सफल होता है, तो यह Detection
ऑब्जेक्ट्स की एक सूची लौटाता है। प्रत्येक Detection
ऑब्जेक्ट किसी ऐसी चीज़ का प्रतिनिधित्व करता है जो छवि में पाई गई थी। आप प्रत्येक ऑब्जेक्ट का बाउंडिंग बॉक्स और उसके लेबल प्राप्त कर सकते हैं।
उदाहरण के लिए:
जावा
for (Detection result : results) {
RectF bounds = result.getBoundingBox();
List<Category> labels = result.getCategories();
}
Kotlin
for (result in results) {
val bounds = result.getBoundingBox()
val labels = result.getCategories()
}
वास्तविक समय के प्रदर्शन को बेहतर बनाने के लिए युक्तियाँ
यदि आप वास्तविक समय एप्लिकेशन में छवियों को लेबल करना चाहते हैं, तो सर्वोत्तम फ्रैमरेट्स प्राप्त करने के लिए इन दिशानिर्देशों का पालन करें:
- छवि लेबलर को थ्रॉटल कॉल। यदि छवि लेबलर चलने के दौरान कोई नया वीडियो फ़्रेम उपलब्ध हो जाता है, तो फ़्रेम को छोड़ दें। उदाहरण के लिए क्विकस्टार्ट सैंपल ऐप में
VisionProcessorBase
क्लास देखें। - यदि आप इनपुट छवि पर ग्राफ़िक्स को ओवरले करने के लिए छवि लेबलर के आउटपुट का उपयोग कर रहे हैं, तो पहले परिणाम प्राप्त करें, फिर छवि को प्रस्तुत करें और एक ही चरण में ओवरले करें। ऐसा करने से, आप प्रत्येक इनपुट फ़्रेम के लिए केवल एक बार डिस्प्ले सतह पर रेंडर करते हैं। उदाहरण के लिए क्विकस्टार्ट नमूना ऐप में
CameraSourcePreview
औरGraphicOverlay
कक्षाएं देखें। यदि आप कैमरा2 एपीआई का उपयोग करते हैं, तो
ImageFormat.YUV_420_888
प्रारूप में छवियां कैप्चर करें।यदि आप पुराने कैमरा एपीआई का उपयोग करते हैं, तो
ImageFormat.NV21
प्रारूप में छवियां कैप्चर करें।