מיגרציה ל-iOS

במדריך הזה מוסבר איך לעבור מ-ML Kit for Firebase ל-iOS.

דרישות מוקדמות

לפני שמתחילים להעביר את הקוד, חשוב לוודא שאתם עומדים בדרישות הבאות:

  • ‫ML Kit תומך ב-Xcode מגרסה 13.2.1 ואילך.
  • ‫ML Kit תומך ב-iOS מגרסה 15.5 ואילך.
  • ‫ML Kit לא תומך בארכיטקטורות של 32 ביט (i386 ו-armv7). ‫ML Kit תומך בארכיטקטורות של 64 ביט (x86_64 ו-arm64).
  • ספריית ML Kit מסופקת רק כ-CocoaPods. אי אפשר לשלב בין frameworks לבין cocoapods, אז כדי להשתמש בספרייה הזו צריך קודם לעבור לשימוש ב-cocoapods.

עדכון Cocoapods

מעדכנים את יחסי התלות של ML Kit iOS cocoapods בקובץ Podfile של האפליקציה:

APIשמות הפודים הישניםשמות חדשים לפודים
סריקת ברקודים Firebase/MLVision
Firebase/MLVisionBarcodeModel
GoogleMLKit/BarcodeScanning
איתור פנים Firebase/MLVision
Firebase/MLVisionFaceModel
GoogleMLKit/FaceDetection
תוויות לתמונות Firebase/MLVision
Firebase/MLVisionLabelModel
GoogleMLKit/ImageLabeling
זיהוי ומעקב אחר אובייקטים Firebase/MLVisionObjectDetection GoogleMLKit/ObjectDetection
זיהוי טקסט Firebase/MLVision
Firebase/MLVisionTextModel
GoogleMLKit/TextRecognition
תיוג תמונות ב-AutoML (מודל בחבילה) Firebase/MLVisionAutoML GoogleMLKit/ImageLabelingCustom
תיוג תמונות ב-AutoML (המודל הורד) Firebase/MLVisionAutoML GoogleMLKit/ImageLabelingCustom

כדי לארח ולהוריד מודלים בהתאמה אישית, צריך להעביר את המודלים ל-Cloud Storage ולהוסיף לוגיקת הורדה באפליקציה כדי לטעון אותם כמודלים מקומיים. פרטים נוספים זמינים במדריך להעברת נתונים מ-Firebase ML ל-Cloud Storage.
מזהה השפה Firebase/MLNaturalLanguage
Firebase/MLNLLanguageID
GoogleMLKit/LanguageID
תשובה מהירה Firebase/MLNaturalLanguage
Firebase/MLNLSmartReply
GoogleMLKit/SmartReply
תרגום Firebase/MLNaturalLanguage
Firebase/MLNLTranslate
GoogleMLKit/Translate

עדכון שמות של מחלקות, טיפוסים ממוספרים וסוגים

באופן כללי, צריך לשנות את השמות של המחלקות, הטיפוסים הממוספרים והסוגים באופן הבא:

  • ‫Swift: מסירים את הקידומת Vision משמות המחלקות ומה-enums
  • ‫Objective-C: מחליפים את הקידומות של שם המחלקה ושל ה-enum של FIRVision ו-FIR ב-MLK

הכלל הכללי הזה לא חל על חלק מהשמות והסוגים של המחלקות:

Swift

הסוג או המחלקה הישניםסוג או מחלקה חדשים
AutoMLLocalModel LocalModel
AutoMLRemoteModel ‫LocalModel

צריך להוריד באופן ידני. מודלים מרוחקים שמתארחים ב-Firebase הוצאו משימוש. פרטים נוספים זמינים במדריך להעברת נתונים מ-Firebase ML ל-Cloud Storage.
VisionBarcodeDetectionCallback BarcodeScanningCallback
VisionBarcodeDetector BarcodeScanner
VisionBarcodeDetectorOptions BarcodeScannerOptions
VisionImage VisionImage (ללא שינוי)
VisionPoint VisionPoint (ללא שינוי)
VisionOnDeviceAutoMLImageLabelerOptions CustomImageLabelerOptions
VisionOnDeviceImageLabelerOptions ImageLabelerOptions

