Gắn nhãn hình ảnh bằng Firebase ML trên nền tảng Apple

Bạn có thể sử dụng Firebase ML để gắn nhãn các đối tượng được nhận dạng trong hình ảnh. Xem phần tổng quan để biết thông tin về các tính năng của API này.

Trước khi bắt đầu

    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 .

    Sử dụng Trình quản lý gói Swift để cài đặt và quản lý các phần phụ thuộc của Firebase.

    1. Trong Xcode, khi dự án ứng dụng của bạn đang mở, hãy điều hướng đến File > Add Packages .
    2. Khi được nhắc, hãy thêm kho lưu trữ SDK nền tảng Firebase của Apple:
    3.   https://github.com/firebase/firebase-ios-sdk.git
    4. Chọn thư viện Firebase ML.
    5. Thêm cờ -ObjC vào phần Cờ liên kết khác trong cài đặt bản dựng của mục tiêu của bạn.
    6. Khi hoàn tất, Xcode sẽ tự động bắt đầu phân giải và tải xuống các phần phụ thuộc của bạn ở chế độ nền.

    Tiếp theo, thực hiện một số thiết lập trong ứng dụng:

    1. Trong ứng dụng của bạn, hãy nhập Firebase:

      Nhanh

      import FirebaseMLModelDownloader

      Mục tiêu-C

      @import FirebaseMLModelDownloader;
  1. Nếu 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 Firebase ML 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 giá Blaze, hãy nhấp vào Nâng cấp để thực hiện. (Bạn sẽ chỉ được nhắc nâng cấp nếu dự án của bạn không nằm trong gói 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 .

Bây giờ bạn đã sẵn sàng để gắn nhãn cho hình ảnh.

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

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

Để sử dụng UIImage :

  1. Nếu cần, hãy xoay hình ảnh sao cho thuộc tính imageOrientation của 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 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 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:

    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 gắn nhãn ảnh

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

  1. Đầu tiên, lấy một phiên bản của VisionImageLabeler :

    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 đó, chuyển hình ảnh tới 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ề đối tượng được dán nhãn

Nếu việc gắn nhãn hình ảnh thành công, một mảng đối tượng VisionImageLabel 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 thông tin về một đặc điểm được nhận dạng trong ả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;
}

Bước tiếp theo