Gắn nhãn hình ảnh bằng Bộ công cụ học máy trên iOS

Bạn có thể dùng Bộ công cụ học máy để gắn nhãn các đối tượng nhận dạng được trong hình ảnh bằng cách sử dụng mô hình trên thiết bị hoặc mô hình trên đám mây. Xem Overview (Tổng quan) để tìm hiểu về các lợi ích của mỗi phương pháp tiếp cận.

Trước khi bắt đầu

  1. Nếu bạn chưa thêm Firebase vào ứng dụng của mình, hãy thực hiện bằng cách làm theo hướng dẫn các bước trong hướng dẫn bắt đầu sử dụng.
  2. Thêm các thư viện Bộ công cụ học máy vào Podfile của bạn:
    pod 'Firebase/MLVision', '6.25.0'

    # If using the on-device API: pod 'Firebase/MLVisionLabelModel', '6.25.0'

    Sau khi cài đặt hoặc cập nhật Nhóm của dự án, hãy nhớ mở Xcode bằng cách sử dụng .xcworkspace của nó.
  3. Trong ứng dụng của bạn, hãy nhập Firebase:

    Swift

    import Firebase

    Objective-C

    @import Firebase;
  4. Nếu bạn muốn sử dụng mô hình trên đám mây và chưa bật các API trên đám mây cho dự án của bạn, hãy thực hiện ngay bây giờ:

    1. Mở Bộ công cụ học máy trang API của bảng điều khiển của Firebase.
    2. Nếu bạn chưa nâng cấp dự án của mình lên Gói giá linh hoạt, hãy nhấp vào Hãy nâng cấp để làm điều này. (Bạn sẽ chỉ được nhắc nâng cấp nếu không có trong Kế hoạch linh hoạt.)

      Chỉ các dự án cấp Blaze mới có thể sử dụng API trên đám mây.

    3. Nếu bạn chưa bật API trên đám mây, hãy nhấp vào Bật API dựa trên đám mây API.

    Nếu chỉ muốn sử dụng mẫu trên thiết bị, bạn có thể bỏ qua bước này.

Bây giờ, bạn đã sẵn sàng để gắn nhãn cho hình ảnh bằng cách sử dụng mẫu trên thiết bị hoặc dựa trên đám mây.

1. Chuẩn bị hình ảnh đầu vào

Tạo đối tượng VisionImage bằng UIImage hoặc CMSampleBufferRef.

Cách sử dụng UIImage:

  1. Nếu cần, hãy xoay hình ảnh để imageOrientation.up.
  2. Tạo đối tượng VisionImage bằng chế độ xoay chính xác UIImage. Không chỉ định bất kỳ siêu dữ liệu xoay vòng nào—mặc định bạn phải sử dụng giá trị .topLeft.

    Swift

    let image = VisionImage(image: uiImage)

    Objective-C

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

Cách sử dụng CMSampleBufferRef:

  1. Tạo đối tượng VisionImageMetadata chỉ định của dữ liệu hình ảnh chứa trong Vùng đệm CMSampleBufferRef.

    Cách lấy hướng ảnh:

    Swift

    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
        }
    }

    Objective-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;
      }
    }

    Sau đó, hãy tạo đối tượng siêu dữ liệu:

    Swift

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

    Objective-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. Tạo đối tượng VisionImage bằng Đối tượng CMSampleBufferRef và siêu dữ liệu xoay:

    Swift

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

    Objective-C

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

2. Định cấu hình và chạy công cụ gắn nhãn hình ảnh

Để gắn nhãn cho các đối tượng trong hình ảnh, hãy truyền đối tượng VisionImage vào phương thức Phương thức processImage() của VisionImageLabeler.

  1. Trước tiên, hãy lấy một thực thể của VisionImageLabeler.

    Nếu bạn muốn sử dụng công cụ gắn nhãn hình ảnh trên thiết bị:

    Swift

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

    Objective-C

    FIRVisionImageLabeler *labeler = [[FIRVision vision] onDeviceImageLabeler];
    
    // Or, to set the minimum confidence required:
    // FIRVisionOnDeviceImageLabelerOptions *options =
    //         [[FIRVisionOnDeviceImageLabelerOptions alloc] init];
    // options.confidenceThreshold = 0.7;
    // FIRVisionImageLabeler *labeler =
    //         [[FIRVision vision] onDeviceImageLabelerWithOptions:options];
    

    Nếu bạn muốn sử dụng công cụ gắn nhãn hình ảnh trên đám mây, hãy làm như sau:

    Swift

    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)
    

    Objective-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. Sau đó, hãy truyền hình ảnh đó vào phương thức processImage():

    Swift

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

    Objective-C

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

3. Nhận thông tin về đối tượng được gắn nhãn

Nếu gắn nhãn hình ảnh thành công, một mảng VisionImageLabel các đối tượng này sẽ được chuyển đến trình xử lý hoàn thành. Từ mỗi đối tượng, bạn có thể lấy được thông tin về đối tượng nhận diện được trong hình ảnh.

Ví dụ:

Swift

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

Objective-C

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

Mẹo cải thiện hiệu suất theo thời gian thực

Nếu bạn muốn gắn nhãn cho hình ảnh trong một ứng dụng theo thời gian thực, hãy làm theo các bước sau để đạt được tốc độ khung hình tốt nhất:

  • Điều tiết các lệnh gọi đến công cụ gắn nhãn hình ảnh. Nếu một khung video mới khi trình gắn nhãn hình ảnh đang chạy, hãy thả khung.
  • Nếu bạn đang sử dụng đầu ra của công cụ gắn nhãn hình ảnh để phủ đồ hoạ lên hình ảnh đầu vào, trước tiên hãy lấy kết quả từ Bộ công cụ học máy, sau đó kết xuất hình ảnh và phủ lên trên trong một bước duy nhất. Khi làm vậy, bạn sẽ kết xuất lên giao diện màn hình một lần cho mỗi khung đầu vào. Xem previewOverlayViewFIRDetectionOverlayView trong ứng dụng mẫu Showcase.

Các bước tiếp theo