আপনি একটি ছবিতে সত্তা চিনতে এবং তাদের লেবেল করতে ML কিট ব্যবহার করতে পারেন। এই API কাস্টম ইমেজ শ্রেণীবিভাগ মডেলের বিস্তৃত পরিসর সমর্থন করে। মডেল সামঞ্জস্যের প্রয়োজনীয়তা, কোথায় প্রাক-প্রশিক্ষিত মডেলগুলি খুঁজে পাবেন এবং কীভাবে আপনার নিজের মডেলগুলিকে প্রশিক্ষিত করবেন সে সম্পর্কে নির্দেশনার জন্য অনুগ্রহ করে ML কিট সহ কাস্টম মডেলগুলি দেখুন৷
কাস্টম মডেলের সাথে ইমেজ লেবেলিংকে একীভূত করার দুটি উপায় আছে: আপনার অ্যাপের অংশ হিসেবে পাইপলাইন বান্ডিল করে, অথবা Google Play পরিষেবার উপর নির্ভর করে এমন একটি আনবান্ডেড পাইপলাইন ব্যবহার করে। আপনি যদি আনবান্ডেড পাইপলাইন নির্বাচন করেন তবে আপনার অ্যাপটি ছোট হবে। বিস্তারিত জানার জন্য নীচের টেবিল দেখুন.
বান্ডিল | আনবান্ডেড | |
---|---|---|
লাইব্রেরির নাম | com.google.mlkit:image-labeling-custom | com.google.android.gms:play-services-mlkit-image-labeling-custom |
বাস্তবায়ন | বিল্ড টাইমে আপনার অ্যাপের সাথে পাইপলাইন স্থিরভাবে সংযুক্ত থাকে। | পাইপলাইন গতিশীলভাবে Google Play পরিষেবার মাধ্যমে ডাউনলোড করা হয়। |
অ্যাপের আকার | প্রায় 3.8 MB আকার বৃদ্ধি. | প্রায় 200 KB আকার বৃদ্ধি. |
প্রারম্ভিক সময় | পাইপলাইন অবিলম্বে উপলব্ধ. | প্রথম ব্যবহারের আগে পাইপলাইন ডাউনলোড করার জন্য অপেক্ষা করতে হতে পারে। |
API জীবনচক্র পর্যায় | সাধারণ প্রাপ্যতা (GA) | বেটা |
একটি কাস্টম মডেল সংহত করার দুটি উপায় রয়েছে: মডেলটিকে আপনার অ্যাপের সম্পদ ফোল্ডারের মধ্যে রেখে বান্ডেল করুন বা ফায়ারবেস থেকে গতিশীলভাবে ডাউনলোড করুন৷ নিম্নলিখিত টেবিল এই দুটি বিকল্প তুলনা.
বান্ডিল মডেল | হোস্টেড মডেল |
---|---|
মডেলটি আপনার অ্যাপের APK এর অংশ, যা এর আকার বাড়ায়। | মডেল আপনার APK অংশ নয়. এটি ফায়ারবেস মেশিন লার্নিং -এ আপলোড করে হোস্ট করা হয়। |
Android ডিভাইস অফলাইনে থাকলেও মডেলটি অবিলম্বে উপলব্ধ | মডেলটি চাহিদা অনুযায়ী ডাউনলোড করা হয় |
ফায়ারবেস প্রকল্পের প্রয়োজন নেই | একটি ফায়ারবেস প্রকল্প প্রয়োজন |
মডেল আপডেট করতে আপনাকে অবশ্যই আপনার অ্যাপটি পুনরায় প্রকাশ করতে হবে | আপনার অ্যাপ পুনঃপ্রকাশ না করেই মডেল আপডেট পুশ করুন |
বিল্ট-ইন A/B টেস্টিং নেই | ফায়ারবেস রিমোট কনফিগারেশনের সাথে সহজ A/B টেস্টিং |
চেষ্টা করে দেখুন
- বান্ডিল মডেলের উদাহরণ ব্যবহারের জন্য ভিশন কুইকস্টার্ট অ্যাপ এবং হোস্ট করা মডেলের উদাহরণ ব্যবহারের জন্য অটোএমএল কুইকস্টার্ট অ্যাপ দেখুন।
আপনি শুরু করার আগে
আপনার প্রকল্প-স্তরের
build.gradle
ফাইলে, আপনারbuildscript
এবংallprojects
উভয় বিভাগেই Google-এর Maven সংগ্রহস্থল অন্তর্ভুক্ত করা নিশ্চিত করুন৷আপনার মডিউলের অ্যাপ-লেভেল গ্রেডল ফাইলে এমএল কিট অ্যান্ড্রয়েড লাইব্রেরির নির্ভরতা যোগ করুন, যা সাধারণত
app/build.gradle
হয়। আপনার প্রয়োজনের উপর ভিত্তি করে নিম্নলিখিত নির্ভরতাগুলির মধ্যে একটি চয়ন করুন:আপনার অ্যাপের সাথে পাইপলাইন বান্ডিল করার জন্য:
dependencies { // ... // Use this dependency to bundle the pipeline with your app implementation 'com.google.mlkit:image-labeling-custom:17.0.3' }
Google Play পরিষেবাগুলিতে পাইপলাইন ব্যবহার করার জন্য:
dependencies { // ... // Use this dependency to use the dynamically downloaded pipeline in Google Play Services implementation 'com.google.android.gms:play-services-mlkit-image-labeling-custom:16.0.0-beta5' }
আপনি যদি Google Play পরিষেবাতে পাইপলাইন ব্যবহার করতে চান , তাহলে প্লে স্টোর থেকে আপনার অ্যাপ ইনস্টল হওয়ার পরে আপনি ডিভাইসে পাইপলাইনটি স্বয়ংক্রিয়ভাবে ডাউনলোড করতে আপনার অ্যাপ কনফিগার করতে পারেন। এটি করতে, আপনার অ্যাপের
AndroidManifest.xml
ফাইলে নিম্নলিখিত ঘোষণা যোগ করুন:<application ...> ... <meta-data android:name="com.google.mlkit.vision.DEPENDENCIES" android:value="custom_ica" /> <!-- To use multiple downloads: android:value="custom_ica,download2,download3" --> </application>
এছাড়াও আপনি স্পষ্টভাবে পাইপলাইনের উপলব্ধতা পরীক্ষা করতে পারেন এবং Google Play পরিষেবা ModuleInstallClient API- এর মাধ্যমে ডাউনলোডের অনুরোধ করতে পারেন।
আপনি যদি ইনস্টল-টাইম পাইপলাইন ডাউনলোডগুলি সক্ষম না করেন বা স্পষ্ট ডাউনলোডের অনুরোধ না করেন, আপনি প্রথমবার লেবেলার চালানোর সময় পাইপলাইনটি ডাউনলোড হবে৷ ডাউনলোড সম্পূর্ণ হওয়ার আগে আপনি যে অনুরোধগুলি করেন তা কোনও ফলাফল দেয় না।
আপনি যদি ফায়ারবেস থেকে একটি মডেলকে গতিশীলভাবে ডাউনলোড করতে চান তাহলে
linkFirebase
নির্ভরতা যোগ করুন:ফায়ারবেস থেকে গতিশীলভাবে একটি মডেল ডাউনলোড করার জন্য,
linkFirebase
নির্ভরতা যোগ করুন:dependencies { // ... // Image labeling feature with model downloaded from Firebase implementation 'com.google.mlkit:image-labeling-custom:17.0.3' // Or use the dynamically downloaded pipeline in Google Play Services // implementation 'com.google.android.gms:play-services-mlkit-image-labeling-custom:16.0.0-beta5' implementation 'com.google.mlkit:linkfirebase:17.0.0' }
আপনি যদি একটি মডেল ডাউনলোড করতে চান , তাহলে নিশ্চিত করুন যে আপনি আপনার Android প্রকল্পে Firebase যোগ করেছেন , যদি আপনি ইতিমধ্যে তা না করে থাকেন। আপনি মডেল বান্ডিল যখন এটি প্রয়োজন হয় না.
1. মডেল লোড করুন
একটি স্থানীয় মডেল উৎস কনফিগার করুন
আপনার অ্যাপের সাথে মডেল বান্ডিল করতে:
মডেল ফাইলটি কপি করুন (সাধারণত
.tflite
বা.lite
এ শেষ হয়) আপনার অ্যাপেরassets/
ফোল্ডারে। (আপনাকে প্রথমেapp/
ফোল্ডারটিতে ডান-ক্লিক করে, তারপর নতুন > ফোল্ডার > সম্পদ ফোল্ডারে ক্লিক করে ফোল্ডারটি তৈরি করতে হতে পারে।)তারপরে, অ্যাপ তৈরি করার সময় Gradle মডেল ফাইলটি সংকুচিত না করে তা নিশ্চিত করতে আপনার অ্যাপের
build.gradle
ফাইলে নিম্নলিখিতগুলি যোগ করুন:android { // ... aaptOptions { noCompress "tflite" // or noCompress "lite" } }
মডেল ফাইলটি অ্যাপ প্যাকেজে অন্তর্ভুক্ত করা হবে এবং একটি কাঁচা সম্পদ হিসাবে ML কিটের কাছে উপলব্ধ হবে৷
মডেল ফাইলের পাথ নির্দিষ্ট করে
LocalModel
অবজেক্ট তৈরি করুন:কোটলিন
val localModel = LocalModel.Builder() .setAssetFilePath("model.tflite") // or .setAbsoluteFilePath(absolute file path to model file) // or .setUri(URI to model file) .build()
জাভা
LocalModel localModel = new LocalModel.Builder() .setAssetFilePath("model.tflite") // or .setAbsoluteFilePath(absolute file path to model file) // or .setUri(URI to model file) .build();
একটি Firebase-হোস্টেড মডেল উৎস কনফিগার করুন
দূরবর্তীভাবে হোস্ট করা মডেলটি ব্যবহার করতে, FirebaseModelSource
দ্বারা একটি RemoteModel
অবজেক্ট তৈরি করুন, আপনি যখন এটি প্রকাশ করেছিলেন তখন আপনি মডেলটিকে যে নামটি নির্ধারণ করেছিলেন তা উল্লেখ করে:
কোটলিন
// Specify the name you assigned in the Firebase console. val remoteModel = CustomRemoteModel .Builder(FirebaseModelSource.Builder("your_model_name").build()) .build()
জাভা
// Specify the name you assigned in the Firebase console. CustomRemoteModel remoteModel = new CustomRemoteModel .Builder(new FirebaseModelSource.Builder("your_model_name").build()) .build();
তারপরে, আপনি যে শর্তে ডাউনলোড করার অনুমতি দিতে চান তা উল্লেখ করে মডেল ডাউনলোড টাস্ক শুরু করুন। যদি মডেলটি ডিভাইসে না থাকে, বা মডেলটির একটি নতুন সংস্করণ উপলব্ধ থাকলে, টাস্কটি অসিঙ্ক্রোনাসভাবে Firebase থেকে মডেলটি ডাউনলোড করবে:
কোটলিন
val downloadConditions = DownloadConditions.Builder() .requireWifi() .build() RemoteModelManager.getInstance().download(remoteModel, downloadConditions) .addOnSuccessListener { // Success. }
জাভা
DownloadConditions downloadConditions = new DownloadConditions.Builder() .requireWifi() .build(); RemoteModelManager.getInstance().download(remoteModel, downloadConditions) .addOnSuccessListener(new OnSuccessListener() { @Override public void onSuccess(@NonNull Task task) { // Success. } });
অনেক অ্যাপ তাদের ইনিশিয়ালাইজেশন কোডে ডাউনলোড টাস্ক শুরু করে, কিন্তু মডেল ব্যবহার করার আগে আপনি যেকোন সময়ে তা করতে পারেন।
ইমেজ লেবেলার কনফিগার করুন
আপনি আপনার মডেল উত্সগুলি কনফিগার করার পরে, তাদের মধ্যে একটি থেকে একটি ImageLabeler
অবজেক্ট তৈরি করুন৷
নিম্নলিখিত বিকল্পগুলি উপলব্ধ:
অপশন | |
---|---|
confidenceThreshold | শনাক্ত করা লেবেলের ন্যূনতম কনফিডেন্স স্কোর। সেট করা না থাকলে, মডেলের মেটাডেটা দ্বারা নির্দিষ্ট করা কোনো ক্লাসিফায়ার থ্রেশহোল্ড ব্যবহার করা হবে। যদি মডেলটিতে কোনো মেটাডেটা না থাকে বা মেটাডেটা কোনো শ্রেণীবদ্ধ থ্রেশহোল্ড নির্দিষ্ট না করে, তাহলে 0.0 এর একটি ডিফল্ট থ্রেশহোল্ড ব্যবহার করা হবে। |
maxResultCount | ফেরত দিতে লেবেলের সর্বাধিক সংখ্যা৷ যদি সেট না করা হয়, 10 এর ডিফল্ট মান ব্যবহার করা হবে। |
আপনার যদি শুধুমাত্র স্থানীয়ভাবে বান্ডিল করা মডেল থাকে, তাহলে শুধু আপনার LocalModel
অবজেক্ট থেকে একটি লেবেলার তৈরি করুন:
কোটলিন
val customImageLabelerOptions = CustomImageLabelerOptions.Builder(localModel) .setConfidenceThreshold(0.5f) .setMaxResultCount(5) .build() val labeler = ImageLabeling.getClient(customImageLabelerOptions)
জাভা
CustomImageLabelerOptions customImageLabelerOptions = new CustomImageLabelerOptions.Builder(localModel) .setConfidenceThreshold(0.5f) .setMaxResultCount(5) .build(); ImageLabeler labeler = ImageLabeling.getClient(customImageLabelerOptions);
আপনার যদি দূরবর্তীভাবে-হোস্ট করা মডেল থাকে, তাহলে আপনাকে এটি চালানোর আগে এটি ডাউনলোড করা হয়েছে কিনা তা পরীক্ষা করতে হবে। আপনি মডেল ম্যানেজারের isModelDownloaded()
পদ্ধতি ব্যবহার করে মডেল ডাউনলোড টাস্কের স্থিতি পরীক্ষা করতে পারেন।
যদিও লেবেলারটি চালানোর আগে আপনাকে শুধুমাত্র এটি নিশ্চিত করতে হবে, যদি আপনার কাছে দূরবর্তীভাবে-হোস্ট করা মডেল এবং স্থানীয়ভাবে-বান্ডেল করা মডেল উভয়ই থাকে, তাহলে ইমেজ লেবেলারকে ইনস্ট্যান্টিয়েট করার সময় এই চেকটি সম্পাদন করা বোধগম্য হতে পারে: যদি দূরবর্তী মডেল থেকে একটি লেবেলার তৈরি করুন এটি ডাউনলোড করা হয়েছে, এবং অন্যথায় স্থানীয় মডেল থেকে।
কোটলিন
RemoteModelManager.getInstance().isModelDownloaded(remoteModel) .addOnSuccessListener { isDownloaded -> val optionsBuilder = if (isDownloaded) { CustomImageLabelerOptions.Builder(remoteModel) } else { CustomImageLabelerOptions.Builder(localModel) } val options = optionsBuilder .setConfidenceThreshold(0.5f) .setMaxResultCount(5) .build() val labeler = ImageLabeling.getClient(options) }
জাভা
RemoteModelManager.getInstance().isModelDownloaded(remoteModel) .addOnSuccessListener(new OnSuccessListener() { @Override public void onSuccess(Boolean isDownloaded) { CustomImageLabelerOptions.Builder optionsBuilder; if (isDownloaded) { optionsBuilder = new CustomImageLabelerOptions.Builder(remoteModel); } else { optionsBuilder = new CustomImageLabelerOptions.Builder(localModel); } CustomImageLabelerOptions options = optionsBuilder .setConfidenceThreshold(0.5f) .setMaxResultCount(5) .build(); ImageLabeler labeler = ImageLabeling.getClient(options); } });
যদি আপনার কাছে শুধুমাত্র একটি দূরবর্তীভাবে হোস্ট করা মডেল থাকে, তাহলে আপনি মডেল-সম্পর্কিত কার্যকারিতা অক্ষম করুন-উদাহরণস্বরূপ, আপনার UI-এর ধূসর-আউট বা অংশ লুকান-যতক্ষণ না আপনি নিশ্চিত করেন যে মডেলটি ডাউনলোড করা হয়েছে। আপনি মডেল ম্যানেজারের download()
পদ্ধতিতে একজন শ্রোতাকে সংযুক্ত করে এটি করতে পারেন:
কোটলিন
RemoteModelManager.getInstance().download(remoteModel, conditions) .addOnSuccessListener { // Download complete. Depending on your app, you could enable the ML // feature, or switch from the local model to the remote model, etc. }
জাভা
RemoteModelManager.getInstance().download(remoteModel, conditions) .addOnSuccessListener(new OnSuccessListener() { @Override public void onSuccess(Void v) { // Download complete. Depending on your app, you could enable // the ML feature, or switch from the local model to the remote // model, etc. } });
2. ইনপুট ইমেজ প্রস্তুত করুন
তারপর, আপনি লেবেল করতে চান এমন প্রতিটি ছবির জন্য, আপনার ছবি থেকে একটিInputImage
অবজেক্ট তৈরি করুন। যখন আপনি একটি Bitmap
ব্যবহার করেন বা, যদি আপনি ক্যামেরা2 API, একটি YUV_420_888 media.Image
ব্যবহার করেন তখন ইমেজ লেবেলারটি দ্রুত চলে। আপনি বিভিন্ন উত্স থেকে একটি InputImage
অবজেক্ট তৈরি করতে পারেন, প্রতিটি নীচে ব্যাখ্যা করা হয়েছে৷
একটি media.Image
ব্যবহার করে. ইমেজ
একটি media.Image
থেকে একটি InputImage
অবজেক্ট তৈরি করতে। ইমেজ অবজেক্ট, যেমন আপনি যখন একটি ডিভাইসের ক্যামেরা থেকে একটি ইমেজ ক্যাপচার করেন, তখন media.Image
পাস করুন। ইমেজ অবজেক্ট এবং ইমেজের রোটেশন InputImage.fromMediaImage()
এ।
আপনি যদি CameraX লাইব্রেরি ব্যবহার করেন, OnImageCapturedListener
এবং ImageAnalysis.Analyzer
ক্লাসগুলি আপনার জন্য ঘূর্ণন মান গণনা করে৷
কোটলিন
private class YourImageAnalyzer : ImageAnalysis.Analyzer { override fun analyze(imageProxy: ImageProxy) { val mediaImage = imageProxy.image if (mediaImage != null) { val image = InputImage.fromMediaImage(mediaImage, imageProxy.imageInfo.rotationDegrees) // Pass image to an ML Kit Vision API // ... } } }
জাভা
private class YourAnalyzer implements ImageAnalysis.Analyzer { @Override public void analyze(ImageProxy imageProxy) { Image mediaImage = imageProxy.getImage(); if (mediaImage != null) { InputImage image = InputImage.fromMediaImage(mediaImage, imageProxy.getImageInfo().getRotationDegrees()); // Pass image to an ML Kit Vision API // ... } } }
আপনি যদি এমন একটি ক্যামেরা লাইব্রেরি ব্যবহার না করেন যা আপনাকে চিত্রের ঘূর্ণন ডিগ্রী দেয়, আপনি ডিভাইসের ঘূর্ণন ডিগ্রী এবং ডিভাইসে ক্যামেরা সেন্সরের অভিযোজন থেকে এটি গণনা করতে পারেন:
কোটলিন
private val ORIENTATIONS = SparseIntArray() init { ORIENTATIONS.append(Surface.ROTATION_0, 0) ORIENTATIONS.append(Surface.ROTATION_90, 90) ORIENTATIONS.append(Surface.ROTATION_180, 180) ORIENTATIONS.append(Surface.ROTATION_270, 270) } /** * Get the angle by which an image must be rotated given the device's current * orientation. */ @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) @Throws(CameraAccessException::class) private fun getRotationCompensation(cameraId: String, activity: Activity, isFrontFacing: Boolean): Int { // Get the device's current rotation relative to its "native" orientation. // Then, from the ORIENTATIONS table, look up the angle the image must be // rotated to compensate for the device's rotation. val deviceRotation = activity.windowManager.defaultDisplay.rotation var rotationCompensation = ORIENTATIONS.get(deviceRotation) // Get the device's sensor orientation. val cameraManager = activity.getSystemService(CAMERA_SERVICE) as CameraManager val sensorOrientation = cameraManager .getCameraCharacteristics(cameraId) .get(CameraCharacteristics.SENSOR_ORIENTATION)!! if (isFrontFacing) { rotationCompensation = (sensorOrientation + rotationCompensation) % 360 } else { // back-facing rotationCompensation = (sensorOrientation - rotationCompensation + 360) % 360 } return rotationCompensation }
জাভা
private static final SparseIntArray ORIENTATIONS = new SparseIntArray(); static { ORIENTATIONS.append(Surface.ROTATION_0, 0); ORIENTATIONS.append(Surface.ROTATION_90, 90); ORIENTATIONS.append(Surface.ROTATION_180, 180); ORIENTATIONS.append(Surface.ROTATION_270, 270); } /** * Get the angle by which an image must be rotated given the device's current * orientation. */ @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) private int getRotationCompensation(String cameraId, Activity activity, boolean isFrontFacing) throws CameraAccessException { // Get the device's current rotation relative to its "native" orientation. // Then, from the ORIENTATIONS table, look up the angle the image must be // rotated to compensate for the device's rotation. int deviceRotation = activity.getWindowManager().getDefaultDisplay().getRotation(); int rotationCompensation = ORIENTATIONS.get(deviceRotation); // Get the device's sensor orientation. CameraManager cameraManager = (CameraManager) activity.getSystemService(CAMERA_SERVICE); int sensorOrientation = cameraManager .getCameraCharacteristics(cameraId) .get(CameraCharacteristics.SENSOR_ORIENTATION); if (isFrontFacing) { rotationCompensation = (sensorOrientation + rotationCompensation) % 360; } else { // back-facing rotationCompensation = (sensorOrientation - rotationCompensation + 360) % 360; } return rotationCompensation; }
তারপর, media.Image
অবজেক্ট এবং ঘূর্ণন ডিগ্রী মান InputImage.fromMediaImage()
এ পাস করুন :
কোটলিন
val image = InputImage.fromMediaImage(mediaImage, rotation)
Java
InputImage image = InputImage.fromMediaImage(mediaImage, rotation);
একটি ফাইল ইউআরআই ব্যবহার করে
একটি ফাইল URI থেকে একটি InputImage
অবজেক্ট তৈরি করতে, অ্যাপের প্রসঙ্গ এবং ফাইল URIকে InputImage.fromFilePath()
এ পাস করুন। এটি উপযোগী যখন আপনি একটি ACTION_GET_CONTENT
উদ্দেশ্য ব্যবহার করে ব্যবহারকারীকে তাদের গ্যালারি অ্যাপ থেকে একটি ছবি নির্বাচন করতে অনুরোধ করেন৷
কোটলিন
val image: InputImage try { image = InputImage.fromFilePath(context, uri) } catch (e: IOException) { e.printStackTrace() }
Java
InputImage image; try { image = InputImage.fromFilePath(context, uri); } catch (IOException e) { e.printStackTrace(); }
একটি ByteBuffer
বা ByteArray
ব্যবহার করে
একটি ByteBuffer
বা একটি ByteArray
থেকে একটি InputImage
অবজেক্ট তৈরি করতে, প্রথমে media.Image
ইনপুটের জন্য পূর্বে বর্ণিত চিত্রের ঘূর্ণন ডিগ্রি গণনা করুন৷ তারপরে, ছবির উচ্চতা, প্রস্থ, রঙ এনকোডিং বিন্যাস এবং ঘূর্ণন ডিগ্রী সহ বাফার বা অ্যারে সহ InputImage
অবজেক্ট তৈরি করুন:
কোটলিন
val image = InputImage.fromByteBuffer( byteBuffer, /* image width */ 480, /* image height */ 360, rotationDegrees, InputImage.IMAGE_FORMAT_NV21 // or IMAGE_FORMAT_YV12 ) // Or: val image = InputImage.fromByteArray( byteArray, /* image width */ 480, /* image height */ 360, rotationDegrees, InputImage.IMAGE_FORMAT_NV21 // or IMAGE_FORMAT_YV12 )
জাভা
InputImage image = InputImage.fromByteBuffer(byteBuffer, /* image width */ 480, /* image height */ 360, rotationDegrees, InputImage.IMAGE_FORMAT_NV21 // or IMAGE_FORMAT_YV12 ); // Or: InputImage image = InputImage.fromByteArray( byteArray, /* image width */480, /* image height */360, rotation, InputImage.IMAGE_FORMAT_NV21 // or IMAGE_FORMAT_YV12 );
একটি Bitmap
ব্যবহার করে
একটি Bitmap
বস্তু থেকে একটি InputImage
অবজেক্ট তৈরি করতে, নিম্নলিখিত ঘোষণা করুন:
কোটলিন
val image = InputImage.fromBitmap(bitmap, 0)
Java
InputImage image = InputImage.fromBitmap(bitmap, rotationDegree);
চিত্রটি ঘূর্ণন ডিগ্রী সহ একটি Bitmap
বস্তু দ্বারা উপস্থাপিত হয়।
3. ইমেজ লেবেলার চালান
একটি ইমেজে অবজেক্ট লেবেল করতে, image
অবজেক্টটিকে ImageLabeler
এর process()
পদ্ধতিতে পাস করুন।
কোটলিন
labeler.process(image) .addOnSuccessListener { labels -> // Task completed successfully // ... } .addOnFailureListener { e -> // Task failed with an exception // ... }
জাভা
labeler.process(image) .addOnSuccessListener(new OnSuccessListener<List<ImageLabel>>() { @Override public void onSuccess(List<ImageLabel> labels) { // Task completed successfully // ... } }) .addOnFailureListener(new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { // Task failed with an exception // ... } });
4. লেবেলযুক্ত সত্তা সম্পর্কে তথ্য পান
ইমেজ লেবেলিং অপারেশন সফল হলে,ImageLabel
অবজেক্টের একটি তালিকা সফল শ্রোতার কাছে পাঠানো হয়। প্রতিটি ImageLabel
অবজেক্ট এমন কিছু উপস্থাপন করে যা ছবিতে লেবেল করা হয়েছিল। আপনি প্রতিটি লেবেলের পাঠ্য বিবরণ পেতে পারেন (যদি TensorFlow Lite মডেল ফাইলের মেটাডেটা পাওয়া যায়), আত্মবিশ্বাসের স্কোর এবং সূচক। যেমন: কোটলিন
for (label in labels) { val text = label.text val confidence = label.confidence val index = label.index }
জাভা
for (ImageLabel label : labels) { String text = label.getText(); float confidence = label.getConfidence(); int index = label.getIndex(); }
রিয়েল-টাইম কর্মক্ষমতা উন্নত করার টিপস
আপনি যদি একটি রিয়েল-টাইম অ্যাপ্লিকেশনে চিত্রগুলিকে লেবেল করতে চান তবে সেরা ফ্রেম রেটগুলি অর্জন করতে এই নির্দেশিকাগুলি অনুসরণ করুন:
- আপনি
Camera
বাcamera2
API ব্যবহার করলে, ইমেজ লেবেলারকে থ্রোটল কল করুন। ইমেজ লেবেলার চলাকালীন যদি একটি নতুন ভিডিও ফ্রেম উপলব্ধ হয়, ফ্রেমটি ফেলে দিন। একটি উদাহরণের জন্য Quickstart নমুনা অ্যাপেVisionProcessorBase
ক্লাস দেখুন। - আপনি যদি
CameraX
API ব্যবহার করেন, নিশ্চিত হন যে ব্যাকপ্রেশার কৌশলটি এর ডিফল্ট মানImageAnalysis.STRATEGY_KEEP_ONLY_LATEST
এ সেট করা আছে। এটি গ্যারান্টি দেয় যে একবারে বিশ্লেষণের জন্য শুধুমাত্র একটি চিত্র সরবরাহ করা হবে। বিশ্লেষক ব্যস্ত থাকাকালীন যদি আরও ছবি তৈরি করা হয়, তবে সেগুলি স্বয়ংক্রিয়ভাবে ড্রপ করা হবে এবং বিতরণের জন্য সারিবদ্ধ হবে না। একবার ImageProxy.close() কল করে বিশ্লেষিত চিত্রটি বন্ধ হয়ে গেলে পরবর্তী সর্বশেষ চিত্রটি বিতরণ করা হবে। - আপনি যদি ইনপুট ইমেজে গ্রাফিক্স ওভারলে করতে ইমেজ লেবেলারের আউটপুট ব্যবহার করেন, তাহলে প্রথমে ML Kit থেকে ফলাফল পান, তারপর একটি একক ধাপে ইমেজ এবং ওভারলে রেন্ডার করুন। এটি প্রতিটি ইনপুট ফ্রেমের জন্য শুধুমাত্র একবার প্রদর্শন পৃষ্ঠে রেন্ডার করে। একটি উদাহরণের জন্য Quickstart নমুনা অ্যাপে
CameraSourcePreview
এবংGraphicOverlay
ক্লাসগুলি দেখুন। - আপনি Camera2 API ব্যবহার করলে,
ImageFormat.YUV_420_888
ফরম্যাটে ছবি ক্যাপচার করুন। আপনি পুরানো ক্যামেরা API ব্যবহার করলে,ImageFormat.NV21
ফর্ম্যাটে ছবিগুলি ক্যাপচার করুন৷