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

עדכון Cocoapods

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

APIשמות ה-pod הקודמיםשמות חדשים של פקעות
סריקת ברקודים 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) Firebase/MLVisionAutoML GoogleMLKit/ImageLabelingCustom
GoogleMLKit/LinkFirebase
מזהה השפה Firebase/MLNaturalLanguage
Firebase/MLNLLanguageID
GoogleMLKit/LanguageID
תשובה מהירה Firebase/MLNaturalLanguage
Firebase/MLNLSmartReply
GoogleMLKit/SmartReply
תרגום Firebase/MLNaturalLanguage
Firebase/MLNLTranslate
GoogleMLKit/Translate

עדכון שמות של כיתות, ערכים מוגדרים מראש וסוגים

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

  • Swift: הסרת התחילית Vision משמות של מחלקות ומממשקי enum
  • Objective-C: מחליפים את שם הכיתה ואת הקידומות של enum של FIRVision ושל FIR ב-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. משתמשים במאפיין 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 אחרים לראייה ממוחשבת.

  • בממשקי ה-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 ML Kit הוא הרכיב היחיד ב-Firebase שבו אתם משתמשים
  • אתם משתמשים רק בממשקי API במכשיר
  • אתם לא משתמשים בהצגת מודלים

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

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

קבלת עזרה

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