Objective-C

הסוג או המחלקה הישניםסוג או מחלקה חדשים
FIRAutoMLLocalModel MLKLocalModel
FIRAutoMLRemoteModel ‫MLKLocalModel

צריך להוריד באופן ידני. מודלים מרוחקים שמתארחים ב-Firebase הוצאו משימוש. פרטים נוספים זמינים במדריך להעברת נתונים מ-Firebase ML ל-Cloud Storage.
FIRVisionBarcodeDetectionCallback MLKBarcodeScanningCallback
FIRVisionBarcodeDetector MLKBarcodeScanner
FIRVisionBarcodeDetectorOptions MLKBarcodeScannerOptions
FIRVisionImage MLKVisionImage
FIRVisionPoint MLKVisionPoint
FIRVisionOnDeviceAutoMLImageLabelerOptions MLKCustomImageLabelerOptions
FIRVisionOnDeviceImageLabelerOptions MLKImageLabelerOptions

שמות של שיטות עדכון

מעדכנים את שמות השיטות לפי הכללים הבאים:

  • מחלקות נקודות הכניסה לדומיין (Vision, NaturalLanguage) כבר לא קיימות. הן הוחלפו במחלקות ספציפיות למשימות. מחליפים את הקריאות לשיטות השונות של ה-factory לקבלת גלאים בקריאות ישירות לשיטת ה-factory של כל גלאי.

  • המחלקה VisionImageMetadata הוסרה, יחד עם ה-enum‏ VisionDetectorImageOrientation. משתמשים במאפיין orientation של VisionImage כדי לציין את כיוון התצוגה של התמונה.

  • השיטה onDeviceTextRecognizer שמקבלת מופע חדש של TextRecognizer נקראת עכשיו textRecognizer.

  • המאפיין "מהימנות" הוסר ממחלקות התוצאות של זיהוי הטקסט, כולל TextElement,‏ TextLine ו-TextBlock.

  • ה-methods‏ onDeviceImageLabeler ו-onDeviceImageLabeler(options:) לקבלת מופע חדש של ImageLabeler מוזגו ושמן שונה ל-imageLabeler(options:).

  • השיטה objectDetector לקבלת מופע חדש של ObjectDetector הוסרה. במקום זאת, אתם צריכים להשתמש ב-objectDetector(options:).

  • המאפיין type הוסר מ-ImageLabeler והמאפיין entityID הוסר ממחלקת התוצאות של תיוג התמונות, ImageLabel.

  • שינינו את השם של ה-API לסריקת ברקודים מ-detect(in _:, completion:) ל-process(_:, completion:) כדי לשמור על עקביות עם ממשקי API אחרים של Vision.

  • ממשקי ה-API של שפה טבעית משתמשים עכשיו במונח "תג שפה" (כפי שמוגדר בתקן BCP-47) במקום במונח "קוד שפה".

  • ב-TranslateLanguage נעשה עכשיו שימוש בשמות קריאים (כמו .english) לקבועים במקום בתגי שפה (כמו .en).

הנה כמה דוגמאות לשיטות Swift ישנות וחדשות:

ישן

let options = VisionOnDeviceImageLabelerOptions()
options.confidenceThreshold = 0.75
let labeler = Vision.vision().onDeviceImageLabeler(options: options)

let detector = Vision.vision().faceDetector(options: options)

let localModel = AutoMLLocalModel(manifestPath: "automl/manifest.json")
let options = VisionOnDeviceAutoMLImageLabelerOptions(localModel: localModel)
options.confidenceThreshold = 0.75
let labeler = vision.onDeviceAutoMLImageLabeler(options: options)

let detector = Vision.vision().objectDetector()
    

חדש

let options = ImageLabelerOptions()
options.confidenceThreshold = NSNumber(value:0.75)
let labeler = ImageLabeler.imageLabeler(options: options)

let detector = FaceDetector.faceDetector(options: options)

let localModel = LocalModel(manifestPath: "automl/manifest.json")
let options = CustomImageLabelerOptions(localModel: localModel)
options.confidenceThreshold = NSNumber(value:0.75)
let labeler = ImageLabeler.imageLabeler(options: options)

