Google 致力于为黑人社区推动种族平等。查看具体举措

在 iOS 上使用 Firebase ML 标记图像

您可以使用 Firebase ML 来标记图像中识别的对象。请参阅概述有关该API的功能的信息。

在你开始之前

  1. 如果您尚未添加火力地堡到您的应用程序,通过遵循的步骤做这样的入门指南
  2. 在Podfile包括火力地堡:
    pod 'Firebase/MLVision'
    
    您安装或更新项目的吊舱后,一定要使用它的打开你的Xcode项目.xcworkspace
  3. 在您的应用中,导入 Firebase:

    迅速

    import Firebase

    目标-C

    @import Firebase;
  4. 如果您尚未为您的项目启用基于云的 API,请立即启用:

    1. 打开火力地堡ML API页面的火力地堡控制台。
    2. 如果您尚未升级您的项目以大火定价计划,单击升级到这样做。 (仅当您的项目不在 Blaze 计划中时,系统才会提示您升级。)

      只有 Blaze 级别的项目可以使用基于云的 API。

    3. 如果基于云的API尚未启用,单击启用基于云的API。

现在您已准备好标记图像。

1.准备输入图像

创建VisionImage使用对象UIImageCMSampleBufferRef

要使用UIImage

  1. 如果有必要,旋转图像,使其imageOrientation属性是.up
  2. 创建VisionImage使用正确旋转物体UIImage 。不指定任何旋转元数据的默认值, .topLeft ,必须使用。

    迅速

    let image = VisionImage(image: uiImage)

    目标-C

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

要使用CMSampleBufferRef

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

    要获取图像方向:

    迅速

    func imageOrientation(
        deviceOrientation: UIDeviceOrientation,
        cameraPosition: AVCaptureDevice.Position
        ) -> VisionDetectorImageOrientation {
        switch deviceOrientation {
        case .portrait:
            return cameraPosition == .front ? .leftTop : .rightTop
        case .landscapeLeft:
            return cameraPosition == .front ? .bottomLeft : .topLeft
        case .portraitUpsideDown:
            return cameraPosition == .front ? .rightBottom : .leftBottom
        case .landscapeRight:
            return cameraPosition == .front ? .topRight : .bottomRight
        case .faceDown, .faceUp, .unknown:
            return .leftTop
        }
    }

    目标-C

    - (FIRVisionDetectorImageOrientation)
        imageOrientationFromDeviceOrientation:(UIDeviceOrientation)deviceOrientation
                               cameraPosition:(AVCaptureDevicePosition)cameraPosition {
      switch (deviceOrientation) {
        case UIDeviceOrientationPortrait:
          if (cameraPosition == AVCaptureDevicePositionFront) {
            return FIRVisionDetectorImageOrientationLeftTop;
          } else {
            return FIRVisionDetectorImageOrientationRightTop;
          }
        case UIDeviceOrientationLandscapeLeft:
          if (cameraPosition == AVCaptureDevicePositionFront) {
            return FIRVisionDetectorImageOrientationBottomLeft;
          } else {
            return FIRVisionDetectorImageOrientationTopLeft;
          }
        case UIDeviceOrientationPortraitUpsideDown:
          if (cameraPosition == AVCaptureDevicePositionFront) {
            return FIRVisionDetectorImageOrientationRightBottom;
          } else {
            return FIRVisionDetectorImageOrientationLeftBottom;
          }
        case UIDeviceOrientationLandscapeRight:
          if (cameraPosition == AVCaptureDevicePositionFront) {
            return FIRVisionDetectorImageOrientationTopRight;
          } else {
            return FIRVisionDetectorImageOrientationBottomRight;
          }
        default:
          return FIRVisionDetectorImageOrientationTopLeft;
      }
    }

    然后,创建元数据对象:

    迅速

    let cameraPosition = AVCaptureDevice.Position.back  // Set to the capture device you used.
    let metadata = VisionImageMetadata()
    metadata.orientation = imageOrientation(
        deviceOrientation: UIDevice.current.orientation,
        cameraPosition: cameraPosition
    )

    目标-C

    FIRVisionImageMetadata *metadata = [[FIRVisionImageMetadata alloc] init];
    AVCaptureDevicePosition cameraPosition =
        AVCaptureDevicePositionBack;  // Set to the capture device you used.
    metadata.orientation =
        [self imageOrientationFromDeviceOrientation:UIDevice.currentDevice.orientation
                                     cameraPosition:cameraPosition];
  2. 创建VisionImage使用对象CMSampleBufferRef对象和旋转元数据:

    迅速

    let image = VisionImage(buffer: sampleBuffer)
    image.metadata = metadata

    目标-C

    FIRVisionImage *image = [[FIRVisionImage alloc] initWithBuffer:sampleBuffer];
    image.metadata = metadata;

2. 配置并运行图像标注器

到标签的图像中的对象,通过VisionImage对象到VisionImageLabelerprocessImage()方法。

  1. 首先,获取的实例VisionImageLabeler

    迅速

    let labeler = Vision.vision().cloudImageLabeler()
    
    // Or, to set the minimum confidence required:
    // let options = VisionCloudImageLabelerOptions()
    // options.confidenceThreshold = 0.7
    // let labeler = Vision.vision().cloudImageLabeler(options: options)
    

    目标-C

    FIRVisionImageLabeler *labeler = [[FIRVision vision] cloudImageLabeler];
    
    // Or, to set the minimum confidence required:
    // FIRVisionCloudImageLabelerOptions *options =
    //         [[FIRVisionCloudImageLabelerOptions alloc] init];
    // options.confidenceThreshold = 0.7;
    // FIRVisionImageLabeler *labeler =
    //         [[FIRVision vision] cloudImageLabelerWithOptions:options];
    
  2. 然后,图像传递到processImage()方法:

    迅速

    labeler.process(image) { labels, error in
        guard error == nil, let labels = labels else { return }
    
        // Task succeeded.
        // ...
    }
    

    目标-C

    [labeler processImage:image
               completion:^(NSArray<FIRVisionImageLabel *> *_Nullable labels,
                            NSError *_Nullable error) {
                   if (error != nil) { return; }
    
                   // Task succeeded.
                   // ...
               }];
    

3. 获取标签对象的信息

如果图像标记成功,阵列VisionImageLabel对象将被传递到完成处理程序。从每个对象中,您可以获得有关图像中识别的特征的信息。

例如:

迅速

for label in labels {
    let labelText = label.text
    let entityId = label.entityID
    let confidence = label.confidence
}

目标-C

for (FIRVisionImageLabel *label in labels) {
   NSString *labelText = label.text;
   NSString *entityId = label.entityID;
   NSNumber *confidence = label.confidence;
}

下一步