نقل البيانات لنظام التشغيل Android

يشرح هذا الدليل كيفية نقل البيانات من "حزمة تعلّم الآلة" في Firebase لنظام التشغيل Android.

تعديل عمليات استيراد Gradle

تتطلّب حزمة تطوير البرامج (SDK) لـ حزمة تعلّم الآلة تبعية واحدة فقط لكل واجهة برمجة تطبيقات في حزمة تعلّم الآلة. ليس عليك تحديد المكتبات الشائعة، مثل firebase-ml-vision أو firebase-ml-natural-language. تستخدم حزمة تعلّم الآلة مساحة الاسم com.google.android.gms للمكتبات التي تعتمد على "خدمات Google Play".

واجهات برمجة التطبيقات Vision

يتم تقديم النماذج المجمّعة كجزء من تطبيقك. يجب تنزيل النماذج البسيطة. تتوفّر بعض واجهات برمجة التطبيقات في كل من الشكل المجمّع والمبسّط، والبعض الآخر يتوفّر فقط في شكل واحد أو آخر:

واجهة برمجة التطبيقاتمُجمَّعةرقيق
التعرّف على النصx (إصدار تجريبي)x
التعرّف على الوجوهxx
مسح الرموز الشريطية ضوئيًاxx
تصنيف الصورxx
رصد العناصر وتتبُّعهاx-

عدِّل العناصر التابعة لمكتبات "حزمة تعلّم الآلة" على Android في ملف Gradle للوحدة (على مستوى التطبيق) (عادةً app/build.gradle.kts) وفقًا للجداول التالية:

النماذج المجمّعة

واجهة برمجة التطبيقاتالقطع الأثرية القديمةعنصر جديد
مسح الرموز الشريطية ضوئيًا com.google.firebase:firebase-ml-vision:24.0.1
com.google.firebase:firebase-ml-vision-barcode-model:16.0.1
com.google.mlkit:barcode-scanning:17.3.0
تحديد ملامح الوجه com.google.firebase:firebase-ml-vision:24.0.1
com.google.firebase:firebase-ml-vision-face-model:19.0.0
com.google.mlkit:face-detection:16.1.7
تصنيف الصور com.google.firebase:firebase-ml-vision:24.0.1
com.google.firebase:firebase-ml-vision-image-label-model:19.0.0
com.google.mlkit:image-labeling:17.0.9
رصد العناصر com.google.firebase:firebase-ml-vision:24.0.1
com.google.firebase:firebase-ml-vision-object-detection-model:19.0.3
com.google.mlkit:object-detection:17.0.2

نماذج رفيعة

واجهة برمجة التطبيقاتالقطع الأثرية القديمةعنصر جديد
مسح الرموز الشريطية ضوئيًا com.google.firebase:firebase-ml-vision:24.0.1 com.google.android.gms:play-services-mlkit-barcode-scanning:18.3.1
التعرّف على الوجوه com.google.firebase:firebase-ml-vision:24.0.1 com.google.android.gms:play-services-mlkit-face-detection:17.1.0
التعرّف على النص com.google.firebase:firebase-ml-vision:24.0.1 com.google.android.gms:play-services-mlkit-text-recognition:19.0.2

AutoMLVision Edge

واجهة برمجة التطبيقاتعنصر قديمعنصر جديد
‫AutoML بدون تنزيل com.google.firebase:firebase-ml-vision:24.0.1
com.google.firebase:firebase-ml-vision-automl:18.0.3
com.google.mlkit:image-labeling-custom:17.0.3
‫AutoML مع التنزيل com.google.firebase:firebase-ml-vision:24.0.1
com.google.firebase:firebase-ml-vision-automl:18.0.3
com.google.mlkit:image-labeling-custom:17.0.3

لاستضافة النماذج المخصّصة وتنزيلها، عليك نقل نماذجك إلى Cloud Storage وإضافة منطق التنزيل في تطبيقك لتحميلها باستخدام LocalModel. لمعرفة التفاصيل، يُرجى الاطّلاع على دليل نقل البيانات من Firebase ML إلى Cloud Storage.

واجهات برمجة التطبيقات للغة الطبيعية

يتم تقديم النماذج المجمّعة كجزء من تطبيقك. يجب تنزيل النماذج الخفيفة:

