بعد تدريب نموذجك الخاص باستخدام 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 ML:
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
،
مع تحديد الاسم الذي خصّصته للنموذج عند نشره:
Java
// 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:
Java
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
من أحدها.
إذا كان لديك نموذج مجمَّع محليًا فقط، ما عليك سوى إنشاء أداة رصد عناصر من ملف النموذج وتحديد الحد الأدنى لدرجة الثقة التي تريدها (راجِع تقييم النموذج):
Java
// 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()
في "أداة إدارة النماذج".
على الرغم من أنّه عليك تأكيد ذلك قبل تشغيل أداة رصد العناصر فقط، إذا كان لديك نموذج مستضاف عن بُعد ونموذج مجمّع محليًا، قد يكون من المنطقي إجراء هذا التحقّق عند إنشاء أداة رصد العناصر: أنشئ أداة رصد العناصر من النموذج المستضاف عن بُعد إذا تم تنزيله، ومن النموذج المحلي في الحالات الأخرى.
Java
FirebaseModelManager.getInstance().isModelDownloaded(remoteModel)
.addOnSuccessListener(new OnSuccessListener<Boolean>() {
@Override
public void onSuccess(Boolean isDownloaded) {
}
});
Kotlin
FirebaseModelManager.getInstance().isModelDownloaded(remoteModel)
.addOnSuccessListener { success ->
}
إذا كان لديك نموذج مستضاف عن بُعد فقط، عليك إيقاف الوظائف ذات الصلة بالنموذج، مثل إخفاء جزء من واجهة المستخدم أو عرضه باللون الرمادي، إلى أن تتأكّد من تنزيل النموذج. يمكنك إجراء ذلك من خلال ربط أداة معالجة
بالطريقة download()
في أداة إدارة النماذج.
بعد التأكّد من تنزيل النموذج، أنشئ أداة رصد كائنات من ملف النموذج:
Java
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
:
Java
TensorImage image = TensorImage.fromBitmap(bitmap);
Kotlin
val image = TensorImage.fromBitmap(bitmap)
إذا لم تكن بيانات الصور بتنسيق Bitmap
، يمكنك تحميل مصفوفة وحدات بكسل كما هو موضّح في مستندات TensorFlow Lite.
3- تشغيل أداة رصد العناصر
لرصد عناصر في صورة، مرِّر عنصر TensorImage
إلى طريقة detect()
في ObjectDetector
.
Java
List<Detection> results = objectDetector.detect(image);
Kotlin
val results = objectDetector.detect(image)
4. الحصول على معلومات عن العناصر المصنَّفة
في حال نجاح عملية رصد الأجسام، يتم عرض قائمة Detection
بالأجسام. يمثّل كل عنصر Detection
شيئًا تم رصده في الصورة. يمكنك الحصول على المربّع المحيط بكل عنصر وتصنيفاته.
على سبيل المثال:
Java
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
.