在iOS上使用ML Kit标注图片

您可以使用ML Kit来标注图片,使用设备上的模型或云上的模型。请参阅概述以了解每种方法的优点。

有关此API使用的示例,请参阅GitHub上的ML Kit快速入门示例,或者尝试使用codelab

在您开始之前

  1. 如果您还没有将Firebase添加到您的程序当中,那您可以从开始指南来开始您的工作。

  2. 将ML kit库放进您的Podfile中:

    1. pod 'Firebase/Core'
    2. pod 'Firebase/MLVision'
    3. # 如果使用设备上的API:
    4. pod 'Firebase/MLVisionLabelModel'

​ 而后每次您要安装或者升级您的Pods的时候,请确保使用您的Xcode项目的.xcworkspace来打开它。

  1. 在您的程序中,引入Firebase:

    Swift:

    1. import Firebase

    Objective-C:

    1. @import Firebase;
  2. 如果您想使用基于云的模型,并且尚未将项目升级到Blaze计划,请在Firebase控制台中执行此操作。只有Blaze计划的项目才能使用Cloud Vision API。

  3. 如果您想使用基于云的模型,您也需要开启Cloud Vision API:

    • 在云API列表管理平台中打开Cloud Vision API
    • 确保您的Firebase项目已经在当前菜单页面中被置于顶端。
    • 如果API依旧还是显示为enabled,请点击Enable。

    如果您想要仅仅开启使用设备上的模型,您可以跳过这一步。

现在您已经可以开始使用设备上的模型或者基于云端的模型识别图像中的文本了。

在设备上标注图片

要使用基于云的图像标签模型,请按以下所述配置和运行图像标注器。

  1. 配置图像标注器

    默认情况下,设备上的图片标注仅返回置信度为0.5或以上的标签信息。如果您想更改此设置,请按照以下示例创建一个VisionLabelDetectorOptions对象:

    Swift:

    1. let options = VisionLabelDetectorOptions(
    2. confidenceThreshold: Constants.labelConfidenceThreshold
    3. )

    ViewController.swift

    Objective-C:

    1. FIRVisionLabelDetectorOptions *options =
    2. [[FIRVisionLabelDetectorOptions alloc] initWithConfidenceThreshold:0.6f];
  2. 运行图片标注器

    1. 为了能够识别图像中的文本,将图像传递为UIImage或者CMSampleBufferRefVisionLabelDetectordetect(in:)方法:

      1. 得到一个VisionTextDetector实例:

        Swift:

        1. lazy var vision = Vision.vision()
        2. let labelDetector = vision.labelDetector(options: options) // 检测错误
        3. // 或者使用默认设定:
        4. // let labelDetector = vision?.labelDetector()

        Objective-C:

        1. FIRVision *vision = [FIRVision vision];
        2. FIRVisionLabelDetector *labelDetector = [vision labelDetector];
        3. // 或者使用默认设定:
        4. // FIRVisionLabelDetector *labelDetector =
        5. // [vision labelDetectorWithOptions:options];
      2. 使用UIImage或者CMSampleBufferRef创建一个VisionImage对象:

        使用UIImage

        1. 如有必要,旋转图像以使其imageOrientation 属性为.up

        2. VisionImage使用正确旋转的对象创建一个对象 UIImage。不要指定任何旋转元数据 - 默认值.topLeft,必须使用。

          Swift:

          1. let image = VisionImage(image: uiImage)

          Objective-C:

          1. FIRVisionImage *image = [[FIRVisionImage alloc] initWithImage:uiImage];

        使用CMSampleBufferRef

        1. 创建一个VisionImageMetadata对象,该对象指定包含在CMSampleBufferRef缓冲区中的图像数据的方向 。

          例如,如果图像数据必须顺时针旋转90度才能保持直立:

          Swift:

          1. let metadata = VisionImageMetadata()
          2. metadata.orientation = .rightTop // Row为0在右边,column为0则是在顶端

          Objective-C:

          1. // Row为0在右边,column为0则是在顶端
          2. FIRVisionImageMetadata *metadata = [[FIRVisionImageMetadata alloc] init];
          3. metadata.orientation = FIRVisionDetectorImageOrientationRightTop;
        2. VisionImage使用CMSampleBufferRef对象和旋转元数据创建一个对象 :

          Swift:

          1. let image = VisionImage(buffer: bufferRef)
          2. image.metadata = metadata

          Objective-C:

          1. FIRVisionImage *image = [[FIRVisionImage alloc] initWithBuffer:buffer];
          2. image.metadata = metadata;
      3. 然后,将图像传递给该detect(in:)方法:

        Swift:

        1. labelDetector.detect(in: visionImage) { (labels, error) in
        2. guard error == nil, let labels = labels, !labels.isEmpty else {
        3. // 错误,您需要检查控制台的报错
        4. // ...
        5. return
        6. }
        7. // 被标注过的照片
        8. // ...
        9. }

        Objective-C:

        1. [labelDetector detectInImage:image
        2. completion:^(NSArray<FIRVisionLabel *> *labels,
        3. NSError *error) {
        4. if (error != nil || labels.count == 0) {
        5. return;
        6. }
        7. // 得到标签,从FIRVisionLabel取得标签.
        8. }];
  3. 从标注过的对象中获取信息

    如果图像标注成功,则会将VisionLabel对象数组传递给完成处理程序。您可以从每个对象中获取在图像中识别到的特征的有关信息。

    例如:

    Swift:

    1. for label in labels {
    2. let labelText = label.label
    3. let entityId = label.entityID
    4. let confidence = label.confidence
    5. }

    Objective-C:

    1. for (FIRVisionLabel *label in labels) {
    2. NSString *labelText = label.label;
    3. NSString *entityId = label.entityID;
    4. float confidence = label.confidence;
    5. }