واجهة برمجة التطبيقاتمُجمَّعةرقيق
رقم تعريف اللغةxx
الرد السريعxx (إصدار تجريبي)

عدِّل العناصر التابعة لمكتبات "حزمة تعلّم الآلة" على Android في ملف Gradle للوحدة (على مستوى التطبيق) (عادةً app/build.gradle.kts) وفقًا للجداول التالية:

النماذج المجمّعة

واجهة برمجة التطبيقاتالقطع الأثرية القديمةعنصر جديد
رقم تعريف اللغة com.google.firebase:firebase-ml-natural-language:22.0.0
com.google.firebase:firebase-ml-natural-language-language-id-model:20.0.7
com.google.mlkit:language-id:17.0.6
الرد السريع com.google.firebase:firebase-ml-natural-language:22.0.0
com.google.firebase:firebase-ml-natural-language-smart-reply-model:20.0.7
com.google.mlkit:smart-reply:17.0.4

نماذج رفيعة

واجهة برمجة التطبيقاتالقطع الأثرية القديمةعنصر جديد
رقم تعريف اللغة com.google.firebase:firebase-ml-natural-language:22.0.0
com.google.firebase:firebase-ml-natural-language-language-id-model:20.0.7
com.google.android.gms:play-services-mlkit-language-id:17.0.0
الرد السريع com.google.firebase:firebase-ml-natural-language:22.0.0
com.google.firebase:firebase-ml-natural-language-smart-reply-model:20.0.7
com.google.android.gms:play-services-mlkit-smart-reply:16.0.0-beta1

تعديل أسماء الصفوف

إذا ظهر صفك في هذا الجدول، عليك إجراء التغيير المُشار إليه:

صف قديمصف جديد
com.google.firebase.ml.common.FirebaseMLException com.google.mlkit.common.MlKitException
com.google.firebase.ml.vision.common.FirebaseVisionImage com.google.mlkit.vision.common.InputImage
com.google.firebase.ml.vision.barcode.FirebaseVisionBarcodeDetector com.google.mlkit.vision.barcode.BarcodeScanner
com.google.firebase.ml.vision.labeler.FirebaseVisionImageLabel com.google.mlkit.vision.label.ImageLabeler
com.google.firebase.ml.vision.barcode.FirebaseVisionBarcodeDetector com.google.mlkit.vision.barcode.BarcodeScanner
com.google.firebase.ml.vision.automl.FirebaseAutoMLLocalModel com.google.mlkit.common.model.LocalModel
com.google.firebase.ml.vision.automl.FirebaseAutoMLRemoteModel com.google.mlkit.common.model.LocalModel

يتطلّب التنزيل يدويًا. تم إيقاف النماذج البعيدة المستضافة على Firebase نهائيًا. لمعرفة التفاصيل، يُرجى الاطّلاع على دليل نقل البيانات من Firebase ML إلى Cloud Storage.
com.google.firebase.ml.vision.label.FirebaseVisionOnDeviceImageLabelerOptions com.google.mlkit.vision.label.defaults.ImageLabelerOptions
com.google.firebase.ml.vision.label.FirebaseVisionImageLabel com.google.mlkit.vision.label.ImageLabel
com.google.firebase.ml.vision.label.FirebaseVisionOnDeviceAutoMLImageLabelerOptions com.google.mlkit.vision.label.custom.CustomImageLabelerOptions
com.google.firebase.ml.vision.objects.FirebaseVisionObjectDetectorOptions com.google.mlkit.vision.objects.defaults.ObjectDetectorOptions

بالنسبة إلى الفئات الأخرى، اتّبِع القواعد التالية:

  • أزِل البادئة FirebaseVision من اسم الفئة.
  • أزِل البادئات الأخرى التي تبدأ بالبادئة Firebase من اسم الصف.

أيضًا، في أسماء الحِزم، استبدِل البادئة com.google.firebase.ml بـ com.google.mlkit.

تعديل أسماء الطرق