let detector = ObjectDetector.objectDetector(options: ObjectDetectorOptions())
    

הנה כמה דוגמאות לשיטות Objective-C ישנות וחדשות:

ישן

FIRVisionOnDeviceImageLabelerOptions *options =
    [[FIRVisionOnDeviceImageLabelerOptions alloc] init];
options.confidenceThreshold = 0.75;
FIRVisionImageLabeler *labeler =
    [[FIRVision vision] onDeviceImageLabelerWithOptions:options];

FIRVisionFaceDetector *detector =
    [[FIRVision vision] faceDetectorWithOptions: options];

FIRAutoMLLocalModel *localModel =
    [[FIRAutoMLLocalModel alloc] initWithManifestPath:@"automl/manifest.json"];
FIRVisionOnDeviceAutoMLImageLabelerOptions *options =
    [[FIRVisionOnDeviceAutoMLImageLabelerOptions alloc]
        initWithLocalModel: localModel];
options.confidenceThreshold = 0.75
FIRVisionImageLabeler *labeler =
    [[FIRVision vision] onDeviceAutoMLImageLabelerWithOptions:options];

FIRVisionObjectDetector *detector =
    [[FIRVision vision] objectDetector];
    

חדש

MLKImageLabelerOptions *options =
    [[MLKImageLabelerOptions alloc] init];
options.confidenceThreshold = @(0.75);
MLKImageLabeler *labeler =
    [MLKImageLabeler imageLabelerWithOptions:options];

MLKFaceDetector *detector =
    [MLKFaceDetector faceDetectorWithOptions:options];

MLKLocalModel *localModel =
    [[MLKLocalModel alloc]
        initWithManifestPath:@"automl/manifest.json"];
MLKCustomImageLabelerOptions *options =
    [[MLKCustomImageLabelerOptions alloc] initWithLocalModel:localModel];
options.confidenceThreshold = @(0.75)
MLKImageLabeler *labeler =
    [MLKImageLabeler imageLabelerWithOptions:options];

MLKObjectDetectorOptions *options = [[MLKObjectDetectorOptions alloc] init];
MLKObjectDetector *detector = [MLKObjectDetector objectDetectorWithOptions:options];
    

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

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

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

הערך VisionObjectCategory ב-VisionObject מוחזר בתור text באובייקט ObjectLabel, במקום בתור מספר שלם. כל הקטגוריות האפשריות של מחרוזות נכללות ב-enum של DetectedObjectLabel.

חשוב לזכור שהקטגוריה .unknown הוסרה. כשרמת הסמך של סיווג אובייקט נמוכה, המסווג לא מחזיר תווית בכלל.

הנה דוגמה לקוד Swift הישן והחדש:

ישן

if (object.classificationCategory == .food) {
    ...
}

חדש

if let label = object.labels.first {
  if (label.text == DetectedObjectLabel.food.rawValue) {
    ...
  }
}
// or
if let label = object.labels.first {
  if (label.index == DetectedObjectLabelIndex.food.rawValue) {
    ...
  }
}

הנה דוגמה לקוד Objective-C הישן והחדש:

ישן

if (object.classificationCategory == FIRVisionObjectCategoryFood) {
    ...
}

חדש

if ([object.labels[0].text isEqualToString:MLKDetectedObjectLabelFood]) {
  ...
}
// or
if ([object.labels[0].index == MLKDetectedObjectLabelIndexFood]) {
  ...
}

הסרת יחסי תלות של Firebase

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

  • מסירים את קובץ התצורה של Firebase על ידי מחיקת הקובץ GoogleService-Info.plist מהספרייה של האפליקציה ומהפרויקט ב-Xcode.
  • מסירים את כל ה-CocoaPods של Firebase, כמו pod 'Firebase/Analytics', מה-Podfile.
  • מסירים מהקוד את כל האתחולים של FirebaseApp, כמו FirebaseApp.configure().
  • מוחקים את אפליקציית Firebase במסוף Firebase לפי ההוראות באתר התמיכה של Firebase.

קבלת עזרה

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