מיגרציה ל-iOS

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

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

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

עדכון של Cocoapods

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

APIשמות ישנים של פודיםשמות חדשים לפודים
סריקת ברקודים Firebase/MLVision
Firebase/MLVisionBarcodeModel
GoogleMLKit/סריקת ברקוד
זיהוי פנים Firebase/MLVision
Firebase/MLVisionFaceModel
GoogleMLKit/FaceDetection
הוספת תוויות לתמונות Firebase/MLVision
Firebase/MLVisionLabelModel
יצירת תווית מ-GoogleMLKit/ImageLabel
זיהוי אובייקטים ומעקב אחריהם Firebase/MLVisionObjectDetection GoogleMLKit/ObjectDetection
זיהוי טקסט Firebase/MLVision
Firebase/MLVisionTextModel
GoogleMLKit/זיהוי טקסט
תיוג תמונות של AutoML (מודל בחבילה) Firebase/MLVisionAutoML GoogleMLKit/ImageLabelingCustom
הוספת תוויות לתמונות AutoML (הורדת מודל מ-Firebase) Firebase/MLVisionAutoML GoogleMLKit/ImageLabelingCustom
GoogleMLKit/LinkFirebase
מזהה שפה Firebase/MLNaturalLanguage
Firebase/MLNLLanguageID
GoogleMLKit/LanguageID
תשובה מהירה Firebase/MLNaturalLanguage
Firebase/MLNLSmartReply
GoogleMLKit/תשובה מהירה
תרגום Firebase/MLNaturalLanguage
Firebase/MLNLTranslate
GoogleMLKit/תרגום

עדכון שמות של מחלקות, טיפוסים בני מנייה (enums) וסוגים

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

  • Swift: הסרת הקידומת Vision משמות מחלקות ומטיפוסים מסוג טיפוס (enums)
  • יעד-C: מחליפים גם את FIRVision וגם את שם המחלקה FIR ואת הקידומות של טיפוסים בני מנייה (enum) ב-MLK

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

Swift

כיתה או סוג ישניםכיתה או סוג חדשים
AutoMLLocalModel LocalModel
AutoMLRemoteModel CustomRemoteModel
VisionBarcodeDetectionCallback BarcodeScanningCallback
VisionBarcodeDetector BarcodeScanner
VisionBarcodeDetectorOptions BarcodeScannerOptions
VisionImage VisionImage (ללא שינוי)
VisionPoint VisionPoint (ללא שינוי)
VisionOnDeviceAutoMLImageLabelerOptions CustomImageLabelerOptions
VisionOnDeviceImageLabelerOptions ImageLabelerOptions

Objective-C

כיתה או סוג ישניםכיתה או סוג חדשים
FIRAutoMLLocalModel MLKLocalModel
FIRAutoMLRemoteModel MLKCustomRemoteModel
FIRVisionBarcodeDetectionCallback MLKBarcodeScanningCallback
FIRVisionBarcodeDetector MLKBarcodeScanner
FIRVisionBarcodeDetectorOptions MLKBarcodeScannerOptions
FIRVisionImage MLKVisionImage
FIRVisionOnDeviceAutoMLImageLabelerOptions MLKCustomImageLabelerOptions
FIRVisionOnDeviceImageLabelerOptions MLKImageLabelerOptions
FIRVisionPoint MLKVisionPoint

Objective-C

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

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

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

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

  • השם של השיטה onDeviceTextRecognizer שמקבלת מכונה חדשה של TextRecognizer השתנה ל-textRecognizer.

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

  • השיטות onDeviceImageLabeler ו-onDeviceImageLabeler(options:) לקבלת מכונה חדשה של ImageLabeler מוזגו והשמות שלהן שויכו ל-imageLabeler(options:).

  • השיטה objectDetector לקבלת מופע חדש של ObjectDetector הוסרה. במקומה צריך להשתמש במדיניות objectDetector(options:).

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

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

  • בממשקי Natural Language API נעשה עכשיו שימוש במונח "language tag" (תג שפה (כפי שמוגדר בתקן BCP-47) במקום במונח "language code".

  • עכשיו 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())
    

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

השלב הזה חל רק אם התנאים הבאים מתקיימים:

  • ערכת ML של Firebase היא רכיב Firebase היחיד שבו אתה משתמש
  • אתם משתמשים רק בממשקי API במכשיר
  • לא נעשה שימוש בהצגת מודלים

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

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

קבלת עזרה

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