Catch up on everthing we announced at this year's Firebase Summit. Learn more

Oznacz obrazy za pomocą zestawu ML na iOS

Możesz użyć ML Kit do etykietowania obiektów rozpoznanych na obrazie, używając modelu na urządzeniu lub modelu w chmurze. Zobacz przegląd , aby dowiedzieć się o korzyściach płynących z każdego podejścia.

Zanim zaczniesz

  1. Jeśli nie masz już dodane Firebase do aplikacji, należy to zrobić, wykonując czynności opisane w podręcznej instrukcji .
  2. Obejmują biblioteki ML KIT w swojej Podfile:
    pod 'Firebase/MLVision', '6.25.0'

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

    Po zainstalowaniu lub aktualizacji Pods Twojego projektu, należy otworzyć swój projekt Xcode używając jego .xcworkspace .
  3. W swojej aplikacji zaimportuj Firebase:

    Szybki

    import Firebase

    Cel C

    @import Firebase;
  4. Jeśli chcesz korzystać z modelu opartego na chmurze, a nie masz jeszcze włączonych interfejsów API opartych na chmurze dla swojego projektu, zrób to teraz:

    1. Otwórz stronę ML Kit API konsoli Firebase.
    2. Jeśli nie masz już uaktualniony projekt do planu cenowego Blaze, kliknij przycisk Zmień, aby to zrobić. (Zostaniesz poproszony o uaktualnienie tylko wtedy, gdy Twój projekt nie jest objęty planem Blaze).

      Tylko projekty na poziomie Blaze mogą korzystać z interfejsów API opartych na chmurze.

    3. Jeśli API w chmurze nie są już włączone, kliknij przycisk Włącz API chmurowej.

    Jeśli chcesz używać tylko modelu na urządzeniu, możesz pominąć ten krok.

Teraz możesz oznaczyć obrazy etykietami za pomocą modelu na urządzeniu lub modelu opartego na chmurze.

1. Przygotuj obraz wejściowy

Tworzenie VisionImage obiektu przy użyciu UIImage lub CMSampleBufferRef .

Aby użyć UIImage :

  1. W razie potrzeby obrócić obraz tak, aby jego imageOrientation nieruchomość jest .up .
  2. Tworzenie VisionImage obiekt za pomocą prawidłowo obrócony UIImage . Nie określają żadnej rotacji metadanych-wartość domyślną, .topLeft , muszą być stosowane.

    Szybki

    let image = VisionImage(image: uiImage)

    Cel C

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

Aby użyć CMSampleBufferRef :

  1. Tworzenie VisionImageMetadata obiekt, który Określa orientację danych obrazu zawartych w CMSampleBufferRef bufora.

    Aby uzyskać orientację obrazu:

    Szybki

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

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

    Następnie utwórz obiekt metadanych:

    Szybki

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

    Cel 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. Tworzenie VisionImage obiekt używając CMSampleBufferRef przedmiotu oraz metadane obrotów:

    Szybki

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

    Cel C

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

2. Skonfiguruj i uruchom program do etykietowania obrazów

Do etykiety obiektów w obrazie, przechodzą VisionImage obiekt do VisionImageLabeler jest processImage() sposobu.

  1. Po pierwsze, uzyskać instancję VisionImageLabeler .

    Jeśli chcesz użyć urządzenia do etykietowania obrazów na urządzeniu:

    Szybki

    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)
    

    Cel 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];
    

    Jeśli chcesz użyć drukarki do etykietowania obrazów w chmurze:

    Szybki

    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)
    

    Cel 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. Następnie przechodzi się obraz na processImage() sposobu:

    Szybki

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

    Cel C

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

3. Uzyskaj informacje o oznaczonych obiektach

Jeżeli oznakowanie obrazu powiedzie, tablica VisionImageLabel przedmioty zostaną przekazane do obsługi realizacji. Z każdego obiektu można uzyskać informacje o funkcji rozpoznanej na obrazie.

Na przykład:

Szybki

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

Cel C

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

Wskazówki dotyczące poprawy wydajności w czasie rzeczywistym

Jeśli chcesz opisywać obrazy w aplikacji działającej w czasie rzeczywistym, postępuj zgodnie z poniższymi wskazówkami, aby uzyskać najlepszą liczbę klatek na sekundę:

  • Ogranicz połączenia do drukarki etykiet obrazów. Jeśli nowa ramka wideo stanie się dostępna, gdy drukarka etykiet obrazu jest uruchomiona, upuść ramkę.
  • Jeśli używasz danych wyjściowych drukarki etykiet do nakładania grafiki na obraz wejściowy, najpierw pobierz wynik z ML Kit, a następnie wyrenderuj obraz i nakładkę w jednym kroku. W ten sposób renderujesz na powierzchnię wyświetlania tylko raz dla każdej klatki wejściowej. Zobacz previewOverlayView i FIRDetectionOverlayView zajęcia w próbce aplikacji Prezentacja na przykład.

Następne kroki