Перенос данных на устройство 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

Обновите зависимости для 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 из названий классов и перечислений.
  • 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 для распознавания изображений.

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

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

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