هناك تغييرات بسيطة في الرمز:

  • تم تغيير عملية إنشاء مثيل لأداة الرصد/الماسح الضوئي/أداة التصنيف/أداة الترجمة... أصبح لكل ميزة الآن نقطة دخول خاصة بها. على سبيل المثال: BarcodeScanning وTextRecognition وImageLabeling وTranslation... يتم استبدال الطلبات المرسَلة إلى خدمة Firebase getInstance() بطلبات مرسَلة إلى طريقة getClient() لنقطة دخول الميزة.
  • تمت إزالة عملية إنشاء مثيل تلقائي لـ TextRecognizer، لأنّنا قدّمنا مكتبات إضافية للتعرّف على نصوص أخرى مثل الصينية والكورية. لاستخدام الخيارات التلقائية مع نموذج التعرّف على النص اللاتيني، يجب الإعلان عن تبعية لـ com.google.android.gms:play-services-mlkit-text-recognition واستخدام TextRecognition.getClient(TextRecognizerOptions.DEFAULT_OPTIONS).
  • تمت إزالة عملية إنشاء مثيل تلقائي لـ ImageLabeler وObjectDetector، لأنّنا أتحنا إمكانية استخدام النماذج المخصّصة لهاتين الميزتَين. على سبيل المثال، لاستخدام الخيارات التلقائية مع النموذج الأساسي في ImageLabeling، يجب الإعلان عن تبعية على com.google.mlkit:image-labeling واستخدام ImageLabeling.getClient(ImageLabelerOptions.DEFAULT_OPTIONS) في Java.
  • يمكن إغلاق جميع المقابض (أداة الرصد/الماسح الضوئي/أداة التصنيف/أداة الترجمة...). تأكَّد من استدعاء الإجراء close() عندما لا يتم استخدام هذه العناصر بعد ذلك. إذا كنت تستخدمهما في Fragment أو AppCompatActivity، يمكنك استدعاء LifecycleOwner.getLifecycle() على Fragment أو AppCompatActivity، ثم استدعاء Lifecycle.addObserver.
  • تمت إعادة تسمية processImage() وdetectInImage() في واجهات برمجة التطبيقات Vision API إلى process() من أجل الاتساق.
  • تستخدم واجهات برمجة التطبيقات للغة الطبيعية الآن مصطلح "علامة اللغة" (كما هو محدّد في معيار BCP 47) بدلاً من "رمز اللغة".
  • تمت إزالة طرق Getter في فئات xxxOptions.
  • لم تعُد طريقة getBitmap() في فئة InputImage (التي تحلّ محلّ FirebaseVisionImage) متاحة كجزء من الواجهة العامة. يُرجى الرجوع إلى BitmapUtils.java في نموذج البدء السريع لـ "حزمة تعلّم الآلة" للحصول على صورة نقطية تم تحويلها من مدخلات مختلفة.
  • تمت إزالة FirebaseVisionImageMetadata، ويمكنك تمرير البيانات الوصفية للصورة، مثل width وheight وrotationDegrees وformat، إلى طرق إنشاء InputImage.

في ما يلي بعض الأمثلة على طرق Kotlin القديمة والجديدة:

الإصدار القديم

// Construct image labeler with base model and default options.
val imageLabeler = FirebaseVision.getInstance().onDeviceImageLabeler

// Construct object detector with base model and default options.
val objectDetector = FirebaseVision.getInstance().onDeviceObjectDetector

// Construct face detector with given options
val faceDetector = FirebaseVision.getInstance().getVisionFaceDetector(options)

// Construct image labeler with local AutoML model
val localModel =
    FirebaseAutoMLLocalModel.Builder()
      .setAssetFilePath("automl/manifest.json")
      .build()
val autoMLImageLabeler =
    FirebaseVision.getInstance()
      .getOnDeviceAutoMLImageLabeler(
          FirebaseVisionOnDeviceAutoMLImageLabelerOptions.Builder(localModel)
            .setConfidenceThreshold(0.3F)
            .build()
    )

جديد

// Construct image labeler with base model and default options.
val imageLabeler = ImageLabeling.getClient(ImageLabelerOptions.DEFAULT_OPTIONS)
// Optional: add lifecycle observer
lifecycle.addObserver(imageLabeler)

// Construct object detector with base model and default options.
val objectDetector = ObjectDetection.getClient(
    ObjectDetectorOptions.DEFAULT_OPTIONS
)

// Construct face detector with given options
val faceDetector = FaceDetection.getClient(options)

// Construct image labeler with local AutoML model
val localModel =
  LocalModel.Builder()
    .setAssetManifestFilePath("automl/manifest.json")
    .build()
