מיגרציה ל-Android

עדכון ייבוא של GRid

ל-SDK החדש נדרשת תלות אחת בלבד לכל ML Kit API. אין צורך לציין ספריות נפוצות כמו firebase-ml-vision או firebase-ml-natural-language. ML Kit משתמש במרחב השמות com.google.android.gms עבור ספריות שמסתמכות על Google Play Services.

ממשקי Vision API

המודלים הארוזים נשלחים כחלק מהאפליקציה שלכם. יש להוריד מודלים דקים. חלק מממשקי ה-API זמינים גם בגרסה מצומצמת, וגם בגרסה מצומצמת, ויש כאלה רק בפורמט אחד. או אחרת:

APIבחבילהדק
זיהוי טקסטx (בטא)x
איתור פניםxx
סריקת ברקודxx
הוספת תוויות לתמונותxx
זיהוי אובייקטים ומעקב אחריהםx-

מעדכנים את יחסי התלות של ספריות ML Kit ל-Android במודול (אפליקציה רמה) קובץ Gradle (בדרך כלל app/build.gradle) לפי הטבלאות הבאות:

מודלים בחבילה

APIארטיפקטים ישניםארטיפקט חדש
סריקת ברקוד 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

מודלים דקים

APIארטיפקטים ישניםארטיפקט חדש
סריקת ברקוד 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

APIארטיפקט ישןארטיפקט חדש
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
com.google.mlkit:linkfirebase:17.0.0

ממשקי API לשפה טבעית

המודלים הארוזים נשלחים כחלק מהאפליקציה שלכם. יש להוריד מודלים דקים:

APIבחבילהדק
מזהה שפהxx
תשובה מהירהxx (בטא)

מעדכנים את יחסי התלות של ספריות ML Kit ל-Android במודול (אפליקציה רמה) קובץ Gradle (בדרך כלל app/build.gradle) לפי הטבלאות הבאות:

מודלים בחבילה

APIארטיפקטים ישניםארטיפקט חדש
מזהה שפה 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

מודלים דקים

APIארטיפקטים ישניםארטיפקט חדש
מזהה שפה 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.CustomRemoteModel
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() מוחלפות בקריאות ל-methodgetClient() של נקודת הכניסה לתכונה.
  • יצירת ברירת המחדל של 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.
  • אפשר לסגור את כל נקודות האחיזה (גלאי/סורק/מתייג/מתרגם...). חשוב לוודא שמתבצעת קריאה ל-method close() כשכבר לא משתמשים באובייקטים האלה. אם אתם משתמשים בהם ב-Fragment או ב-AppCompatActivity, אחת הדרכים הפשוטות לעשות זאת היא לקרוא ל-LifecycleOwner.getLifecycle() ב-Fragment או ב-AppCompatActivity, ולאחר מכן קוראים ל-Lifecycle.addObserver
  • השמות של processImage() ו-detectInImage() ב-Vision API השתנו ל-process() כדי לשמור על עקביות.
  • ב-Natural Language APIs משתמשים עכשיו במונח 'תג שפה' (כפי שמוגדר בתקן BCP 47) במקום ב'קוד שפה'.
  • הוסרו שיטות Getter במחלקות xxxOptions.
  • המתודה getBitmap() במחלקה קלטImage(מחליפה את FirebaseVisionImage) לא נתמכת יותר כחלק מהממשק הציבורי. אפשר לעיין בBitmapUtils.java בבדוגמה של המדריך למתחילים ל-ML Kit כדי להמיר מפת סיביות ממקורות קלט שונים.
  • הסרנו את FirebaseVisionImageMetadata. אפשר פשוט להעביר מטא-נתונים של תמונה, כמו רוחב, גובה, סיבובמעלות, פורמט ופורמט, לשיטות הבנייה של קלטתמונות.

הנה כמה דוגמאות לשיטות 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 life cycle 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 life cycle 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());
  

שינויים ספציפיים ל-API

סריקת ברקוד

עכשיו יש שתי דרכים להעביר את המודלים ל-Barcode Scanning API:

  • באמצעות Google Play Services, שנקראה גם Google Play Services (מומלץ), – ההגדרה הזו מקטינה את גודל האפליקציה והמודל משותף בין אפליקציות. עם זאת, המפתחים יצטרכו לוודא שהורדתם את המודל לפני שהם משתמשים בו בפעם הראשונה.
  • עם ה-APK של האפליקציה, שנקרא גם 'bundled', 'חבילה' – הקובץ הזה מגדיל את גודל האפליקציה, אבל המשמעות היא שניתן להשתמש במודל באופן מיידי.

