الوحدة 7 — التكامل مع Android
النموذج جاهز، حجمه 3.5 مِيغا، يعمل في 18 مِلّي ثانية على NNAPI. الوقت الآن لإدماجه في تطبيق يحمله المزارع في جيبه. سنغطّي في هذه الوحدة أربع نقاط جوهريّة: التبعيّات الصحيحة في Gradle، ومعالجة إطار الكاميرا الحقيقيّ (بلا خدع)، وإخراج الاستدلال من الخيط الرئيسيّ، والتفضيل بين واجهة المفسّر الخام ومكتبة Task Library التي تخفي جزءًا كبيرًا من التفاصيل.
أوّلًا: التبعيّات في Gradle
في ملفّ build.gradle الخاصّ بالوحدة، نُضيف:
dependencies {
// النواة الأساسيّة : المفسّر
implementation("org.tensorflow:tensorflow-lite:2.16.0")
// المفوَّض NNAPI (يستدعي مسرِّعات Android)
implementation("org.tensorflow:tensorflow-lite-nnapi:2.16.0")
// Task Library : واجهة عالية المستوى لتصنيف الصور
implementation("org.tensorflow:tensorflow-lite-task-vision:0.4.4")
// GPU Delegate (اختياريّ)
implementation("org.tensorflow:tensorflow-lite-gpu:2.16.0")
implementation("org.tensorflow:tensorflow-lite-gpu-delegate-plugin:0.4.4")
// CameraX لالت قاط الإطار من الكاميرا
implementation("androidx.camera:camera-core:1.3.1")
implementation("androidx.camera:camera-camera2:1.3.1")
implementation("androidx.camera:camera-lifecycle:1.3.1")
implementation("androidx.camera:camera-view:1.3.1")
}
نقطة مهمّة: لا تخلط بين نُسخ tensorflow-lite وtensorflow-lite-task-vision. مكتبة Task تعتمد على نسخة قياسيّة من النواة، وأيّ اختلاف يُنتج أخطاء اتّصال (UnsatisfiedLinkError) في وقت التنفيذ. إن استعملت واحدة فقط، الأسلم أن تستعمل Task Library وحدها لأنّها تجرّ النواة المطابقة.
إضافة النموذج إلى الأصول
النموذج plantvillage_int8.tflite يوضع في app/src/main/assets/. يُنصح بإيقاف ضغط ملفّات .tflite كي لا يُفكّها Android مرّة أخرى قبل التحميل:
android {
androidResources {
noCompress += "tflite"
}
}