val autoMLImageLabeler =
  ImageLabeling.getClient(
    CustomImageLabelerOptions.Builder(localModel)
    .setConfidenceThreshold(0.3F).build())
  

في ما يلي بعض الأمثلة على طرق Java القديمة والجديدة:

الإصدار القديم

// Construct image labeler with base model and default options.
FirebaseVisionImageLabeler imagelLabeler =
     FirebaseVision.getInstance().getOnDeviceImageLabeler();

// Construct object detector with base model and default options.
FirebaseVisionObjectDetector objectDetector =
     FirebaseVision.getInstance().getOnDeviceObjectDetector();

// Construct face detector with given options
FirebaseVisionFaceDetector faceDetector =
     FirebaseVision.getInstance().getVisionFaceDetector(options);

// Construct image labeler with local AutoML model
FirebaseAutoMLLocalModel localModel =
    new FirebaseAutoMLLocalModel.Builder()
      .setAssetFilePath("automl/manifest.json")
      .build();
FirebaseVisionImageLabeler autoMLImageLabeler =
    FirebaseVision.getInstance()
      .getOnDeviceAutoMLImageLabeler(
          FirebaseVisionOnDeviceAutoMLImageLabelerOptions.Builder(localModel)
            .setConfidenceThreshold(0.3F)
            .build());

جديد

// Construct image labeler with base model and default options.
ImageLabeler imageLabeler = ImageLabeling.getClient(
    ImageLabelerOptions.DEFAULT_OPTIONS
);
// Optional: add lifecycle observer
getLifecycle().addObserver(imageLabeler);

// Construct object detector with base model and default options.
ObjectDetector objectDetector = ObjectDetection.getClient(
    ObjectDetectorOptions.DEFAULT_OPTIONS
);

// Construct face detector with given options
FaceDetector faceDetector = FaceDetection.getClient(options);

// Construct image labeler with local AutoML model
LocalModel localModel =
  new LocalModel.Builder()
    .setAssetManifestFilePath("automl/manifest.json")
    .build();
ImageLabeler autoMLImageLabeler =
  ImageLabeling.getClient(
    new CustomImageLabelerOptions.Builder(localModel)
    .setConfidenceThreshold(0.3F).build());
  

التغييرات الخاصة بواجهة برمجة التطبيقات

مسح الرموز الشريطية ضوئيًا

بالنسبة إلى Barcode Scanning API، تتوفّر الآن طريقتان لتقديم النماذج:

  • من خلال "خدمات Google Play"، المعروفة أيضًا باسم "thin" (يُنصح بها): يقلّل هذا الخيار من حجم التطبيق وتتم مشاركة النموذج بين التطبيقات. ومع ذلك، سيحتاج المطوّرون إلى التأكّد من تنزيل النموذج قبل استخدامه لأول مرة.
  • مع حزمة APK الخاصة بتطبيقك، أي "مجمّعة": يؤدي ذلك إلى زيادة حجم التطبيق، ولكنّه يعني أنّ النموذج قابل للاستخدام على الفور.

تختلف عمليتا التنفيذ قليلاً، حيث يتضمّن الإصدار "المجمّع" عددًا من التحسينات مقارنةً بالإصدار "المبسّط". يمكن العثور على تفاصيل حول هذه الاختلافات في إرشادات واجهة برمجة التطبيقات لمسح الرمز الشريطي.

التعرّف على الوجوه

بالنسبة إلى Face Detection API، يمكن تقديم النماذج بطريقتَين:

  • من خلال "خدمات Google Play"، المعروفة أيضًا باسم "thin" (يُنصح بها): يقلّل هذا الخيار من حجم التطبيق وتتم مشاركة النموذج بين التطبيقات. ومع ذلك، سيحتاج المطوّرون إلى التأكّد من تنزيل النموذج قبل استخدامه لأول مرة.
  • مع حزمة APK الخاصة بتطبيقك، والمعروفة أيضًا باسم "مجمّعة": يؤدي ذلك إلى زيادة حجم تنزيل التطبيق، ولكنّه يعني أنّ النموذج قابل للاستخدام على الفور.

سلوك عمليات التنفيذ هو نفسه.

