بعد تدريب النموذج الخاص بك باستخدام AutoML Vision Edge، يمكنك استخدامه في تطبيقك لرصد الأجسام في الصور.
هناك طريقتان لدمج النماذج المدربة من AutoML Vision Edge: يمكنك تجميع النموذج عن طريق وضعه داخل مجلد مواد عرض تطبيقك، أو يمكنك تنزيله ديناميكيًا من Firebase.
خيارات تجميع النماذج | |
---|---|
مُضمَّنة في تطبيقك |
|
مستضاف باستخدام Firebase |
|
قبل البدء
إذا أردت تنزيل نموذج، تأكَّد من إضافة Firebase إلى مشروع Android، إذا لم يسبق لك إجراء ذلك. ولا يُشترط إجراء ذلك عند تجميع النموذج.
أضِف التبعيات لمكتبة مهام TensorFlow Lite إلى ملف 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
.