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

يوضّح هذا الدليل كيفية نقل البيانات من حزمة تعلّم الآلة لـ Firebase على Android.

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

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

Vision APIs

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

واجهة برمجة التطبيقاتمُجمَّعةرقيق
التعرّف على النص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.1

‫AutoMLVision Edge

واجهة برمجة التطبيقاتOld Artifactعنصر جديد
استخدام 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.

واجهات برمجة التطبيقات Natural Language API

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

واجهة برمجة التطبيقاتمُجمَّعةرقيق
معرّف اللغة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... تم استبدال طلبات الخدمة getInstance() في Firebase بطلبات إلى طريقة 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() لضمان الاتساق.
  • تستخدم واجهات برمجة التطبيقات Natural Language الآن المصطلح "علامة اللغة" (كما هو محدّد في معيار 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" المعروفة أيضًا باسم "النماذج الخفيفة" (يُنصح بها): يؤدي ذلك إلى تقليل حجم التطبيق وتتم مشاركة النموذج بين التطبيقات. ومع ذلك، على المطوّرين التأكّد من تنزيل النموذج قبل استخدامه للمرة الأولى.
  • مع حزمة APK الخاصة بتطبيقك، أي "الحزمة" - يؤدي ذلك إلى زيادة حجم التطبيق، ولكن يعني ذلك أنّ النموذج يكون قابلاً للاستخدام على الفور.

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

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

بالنسبة إلى Face Detection API، تتوفّر طريقتان لتسليم النماذج:

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

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

الترجمة

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

AutoML Image Labeling (متوقّفة نهائيًا)

تم إيقاف نهائيًا إمكانية تنزيل النماذج المخصّصة لتصنيف الصور باستخدام 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 {
  // …
}
  • استبدِل مسار فئة المكوّن الإضافي في خدمات Google لأداة Gradle في ملف 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.

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

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