Gắn nhãn hình ảnh bằng công nghệ học máy của Firebase trên các nền tảng của Apple

Bạn có thể sử dụng Firebase ML để gắn nhãn cho các đối tượng được nhận dạng trong hình ảnh. Hãy 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, hãy làm theo các bước trong hướng dẫn bắt đầu sử dụng.

    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 Firebase.

    1. Trong Xcode, khi dự án ứng dụng đang mở, hãy chuyển đến File > Add Packages (Tệp > Thêm gói).
    2. Khi được nhắc, hãy thêm kho lưu trữ SDK của các nền tảng Apple Firebase:
    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 Other Linker Flags (Cờ trình liên kết khác) trong phần cài đặt bản dựng của mục tiêu.
    6. Khi hoàn tất, Xcode sẽ tự động bắt đầu phân giải và tải các phần phụ thuộc xuống ở chế độ nền.

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

    1. Trong ứng dụng, hãy nhập Firebase:
      import FirebaseMLModelDownloader
      @import FirebaseMLModelDownloader;
  1. Nếu bạn chưa bật API dựa trên đám mây cho dự án của mình, hãy làm như sau:

    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 lên gói giá Blaze, hãy nhấp vào Nâng cấp để thực hiện việc này. (Bạn sẽ chỉ được nhắc nâng cấp nếu dự án của bạn không sử dụng 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 bạn chưa bật API dựa trên đám mây, 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 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.

Cách sử dụng UIImage:

  1. Nếu cần, hãy xoay hình ảnh để thuộc tính imageOrientation của hình ảnh đó là .up.
  2. Tạo đối tượng VisionImage bằng cách sử dụng UIImage được xoay chính xác. Không chỉ định siêu dữ liệu xoay nào – bạn phải sử dụng giá trị mặc định là .topLeft.
    let image = VisionImage(image: uiImage)
    FIRVisionImage *image = [[FIRVisionImage alloc] initWithImage:uiImage];

Cách 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 vùng đệm CMSampleBufferRef.

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

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

    let cameraPosition = AVCaptureDevice.Position.back  // Set to the capture device you used.
    let metadata = VisionImageMetadata()
    metadata.orientation = imageOrientation(
        deviceOrientation: UIDevice.current.orientation,
        cameraPosition: cameraPosition
    )
    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:
    let image = VisionImage(buffer: sampleBuffer)
    image.metadata = metadata
    FIRVisionImage *image = [[FIRVisionImage alloc] initWithBuffer:sampleBuffer];
    image.metadata = metadata;

2. Định cấu hình và chạy trình 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 processImage() của VisionImageLabeler.

  1. Trước tiên, hãy lấy một thực thể của 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)
    
    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():

    labeler.process(image) { labels, error in
        guard error == nil, let labels = labels else { return }
    
        // Task succeeded.
        // ...
    }
    
    [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 gắn nhãn

Nếu quá trình gắn nhãn hình ảnh thành công, một mảng các đối tượng VisionImageLabel sẽ được chuyển đến trình xử lý hoàn tất. 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 hình ảnh.

Ví dụ:

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

Các bước tiếp theo