الترجمة

  • يستخدم TranslateLanguage الآن أسماءً قابلة للقراءة لثوابته (مثل ENGLISH) بدلاً من علامات اللغة (EN). كما أنها الآن @StringDef، بدلاً من @IntDef، وقيمة الثابت هي علامة لغة BCP 47 المطابقة.

تصنيف الصور باستخدام تعلّم الآلة التلقائي (ميزة متوقّفة نهائيًا)

تم إيقاف ميزة تنزيل النماذج المخصّصة لتصنيف الصور باستخدام AutoML نهائيًا، وسيتم إيقافها في 15 يونيو 2027. يجب استخدام Cloud Storage لاستضافة النماذج وإضافة منطق التنزيل إلى تطبيقك لتنزيل النماذج بدلاً من ذلك. لمعرفة التفاصيل، يُرجى الاطّلاع على دليل نقل البيانات من Firebase ML إلى Cloud Storage.

رصد العناصر وتتبُّعها

إذا كان تطبيقك يستخدم ميزة رصد العناصر مع التصنيف التقريبي، يُرجى العِلم أنّ حزمة تطوير البرامج (SDK) الجديدة غيّرت طريقة عرض فئة التصنيف للعناصر التي يتم رصدها.

يتم عرض فئة التصنيف كمثيل لـ DetectedObject.Label بدلاً من عدد صحيح. يتم تضمين جميع الفئات المحتملة للمصنِّف التقريبي في فئة PredefinedCategory.

في ما يلي مثال على رمز Kotlin القديم والجديد:

الإصدار القديم

if (object.classificationCategory == FirebaseVisionObject.CATEGORY_FOOD) {
    ...
}

جديد

if (!object.labels.isEmpty() &&
    object.labels[0].text == PredefinedCategory.FOOD) {
    ...
}
// or
if (!object.labels.isEmpty() &&
    object.labels[0].index == PredefinedCategory.FOOD_INDEX) {
    ...
}

في ما يلي مثال على رمز Java القديم والجديد:

الإصدار القديم

if (object.getClassificationCategory() == FirebaseVisionObject.CATEGORY_FOOD) {
    ...
}

جديد

if (!object.getLabels().isEmpty()
    && object.getLabels().get(0).getText().equals(PredefinedCategory.FOOD)) {
    ...
}
// or
if (!object.getLabels().isEmpty()
    && object.getLabels().get(0).getIndex() == PredefinedCategory.FOOD_INDEX) {
    ...
}

تمت إزالة الفئة "غير معروف". عندما تكون الثقة في تصنيف الكائن منخفضة، فإننا لا نعيد أي تصنيف.

إزالة تبعيات Firebase

أزِل تبعيات Firebase بعد نقل البيانات. اتّبِع الخطوات التالية:

  • أزِل ملف إعدادات Firebase من خلال حذف ملف الإعدادات google-services.json في دليل الوحدة (على مستوى التطبيق) في تطبيقك.
  • استبدِل المكوّن الإضافي في خدمات Google لأداة Gradle في ملف Gradle للوحدة (على مستوى التطبيق) (عادةً app/build.gradle.kts) بالمكوّن الإضافي Strict Version Matcher:

قبل

plugins {
  id("com.android.application")
  id("com.google.gms.google-services")
}

android {
  // …
}

بعد

plugins {
  id("com.android.application")
  id("com.google.android.gms.strict-version-matcher-plugin")
}

android {
  // …
}
  • استبدِل مسار فئة المكوّن الإضافي Gradle لخدمات Google في ملف Gradle الخاص بمشروعك (على مستوى الجذر) (build.gradle.kts) بمسار فئة المكوّن الإضافي Strict Version Matcher:

قبل

buildscript {
  dependencies {
    // ...

    classpath("com.google.gms:google-services:4.3.3")
  }
}

بعد

buildscript {
  dependencies {
    // ...
    classpath("com.google.android.gms:strict-version-matcher-plugin:1.2.1")
  }
}

احذف تطبيق Firebase في وحدة تحكُّم Firebase وفقًا للتعليمات الواردة في موقع دعم Firebase الإلكتروني.

الحصول على المساعدة

إذا واجهت أي مشاكل، يُرجى الاطّلاع على صفحة المنتدى حيث نوضّح القنوات المتاحة للتواصل معنا.