מיגרציה ל-Android

במדריך הזה מוסבר איך להפסיק להשתמש ב-ML Kit for Firebase ל-Android.

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

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

Vision APIs

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

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

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

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

APIפריטים ישניםפריט מידע שנוצר בתהליך פיתוח חדש (Artifact)
סריקת ברקודים 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פריטים ישניםפריט מידע שנוצר בתהליך פיתוח חדש (Artifact)
סריקת ברקודים 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פריט מידע שנוצר בתהליך פיתוח (Artifact) ישןפריט מידע שנוצר בתהליך פיתוח חדש (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

מודלים מקובצים מסופקים כחלק מהאפליקציה. צריך להוריד מודלים רזים:

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

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

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

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

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

סריקת ברקודים

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

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

יש הבדלים קלים בין שתי ההטמעות. בגרסה 'המשולבת' יש כמה שיפורים בהשוואה לגרסה 'הדקה'. פרטים על ההבדלים האלה מפורטים בהנחיות לשימוש ב-Barcode Scanning API.

זיהוי פנים

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

  • באמצעות Google Play Services,‏ aka‏ 'thin' (מומלץ) – האפשרות הזו מקטינה את גודל האפליקציה, והמודל משותף בין האפליקציות. עם זאת, מפתחים יצטרכו לוודא שהמודל הורד לפני השימוש בו בפעם הראשונה.
  • עם קובץ ה-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 Services 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 Services 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.

קבלת עזרה

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