שתי ההטמעות שונות מעט: בגרסה ה"חבילה" יש כמה שיפורים בהשוואה לגרסה ה"רזה". פרטים על ההבדלים האלה מופיעים בהנחיות של Barcode Scanning API

זיהוי פנים

יש שתי דרכים להעביר את המודלים ל-Face Detection API:

  • באמצעות Google Play Services, שנקראה גם Google Play Services (מומלץ), – ההגדרה הזו מקטינה את גודל האפליקציה והמודל משותף בין אפליקציות. עם זאת, המפתחים יצטרכו לוודא שהורדתם את המודל לפני שהם משתמשים בו בפעם הראשונה.
  • עם ה-APK של האפליקציה, שנקרא גם 'bundled', 'חבילה' – הקובץ הזה מגדיל את גודל ההורדה של האפליקציה, אבל המשמעות היא שניתן להשתמש במודל באופן מיידי.

אופן הפעולה של ההטמעות זהה.

תרגום

  • TranslateLanguage משתמש עכשיו בשמות קריאים עבור הקבועים שלו (למשל ENGLISH) במקום בתגי שפה (EN). הכינוי גם הפך ל- @StringDef, במקום ל- @IntDef, והערך של הקבוע הוא תג השפה התואם של BCP 47.

  • אם האפליקציה משתמשת באפשרות ההורדה 'מכשיר לא פעיל', חשוב לזכור שהאפשרות הזו הוסרה ואי אפשר להשתמש בה יותר. עדיין ניתן להשתמש באפשרות 'טעינת המכשיר'. אם רוצים התנהגות מורכבת יותר, אפשר לעכב את הפעלת ה-RemoteModelManager.download מאחורי הלוגיקה שלך.

הוספת תוויות לתמונות AutoML

אם האפליקציה משתמשת באפשרות של תנאי ההורדה 'מכשיר לא פעיל', חשוב לזכור האפשרות הוסרה ואי אפשר יותר להשתמש בה. עדיין אפשר להשתמש האפשרות 'טעינת המכשיר'.

אם ברצונך בהתנהגות מורכבת יותר, אפשר לעכב את השיחה RemoteModelManager.download מאחורי הלוגיקה שלך.

זיהוי אובייקטים ומעקב אחריהם

אם האפליקציה משתמשת בזיהוי אובייקטים עם סיווג גס, חשוב לזכור ערכת ה-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 ML Kit הוא רכיב Firebase היחיד שבו אתם משתמשים.
  • אתם משתמשים רק בממשקי API שנמצאים במכשיר.
  • אתם לא משתמשים בהצגת מודלים.

במקרה כזה, אפשר להסיר את יחסי התלות של Firebase אחרי ההעברה. כך עושים זאת:

  • מסירים את קובץ התצורה של Firebase על ידי מחיקת קובץ התצורה google-services.json בספריית המודול (ברמת האפליקציה) של האפליקציה.
  • מחליפים את הפלאגין של Google Services Gradle במודול (ברמת האפליקציה) בקובץ Gradle (בדרך כלל app/build.gradle) בפלאגין Strict Version Matcher:

לפני

apply plugin: 'com.android.application'
apply plugin: 'com.google.gms.google-services'  // Google Services plugin

android {
  // …
}

אחרי

apply plugin: 'com.android.application'
apply plugin: 'com.google.android.gms.strict-version-matcher-plugin'

android {
  // …
}
  • מחליפים את ה-classpath של הפלאגין של Google Services Gradle בפרויקט (ברמת השורש) בקובץ Gradle (build.gradle) בקובץ של הפלאגין Strict Version Matcher:

לפני

buildscript {
  dependencies {
    // ...

    classpath 'com.google.gms:google-services:4.3.3'  // Google Services plugin
  }
}

אחרי

buildscript {
  dependencies {
    // ...

    classpath 'com.google.android.gms:strict-version-matcher-plugin:1.2.1'
  }
}

מוחקים את אפליקציית Firebase במסוף Firebase בהתאם ההוראות באתר התמיכה של Firebase.

קבלת עזרה

אם נתקלת בבעיות, אפשר לעיין בדף הקהילה שלנו, שבו ניתן למצוא הערוצים הזמינים ליצירת קשר איתנו.