ছবি এবং ভিডিওতে মুখ সনাক্ত করতে আপনি ML কিট ব্যবহার করতে পারেন।
| বৈশিষ্ট্য | আনবান্ডেলড | বান্ডিলযুক্ত |
|---|---|---|
| বাস্তবায়ন | মডেলটি গুগল প্লে সার্ভিসেসের মাধ্যমে গতিশীলভাবে ডাউনলোড করা হয়। | মডেলটি তৈরির সময় আপনার অ্যাপের সাথে স্ট্যাটিক্যালি লিঙ্ক করা থাকে। |
| অ্যাপের আকার | প্রায় ৮০০ কিলোবাইট আকার বৃদ্ধি। | প্রায় ৬.৯ মেগাবাইট সাইজ বৃদ্ধি। |
| আরম্ভের সময় | প্রথম ব্যবহারের আগে মডেলটি ডাউনলোড হওয়ার জন্য অপেক্ষা করতে হতে পারে। | মডেলটি অবিলম্বে উপলব্ধ। |
চেষ্টা করে দেখো
- এই API এর একটি উদাহরণ ব্যবহারের জন্য নমুনা অ্যাপটি ব্যবহার করুন।
- কোডল্যাব দিয়ে নিজেই কোডটি চেষ্টা করে দেখুন।
শুরু করার আগে
আপনার প্রজেক্ট-লেভেল
build.gradleফাইলে, আপনারbuildscriptএবংallprojectsউভয় বিভাগেই Google এর Maven রিপোজিটরি অন্তর্ভুক্ত করতে ভুলবেন না।আপনার মডিউলের অ্যাপ-লেভেল গ্রেডল ফাইলে ML কিট অ্যান্ড্রয়েড লাইব্রেরির জন্য নির্ভরতা যোগ করুন, যা সাধারণত
app/build.gradleহয়। আপনার প্রয়োজনের উপর ভিত্তি করে নিম্নলিখিত নির্ভরতাগুলির মধ্যে একটি বেছে নিন:আপনার অ্যাপের সাথে মডেলটি বান্ডেল করার জন্য:
dependencies { // ... // Use this dependency to bundle the model with your app implementation 'com.google.mlkit:face-detection:16.1.7' }গুগল প্লে সার্ভিসে মডেলটি ব্যবহারের জন্য:
dependencies { // ... // Use this dependency to use the dynamically downloaded model in Google Play Services implementation 'com.google.android.gms:play-services-mlkit-face-detection:17.1.0' }যদি আপনি Google Play Services-এ মডেলটি ব্যবহার করতে চান , তাহলে Play Store থেকে আপনার অ্যাপটি ইনস্টল করার পরে ডিভাইসে স্বয়ংক্রিয়ভাবে মডেলটি ডাউনলোড করার জন্য আপনি আপনার অ্যাপটি কনফিগার করতে পারেন। এটি করার জন্য, আপনার অ্যাপের
AndroidManifest.xmlফাইলে নিম্নলিখিত ঘোষণাটি যোগ করুন:<application ...> ... <meta-data android:name="com.google.mlkit.vision.DEPENDENCIES" android:value="face" > <!-- To use multiple models: android:value="face,model2,model3" --> </application>আপনি Google Play পরিষেবা ModuleInstallClient API এর মাধ্যমে মডেলের উপলব্ধতা স্পষ্টভাবে পরীক্ষা করতে পারেন এবং ডাউনলোডের অনুরোধ করতে পারেন।
যদি আপনি ইনস্টল-টাইম মডেল ডাউনলোড সক্ষম না করেন বা স্পষ্ট ডাউনলোডের অনুরোধ না করেন, তাহলে ডিটেক্টরটি প্রথমবার চালানোর সাথে সাথে মডেলটি ডাউনলোড হয়ে যাবে। ডাউনলোড সম্পূর্ণ হওয়ার আগে আপনার করা অনুরোধগুলি কোনও ফলাফল দেয় না।
ছবির নির্দেশিকা ইনপুট করুন
মুখ শনাক্তকরণের জন্য, আপনার কমপক্ষে 480x360 পিক্সেলের একটি চিত্র ব্যবহার করা উচিত। ML Kit সঠিকভাবে মুখ সনাক্ত করতে, ইনপুট চিত্রগুলিতে এমন মুখ থাকতে হবে যা পর্যাপ্ত পিক্সেল ডেটা দ্বারা প্রতিনিধিত্ব করা হয়। সাধারণভাবে, আপনি একটি ছবিতে সনাক্ত করতে চান এমন প্রতিটি মুখ কমপক্ষে 100x100 পিক্সেল হওয়া উচিত। আপনি যদি মুখের রূপরেখা সনাক্ত করতে চান, তাহলে ML Kit-এর উচ্চ রেজোলিউশন ইনপুট প্রয়োজন: প্রতিটি মুখ কমপক্ষে 200x200 পিক্সেল হওয়া উচিত।
যদি আপনি রিয়েল-টাইম অ্যাপ্লিকেশনে মুখ সনাক্ত করেন, তাহলে আপনি ইনপুট চিত্রগুলির সামগ্রিক মাত্রা বিবেচনা করতে পারেন। ছোট চিত্রগুলি দ্রুত প্রক্রিয়া করা যেতে পারে, তাই লেটেন্সি কমাতে, কম রেজোলিউশনে চিত্রগুলি ক্যাপচার করুন, তবে উপরের নির্ভুলতার প্রয়োজনীয়তাগুলি মনে রাখবেন এবং নিশ্চিত করুন যে বিষয়ের মুখটি যতটা সম্ভব ছবির বেশিরভাগ অংশ দখল করে। রিয়েল-টাইম কর্মক্ষমতা উন্নত করার টিপসগুলিও দেখুন।
ছবির দুর্বল ফোকাসও নির্ভুলতার উপর প্রভাব ফেলতে পারে। যদি আপনি গ্রহণযোগ্য ফলাফল না পান, তাহলে ব্যবহারকারীকে ছবিটি পুনরায় ধারণ করতে বলুন।
ক্যামেরার সাপেক্ষে মুখের ওরিয়েন্টেশন এমএল কিট কোন মুখের বৈশিষ্ট্য সনাক্ত করে তাও প্রভাবিত করতে পারে। মুখ সনাক্তকরণ ধারণা দেখুন।
১. ফেস ডিটেক্টর কনফিগার করুন
কোনও ছবিতে ফেস ডিটেকশন প্রয়োগ করার আগে, যদি আপনি ফেস ডিটেক্টরের কোনও ডিফল্ট সেটিংস পরিবর্তন করতে চান, তাহলেFaceDetectorOptions অবজেক্ট দিয়ে সেই সেটিংস নির্দিষ্ট করুন। আপনি নিম্নলিখিত সেটিংস পরিবর্তন করতে পারেন:| সেটিংস | |
|---|---|
setPerformanceMode | PERFORMANCE_MODE_FAST (ডিফল্ট) | PERFORMANCE_MODE_ACCURATEমুখ সনাক্ত করার সময় গতি বা নির্ভুলতার পক্ষে। |
setLandmarkMode | LANDMARK_MODE_NONE (ডিফল্ট) | LANDMARK_MODE_ALLমুখের "চিহ্ন" সনাক্ত করার চেষ্টা করা উচিত কিনা: চোখ, কান, নাক, গাল, মুখ, ইত্যাদি। |
setContourMode | CONTOUR_MODE_NONE (ডিফল্ট) | CONTOUR_MODE_ALLমুখের বৈশিষ্ট্যের রূপরেখা সনাক্ত করা হবে কিনা। শুধুমাত্র একটি ছবিতে সবচেয়ে বিশিষ্ট মুখের জন্য রূপরেখা সনাক্ত করা হয়। |
setClassificationMode | CLASSIFICATION_MODE_NONE (ডিফল্ট) | CLASSIFICATION_MODE_ALL"হাসি", এবং "চোখ খোলা" এই ধরণের শ্রেণীতে মুখ শ্রেণীবদ্ধ করা হবে কিনা। |
setMinFaceSize | float (ডিফল্ট: 0.1f )মাথার প্রস্থ এবং ছবির প্রস্থের অনুপাত হিসেবে প্রকাশ করা, কাঙ্ক্ষিত ক্ষুদ্রতম মুখের আকার সেট করে। |
enableTracking | false (ডিফল্ট) | trueছবি জুড়ে মুখ ট্র্যাক করার জন্য ব্যবহার করা যেতে পারে এমন একটি আইডি মুখের জন্য বরাদ্দ করা হবে কিনা। মনে রাখবেন যে যখন কনট্যুর সনাক্তকরণ সক্ষম করা হয়, তখন কেবল একটি মুখ সনাক্ত করা হয়, তাই মুখ ট্র্যাকিং কার্যকর ফলাফল দেয় না। এই কারণে, এবং সনাক্তকরণের গতি উন্নত করতে, কনট্যুর সনাক্তকরণ এবং মুখ ট্র্যাকিং উভয়ই সক্ষম করবেন না। |
উদাহরণস্বরূপ:
কোটলিন
// High-accuracy landmark detection and face classification val highAccuracyOpts = FaceDetectorOptions.Builder() .setPerformanceMode(FaceDetectorOptions.PERFORMANCE_MODE_ACCURATE) .setLandmarkMode(FaceDetectorOptions.LANDMARK_MODE_ALL) .setClassificationMode(FaceDetectorOptions.CLASSIFICATION_MODE_ALL) .build() // Real-time contour detection val realTimeOpts = FaceDetectorOptions.Builder() .setContourMode(FaceDetectorOptions.CONTOUR_MODE_ALL) .build()
জাভা
// High-accuracy landmark detection and face classification FaceDetectorOptions highAccuracyOpts = new FaceDetectorOptions.Builder() .setPerformanceMode(FaceDetectorOptions.PERFORMANCE_MODE_ACCURATE) .setLandmarkMode(FaceDetectorOptions.LANDMARK_MODE_ALL) .setClassificationMode(FaceDetectorOptions.CLASSIFICATION_MODE_ALL) .build(); // Real-time contour detection FaceDetectorOptions realTimeOpts = new FaceDetectorOptions.Builder() .setContourMode(FaceDetectorOptions.CONTOUR_MODE_ALL) .build();
2. ইনপুট ইমেজ প্রস্তুত করুন
একটি ছবিতে মুখ সনাক্ত করতে,Bitmap , media.Image , ByteBuffer , বাইট অ্যারে, অথবা ডিভাইসের একটি ফাইল থেকে একটি InputImage অবজেক্ট তৈরি করুন। তারপর, InputImage অবজেক্টটিকে FaceDetector এর process পদ্ধতিতে পাস করুন।মুখ সনাক্তকরণের জন্য, আপনার কমপক্ষে 480x360 পিক্সেলের মাত্রার একটি ছবি ব্যবহার করা উচিত। যদি আপনি রিয়েল টাইমে মুখ সনাক্ত করেন, তাহলে এই ন্যূনতম রেজোলিউশনে ফ্রেম ক্যাপচার করলে লেটেন্সি কমাতে সাহায্য করতে পারে।
আপনি বিভিন্ন উৎস থেকে একটি 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 ব্যবহার করা হচ্ছে
একটি ফাইল 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 বস্তু দ্বারা উপস্থাপিত হয়।
৩. ফেসডিটেক্টরের একটি উদাহরণ পান
কোটলিন
val detector = FaceDetection.getClient(options) // Or, to use the default option: // val detector = FaceDetection.getClient();
জাভা
FaceDetector detector = FaceDetection.getClient(options); // Or use the default options: // FaceDetector detector = FaceDetection.getClient();
৪. ছবিটি প্রক্রিয়া করুন
ছবিটিprocess পদ্ধতিতে পাস করুন: কোটলিন
val result = detector.process(image) .addOnSuccessListener { faces -> // Task completed successfully // ... } .addOnFailureListener { e -> // Task failed with an exception // ... }
জাভা
Task<List<Face>> result = detector.process(image) .addOnSuccessListener( new OnSuccessListener<List<Face>>() { @Override public void onSuccess(List<Face> faces) { // Task completed successfully // ... } }) .addOnFailureListener( new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { // Task failed with an exception // ... } });
৫. সনাক্ত করা মুখ সম্পর্কে তথ্য পান
যদি ফেস ডিটেকশন অপারেশন সফল হয়, তাহলেFace অবজেক্টের একটি তালিকা সাকসেস লিসেনারের কাছে পাঠানো হবে। প্রতিটি Face অবজেক্ট ছবিতে সনাক্ত করা একটি ফেসকে প্রতিনিধিত্ব করে। প্রতিটি ফেসের জন্য, আপনি ইনপুট ছবিতে এর বাউন্ডিং স্থানাঙ্ক পেতে পারেন, সেইসাথে ফেস ডিটেক্টর খুঁজে পেতে আপনার কনফিগার করা অন্য যেকোনো তথ্যও পেতে পারেন। উদাহরণস্বরূপ: কোটলিন
for (face in faces) { val bounds = face.boundingBox val rotY = face.headEulerAngleY // Head is rotated to the right rotY degrees val rotZ = face.headEulerAngleZ // Head is tilted sideways rotZ degrees // If landmark detection was enabled (mouth, ears, eyes, cheeks, and // nose available): val leftEar = face.getLandmark(FaceLandmark.LEFT_EAR) leftEar?.let { val leftEarPos = leftEar.position } // If contour detection was enabled: val leftEyeContour = face.getContour(FaceContour.LEFT_EYE)?.points val upperLipBottomContour = face.getContour(FaceContour.UPPER_LIP_BOTTOM)?.points // If classification was enabled: if (face.smilingProbability != null) { val smileProb = face.smilingProbability } if (face.rightEyeOpenProbability != null) { val rightEyeOpenProb = face.rightEyeOpenProbability } // If face tracking was enabled: if (face.trackingId != null) { val id = face.trackingId } }
জাভা
for (Face face : faces) { Rect bounds = face.getBoundingBox(); float rotY = face.getHeadEulerAngleY(); // Head is rotated to the right rotY degrees float rotZ = face.getHeadEulerAngleZ(); // Head is tilted sideways rotZ degrees // If landmark detection was enabled (mouth, ears, eyes, cheeks, and // nose available): FaceLandmark leftEar = face.getLandmark(FaceLandmark.LEFT_EAR); if (leftEar != null) { PointF leftEarPos = leftEar.getPosition(); } // If contour detection was enabled: List<PointF> leftEyeContour = face.getContour(FaceContour.LEFT_EYE).getPoints(); List<PointF> upperLipBottomContour = face.getContour(FaceContour.UPPER_LIP_BOTTOM).getPoints(); // If classification was enabled: if (face.getSmilingProbability() != null) { float smileProb = face.getSmilingProbability(); } if (face.getRightEyeOpenProbability() != null) { float rightEyeOpenProb = face.getRightEyeOpenProbability(); } // If face tracking was enabled: if (face.getTrackingId() != null) { int id = face.getTrackingId(); } }
মুখের আকৃতির উদাহরণ
যখন আপনার মুখের কনট্যুর সনাক্তকরণ সক্ষম করা থাকে, তখন আপনি সনাক্ত করা প্রতিটি মুখের বৈশিষ্ট্যের জন্য পয়েন্টগুলির একটি তালিকা পাবেন। এই পয়েন্টগুলি বৈশিষ্ট্যের আকৃতি উপস্থাপন করে। কনট্যুরগুলি কীভাবে উপস্থাপন করা হয় সে সম্পর্কে বিশদ জানতে মুখ সনাক্তকরণ ধারণাগুলি দেখুন।
নিচের ছবিতে দেখানো হয়েছে কিভাবে এই বিন্দুগুলি একটি মুখের সাথে ম্যাপ করে, ছবিটি বড় করতে ক্লিক করুন:
রিয়েল-টাইম ফেস ডিটেকশন
আপনি যদি রিয়েল-টাইম অ্যাপ্লিকেশনে ফেস ডিটেকশন ব্যবহার করতে চান, তাহলে সেরা ফ্রেমরেট অর্জনের জন্য এই নির্দেশিকাগুলি অনুসরণ করুন:
ফেস ডিটেক্টরটি ফেস কনট্যুর ডিটেকশন অথবা ক্লাসিফিকেশন এবং ল্যান্ডমার্ক ডিটেকশন ব্যবহার করার জন্য কনফিগার করুন, কিন্তু উভয়ই নয়:
কনট্যুর সনাক্তকরণ
ল্যান্ডমার্ক সনাক্তকরণ
শ্রেণীবিভাগ
ল্যান্ডমার্ক সনাক্তকরণ এবং শ্রেণীবিভাগ
কনট্যুর সনাক্তকরণ এবং ল্যান্ডমার্ক সনাক্তকরণ
কনট্যুর সনাক্তকরণ এবং শ্রেণীবিভাগ
কনট্যুর সনাক্তকরণ, ল্যান্ডমার্ক সনাক্তকরণ এবং শ্রেণীবিভাগFASTমোড সক্ষম করুন (ডিফল্টরূপে সক্ষম)।কম রেজোলিউশনে ছবি তোলার কথা বিবেচনা করুন। তবে, এই API-এর ছবির মাত্রার প্রয়োজনীয়তাগুলিও মনে রাখবেন।
Camera অথবা camera2 API ব্যবহার করেন, তাহলে ডিটেক্টরে থ্রোটল কল আসবে। ডিটেক্টর চলাকালীন যদি একটি নতুন ভিডিও ফ্রেম পাওয়া যায়, তাহলে ফ্রেমটি ফেলে দিন। উদাহরণের জন্য কুইকস্টার্ট নমুনা অ্যাপে VisionProcessorBase ক্লাসটি দেখুন।CameraX API ব্যবহার করেন, তাহলে নিশ্চিত করুন যে ব্যাকপ্রেসার কৌশলটি তার ডিফল্ট মান ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST তে সেট করা আছে। এটি নিশ্চিত করে যে একবারে বিশ্লেষণের জন্য শুধুমাত্র একটি ছবি সরবরাহ করা হবে। বিশ্লেষক ব্যস্ত থাকাকালীন যদি আরও ছবি তৈরি করা হয়, তাহলে সেগুলি স্বয়ংক্রিয়ভাবে বাদ দেওয়া হবে এবং সরবরাহের জন্য সারিবদ্ধ করা হবে না। ImageProxy.close() কল করে বিশ্লেষণ করা ছবিটি বন্ধ হয়ে গেলে, পরবর্তী সর্বশেষ ছবিটি সরবরাহ করা হবে।CameraSourcePreview এবং GraphicOverlay ক্লাসগুলি দেখুন।ImageFormat.YUV_420_888 ফর্ম্যাটে ছবি তুলুন। যদি আপনি পুরোনো ক্যামেরা API ব্যবহার করেন, তাহলে ImageFormat.NV21 ফর্ম্যাটে ছবি তুলুন।