Перенос данных на устройство iOS

В этом руководстве рассказывается, как перейти с ML Kit для 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. Нельзя использовать одновременно фреймворки и Cocoapods, поэтому, чтобы использовать эту библиотеку, сначала нужно перейти на Cocoapods.

Как обновить Cocoapods

Обновите зависимости для cocoapods ML Kit для iOS в файле 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 из названий классов и перечислений.
  • Objective-C: замените префиксы класса и перечисления 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) больше не существуют. Они были заменены классами, предназначенными для решения определенных задач. Замените вызовы различных заводских методов для получения детекторов прямыми вызовами заводского метода каждого детектора.

  • Класс VisionImageMetadata был удален вместе с перечислением VisionDetectorImageOrientation. Чтобы задать ориентацию изображения, используйте свойство orientation объекта VisionImage.

  • Метод onDeviceTextRecognizer, который получает новый экземпляр TextRecognizer, переименован в textRecognizer.

  • Свойство confidence удалено из классов результатов распознавания текста, включая TextElement, TextLine и TextBlock.

  • Методы onDeviceImageLabeler и onDeviceImageLabeler(options:) для получения нового экземпляра ImageLabeler были объединены и переименованы в imageLabeler(options:).

  • Удален метод objectDetector, позволяющий получить новый экземпляр ObjectDetector. Используйте вместо него objectDetector(options:).

  • Свойство type удалено из ImageLabeler, а свойство entityID – из класса результатов маркировки изображений ImageLabel.

  • API сканирования штрихкодов detect(in _:, completion:) переименован в process(_:, completion:), чтобы соответствовать другим API Vision.

  • В Natural Language 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, а не как целое число. Все возможные категории строк включены в перечисление 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.
  • Удалите из файла Podfile все CocoaPods, связанные с Firebase, например pod 'Firebase/Analytics'.
  • Удалите из кода все инициализации FirebaseApp, например FirebaseApp.configure().
  • Удалите приложение Firebase в консоли Firebase, следуя инструкциям на сайте поддержки Firebase.

Если вам нужна помощь

Если у вас возникнут проблемы, ознакомьтесь с информацией на странице сообщества, где перечислены доступные способы связи с нами.