بعد تدريب النموذج الخاص بك باستخدام AutoML Vision Edge، يمكنك استخدامه في تطبيقك لرصد الأجسام في الصور.
هناك طريقتان لدمج النماذج المدربة من AutoML Vision Edge: يمكنك تجميع النموذج عن طريق وضعه داخل مجلد مواد عرض تطبيقك، أو يمكنك تنزيله ديناميكيًا من Firebase.
خيارات تجميع النماذج | |
---|---|
مُضمَّنة في تطبيقك |
|
مستضافة باستخدام Firebase |
|
قبل البدء
إذا أردت تنزيل نموذج، تأكَّد من إضافة Firebase إلى مشروع Android، إذا لم يسبق لك إجراء ذلك. ولا يُشترط إجراء ذلك عند تجميع النموذج.
أضِف التبعيات لمكتبة TensorFlow Lite Task إلى ملف Gradle على مستوى التطبيق الخاص بالوحدة، والذي يكون عادةً
app/build.gradle
:لتجميع نموذج مع تطبيقك:
dependencies { // ... // Object detection with a bundled Auto ML model implementation 'org.tensorflow:tensorflow-lite-task-vision:0.0.0-nightly-SNAPSHOT' }
لتنزيل نموذج ديناميكيًا من Firebase، أضِف أيضًا التبعية لتكنولوجيا تعلُّم الآلة من Firebase:
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. تحميل النموذج
ضبط مصدر نموذج على الجهاز
لتجميع النموذج مع تطبيقك:
- استخرِج النموذج من أرشيف zip الذي نزّلته من وحدة تحكّم Google Cloud.
- أدرِج طراز جهازك في حزمة تطبيقك:
- إذا لم يكن لديك مجلد مواد عرض في مشروعك، أنشئ مجلدًا من خلال
النقر بزر الماوس الأيمن على مجلد
app/
، ثم النقر على جديد > مجلد > مجلد مواد العرض. - انسخ ملف التصميم
tflite
الذي يتضمّن بيانات وصفية مضمّنة إلى مجلد مواد العرض.
- إذا لم يكن لديك مجلد مواد عرض في مشروعك، أنشئ مجلدًا من خلال
النقر بزر الماوس الأيمن على مجلد
أضِف ما يلي إلى ملف
build.gradle
في تطبيقك لضمان عدم ضغط Gradle لملف التصميم عند إنشاء التطبيق:android { // ... aaptOptions { noCompress "tflite" } }
سيتم تضمين ملف النموذج في حزمة التطبيق وسيكون متاحًا كعنصر خام.
ضبط مصدر نموذج مستضاف على Firebase
لاستخدام النموذج المستضاف عن بُعد، أنشئ عنصرًا من النوع 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()
بعد ذلك، ابدأ مهمة تنزيل النموذج، مع تحديد الشروط التي تريد السماح بالتنزيل بموجبها. إذا لم يكن النموذج متوفّرًا على الجهاز أو إذا كان هناك إصدار أحدث من النموذج، ستنزِّل المهمة النموذج بشكل غير متزامن من Firebase:
جافا
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
من
صورتك لكل صورة تريد تصنيفها. يمكنك إنشاء عنصر TensorImage
من Bitmap
باستخدام الطريقة
fromBitmap
:
جافا
TensorImage image = TensorImage.fromBitmap(bitmap);
Kotlin
val image = TensorImage.fromBitmap(bitmap)
إذا لم تكن بيانات الصورة في Bitmap
، يمكنك تحميل صفيف بكسل كما هو موضّح في
مستندات TensorFlow Lite.
3- تشغيل أداة رصد الأجسام
لرصد الأجسام في صورة، مرِّر عنصر TensorImage
إلى detect()
في ObjectDetector
.
جافا
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
في تطبيق نموذج البدء السريع للحصول على مثال. -
إذا كنت تستخدم واجهة برمجة التطبيقات Camera2 API، يمكنك التقاط الصور بتنسيق
ImageFormat.YUV_420_888
.إذا كنت تستخدم الإصدار القديم من Camera API، يمكنك التقاط الصور بتنسيق
ImageFormat.NV21
.