针对 iOS 进行迁移

前提条件

在开始迁移代码之前,请确保您满足以下要求:

  • ML Kit 支持 Xcode 13.2.1 或更高版本。
  • 机器学习套件支持 iOS 15.5 或更高版本。
  • 机器学习套件不支持 32 位架构 (i386 和 armv7)。机器学习套件支持 64 位架构(x86_64 和 arm64)。
  • 机器学习套件库仅以 cocoapods 的形式提供。您无法混用框架和 cocoapods,因此若要使用此库,您需要先迁移到使用 cocoapods。

更新 Cocoapods

在应用的 Podfile 中更新 ML Kit iOS cocoapods 的依赖项:

API旧 Pod 名称新 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
语言 ID Firebase/MLNaturalLanguage
Firebase/MLNLLanguageID
GoogleMLKit/LanguageID
智能回复 Firebase/MLNaturalLanguage
Firebase/MLNLSmartReply
GoogleMLKit/SmartReply
翻译 Firebase/MLNaturalLanguage
Firebase/MLNLTranslate
GoogleMLKit/Translate

更新类、枚举和类型的名称

通常,需要按如下方式重命名类、枚举和类型:

  • Swift:从类名称和枚举中移除了 Vision 前缀
  • Objective-C:将 FIRVisionFIR 类名称和枚举前缀都替换为 MLK

以下类名称和类型不适用此一般规则:

旧类或类型新类或类型
AutoMLLocalModel LocalModel
AutoMLRemoteModel CustomRemoteModel
VisionBarcodeDetectionCallback BarcodeScanningCallback
VisionBarcodeDetector BarcodeScanner
VisionBarcodeDetectorOptions BarcodeScannerOptions
VisionImage VisionImage(无变化)
VisionPoint VisionPoint(无变化)
VisionOnDeviceAutoMLImageLabelerOptions CustomImageLabelerOptions
VisionOnDeviceImageLabelerOptions ImageLabelerOptions
旧类或类型新类或类型
FIRAutoMLLocalModel MLKLocalModel
FIRAutoMLRemoteModel MLKCustomRemoteModel
FIRVisionBarcodeDetectionCallback MLKBarcodeScanningCallback
FIRVisionBarcodeDetector MLKBarcodeScanner
FIRVisionBarcodeDetectorOptions MLKBarcodeScannerOptions
FIRVisionImage MLKVisionImage
FIRVisionOnDeviceAutoMLImageLabelerOptions MLKCustomImageLabelerOptions
FIRVisionOnDeviceImageLabelerOptions MLKImageLabelerOptions
FIRVisionPoint MLKVisionPoint

更新方法名称

根据以下规则更新方法名称:

  • 域名入口点类 (VisionNaturalLanguage) 已不复存在。它们已被特定于任务的类取代。将对各个工厂方法的调用(用于获取检测器)替换为对每个检测器工厂方法的直接调用。

  • 已移除 VisionImageMetadata 类和 VisionDetectorImageOrientation 枚举。使用 VisionImageorientation 属性指定图片的显示方向。

  • 用于获取新 TextRecognizer 实例的 onDeviceTextRecognizer 方法已重命名为 textRecognizer

  • 从文本识别结果类(包括 TextElementTextLineTextBlock)中移除了置信度属性。

  • 用于获取新 ImageLabeler 实例的 onDeviceImageLabeleronDeviceImageLabeler(options:) 方法已合并并重命名为 imageLabeler(options:)

  • 用于获取新 ObjectDetector 实例的 objectDetector 方法已被移除。请改用 objectDetector(options:)

  • 已从 ImageLabeler 中移除 type 属性,并从图片标注结果类 ImageLabel 中移除了 entityID 属性。

  • 条形码扫描 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 更改了返回检测到的对象的分类方式。

VisionObject 中的 VisionObjectCategory 会以 ObjectLabel 对象中的 text 的形式返回,而不是整数。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 ML Kit
  • 您仅使用设备端 API
  • 您不使用模型投放

如果是这种情况,您可以在迁移后移除 Firebase 依赖项。请按照以下步骤操作:

  • 从应用目录和 Xcode 项目中删除 GoogleService-Info.plist 文件,以移除 Firebase 配置文件。
  • 从 Podfile 中移除所有 Firebase CocoaPod,例如 pod 'Firebase/Analytics'
  • 从代码中移除所有 FirebaseApp 初始化,例如 FirebaseApp.configure()
  • 按照 Firebase 支持网站上的说明,在 Firebase 控制台中删除您的 Firebase 应用。

获取帮助

如果您遇到任何问题,请访问我们的社区页面,其中列出了可用于与我们联系的渠道。