基于云端的图片标注

要使用基于云端的图像标注模型,请按以下所述,对图像标注器进行配置和运行。

  1. 配置图像标注器

    默认情况下,云检测器使用STABLE版本的模型。如果您想要使用最新版本的模型,请按照以下示例创建一个VisionCloudDetectorOptions对象:

    Swift:

    1. let options = VisionCloudDetectorOptions()
    2. options.modelType = .latest
    3. options.maxResults = 20

    Objective-C:

    1. FIRVisionCloudDetectorOptions *options =
    2. [[FIRVisionCloudDetectorOptions alloc] init];
    3. options.modelType = FIRVisionCloudModelTypeLatest;
    4. options.maxResults = 20;

    在下一步中,VisionCloudDetectorOptions创建Cloud识别器对象时传递该对象。

  2. 运行图像标注器

    为了识别和标注在图片中的实体,将图像作为UIImage或传递CMSampleBufferRefVisionCloudLabelDetectordetectText(in:) 方法:

    1. 获取VisionCloudLabelDetector 实例:

      Swift:

      1. let labelDetector = Vision.vision().cloudLabelDetector()
      2. // 或者改变默认设定:
      3. // let labelDetector = Vision.vision().cloudLabelDetector(options: options)

      Objective-C:

      1. FIRVision *vision = [FIRVision vision];
      2. FIRVisionCloudLabelDetector *labelDetector = [vision cloudLabelDetector];
      3. // 或者,修改默认设定:
      4. // FIRVisionCloudLabelDetector *labelDetector =
      5. // [vision cloudLabelDetectorWithOptions:options];
    2. VisionImage使用UIImage或 创建一个对象CMSampleBufferRef

      使用UIImage

      1. 如有必要,旋转图像以使其imageOrientation 属性为.up

      2. VisionImage使用正确旋转的对象创建一个对象 UIImage。不要指定任何旋转元数据 - 默认值.topLeft,必须使用。

        Swift:

        1. let image = VisionImage(image: uiImage)

        Objective-C:

        1. FIRVisionImage *image = [[FIRVisionImage alloc] initWithImage:uiImage];

      使用CMSampleBufferRef

      1. 创建一个VisionImageMetadata对象,该对象指定包含在CMSampleBufferRef缓冲区中的图像数据的方向 。

        例如,如果图像数据必须顺时针旋转90度才能保持直立:

        Swift:

        1. let metadata = VisionImageMetadata()
        2. metadata.orientation = .rightTop // Row为0在右边,column为0则是在顶端

        Objective-C:

        1. // Row为0在右边,column为0则是在顶端
        2. FIRVisionImageMetadata *metadata = [[FIRVisionImageMetadata alloc] init];
        3. metadata.orientation = FIRVisionDetectorImageOrientationRightTop;
      2. VisionImage使用CMSampleBufferRef对象和旋转元数据创建一个对象 :

        Swift:

        1. let image = VisionImage(buffer: bufferRef)
        2. image.metadata = metadata

        Objective-C:

        1. FIRVisionImage *image = [[FIRVisionImage alloc] initWithBuffer:buffer];
        2. image.metadata = metadata;
    3. 然后,将图像传递给该detect(in:)方法:

      Swift:

      1. labelDetector.detect(in: visionImage) { (labels: [VisionCloudLabel]?, error: Error?) in
      2. guard error == nil, let labels = labels, !labels.isEmpty else {
      3. // ...
      4. return
      5. }
      6. // 标注后的图片
      7. // ...
      8. }

      Objective-C:

      1. [labelDetector detectInImage:image
      2. completion:^(NSArray<FIRVisionCloudLabel *> *labels,
      3. NSError *error) {
      4. if (error != nil || labels.count == 0) {
      5. return;
      6. }
      7. // 得到标签.将图片标签信息加入到FIRVisionCloudLabel.
      8. }];
  3. 获取对象的标签有关信息

    如果图像标签成功,则会将VisionCloudLabel对象数组传递给完成处理程序(completion handler)。您可以从每个对象中获取有关图像中识别的实体的信息。

    例如:

    Swift:

    1. for label in labels {
    2. let labelText = label.label
    3. let entityId = label.entityId
    4. let confidence = label.confidence
    5. }

    Objective-C:

    1. for (FIRVisionCloudLabel *label in labels) {
    2. NSString *labelText = label.label;
    3. NSString *entityId = label.entityId;
    4. float confidence = [label.confidence floatValue];
    5. }