Google cam kết thúc đẩy công bằng chủng tộc cho Cộng đồng người da đen. Xem cách thực hiện.
Trang này được dịch bởi Cloud Translation API.
Switch to English

Dán nhãn hình ảnh với ML Kit trên iOS

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

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 làm như vậy bằng cách làm theo các bước trong hướng dẫn bắt đầu .
  2. Bao gồm các thư viện ML Kit trong 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 bạn cài đặt hoặc cập nhật Pods của dự án, hãy nhớ mở dự án Xcode bằng cách sử dụng .xcworkspace của nó.
  3. Trong ứng dụng của bạn, nhập Firebase:

    Nhanh

    import Firebase

    Mục tiêu-C

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

    1. Mở trang API ML Kit của bảng điều khiển Firebase.
    2. Nếu bạn chưa nâng cấp dự án của mình lên gói Blaze, hãy nhấp vào Nâng cấp để thực hiện. (Bạn sẽ được nhắc nâng cấp chỉ khi dự án của bạn không nằm trong kế hoạch Blaze.)

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

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

    Nếu bạn chỉ muốn sử dụng kiểu máy 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 hình ảnh bằng mô hình trên thiết bị hoặc mô hình dựa trên đám mây.

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

Tạo một đối tượng VisionImage bằng cách sử dụng UIImage hoặc CMSampleBufferRef .

Để sử dụng UIImage :

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

    Nhanh

    let image = VisionImage(image: uiImage)

    Mục tiêu-C

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

Để sử dụng CMSampleBufferRef :

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

    Để có được định hướng hình ảnh:

    Nhanh

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

    Mục tiêu-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 đó, tạo đối tượng siêu dữ liệu:

    Nhanh

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

    Mục tiêu-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 một đối tượng VisionImage bằng cách sử dụng đối tượng CMSampleBufferRef và siêu dữ liệu xoay vòng:

    Nhanh

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

    Mục tiêu-C

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

2. Cấu hình và chạy trình ghi nhãn hình ảnh

Để gắn nhãn các đối tượng trong một hình ảnh, hãy chuyển đối tượng VisionImage sang phương thức processImage() của VisionImageLabeler .

  1. Đầu tiên, lấy một ví dụ của VisionImageLabeler .

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

    Nhanh

     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)
     

    Mục tiêu-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 trình ghi nhãn hình ảnh đám mây:

    Nhanh

     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)
     

    Mục tiêu-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 đó, truyền hình ảnh cho phương thức processImage() :

    Nhanh

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

    Mục tiêu-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ề các đối tượng được dán nhãn

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

Ví dụ:

Nhanh

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

Mục tiêu-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 thời gian thực

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

  • Các cuộc gọi ga đến nhãn hiệu hình ảnh. Nếu một khung video mới có sẵn trong khi trình dán nhãn hình ảnh đang chạy, hãy bỏ khung.
  • Nếu bạn đang sử dụng đầu ra của trình ghi nhãn hình ảnh để phủ lớp đồ họa lên hình ảnh đầu vào, trước tiên hãy lấy kết quả từ ML Kit, sau đó kết xuất hình ảnh và lớp phủ trong một bước duy nhất. Bằng cách đó, bạn chỉ hiển thị bề mặt hiển thị một lần cho mỗi khung hình đầu vào. Xem các lớp previewOverlayViewFIRDetectionOverlayView trong ứng dụng mẫu giới thiệu để biết ví dụ.

Bước tiếp theo