Join us in person and online for Firebase Summit on October 18, 2022. Learn how Firebase can help you accelerate app development, release your app with confidence, and scale with ease. Register now

Apple 플랫폼에서 Firebase ML로 이미지에 레이블 지정

컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요.

Firebase ML을 사용하여 이미지에서 인식되는 객체에 레이블을 지정할 수 있습니다. 이 API의 기능에 대한 정보는 개요 를 참조하십시오.

시작하기 전에

    아직 앱에 Firebase를 추가하지 않았다면 시작하기 가이드 의 단계에 따라 추가하세요.

    Swift 패키지 관리자를 사용하여 Firebase 종속 항목을 설치하고 관리합니다.

    1. Xcode에서 앱 프로젝트를 연 상태에서 파일 > 패키지 추가 로 이동합니다.
    2. 메시지가 표시되면 Firebase Apple 플랫폼 SDK 저장소를 추가합니다.
    3.   https://github.com/firebase/firebase-ios-sdk
    4. Firebase ML 라이브러리를 선택합니다.
    5. 완료되면 Xcode는 백그라운드에서 종속성을 자동으로 해결하고 다운로드하기 시작합니다.

    다음으로 몇 가지 인앱 설정을 수행합니다.

    1. 앱에서 Firebase를 가져옵니다.

      빠른

      import FirebaseMLModelDownloader

      오브젝티브-C

      @import FirebaseMLModelDownloader;
  1. 프로젝트에 클라우드 기반 API를 아직 활성화하지 않았다면 지금 활성화하십시오.

    1. Firebase 콘솔의 Firebase ML API 페이지 를 엽니다.
    2. 아직 프로젝트를 Blaze 요금제로 업그레이드하지 않은 경우 업그레이드 를 클릭하여 업그레이드하십시오. (프로젝트가 Blaze 요금제에 없는 경우에만 업그레이드하라는 메시지가 표시됩니다.)

      Blaze 수준 프로젝트만 클라우드 기반 API를 사용할 수 있습니다.

    3. 클라우드 기반 API가 아직 활성화되지 않은 경우 클라우드 기반 API 활성화 를 클릭합니다.

이제 이미지에 레이블을 지정할 준비가 되었습니다.

1. 입력 이미지 준비

UIImage 또는 CMSampleBufferRef 를 사용하여 VisionImage 개체를 만듭니다.

UIImage 를 사용하려면:

  1. 필요한 경우 imageOrientation 속성이 .up 이 되도록 이미지를 회전합니다.
  2. 올바르게 회전된 UIImage 를 사용하여 VisionImage 객체를 만듭니다. 회전 메타데이터를 지정하지 마십시오. 기본값인 .topLeft 를 사용해야 합니다.

    빠른

    let image = VisionImage(image: uiImage)

    오브젝티브-C

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

CMSampleBufferRef 를 사용하려면:

  1. CMSampleBufferRef 버퍼에 포함된 이미지 데이터의 방향을 지정하는 VisionImageMetadata 개체를 만듭니다.

    이미지 방향을 얻으려면:

    빠른

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

    오브젝티브-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;
      }
    }

    그런 다음 메타데이터 개체를 만듭니다.

    빠른

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

    오브젝티브-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. CMSampleBufferRef 개체와 회전 메타데이터를 사용하여 VisionImage 개체를 만듭니다.

    빠른

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

    오브젝티브-C

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

2. 이미지 라벨러 구성 및 실행

이미지의 객체에 레이블을 지정하려면 VisionImage 객체를 VisionImageLabelerprocessImage() 메서드에 전달합니다.

  1. 먼저 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)
    

    오브젝티브-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. 그런 다음 이미지를 processImage() 메서드에 전달합니다.

    빠른

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

    오브젝티브-C

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

3. 레이블이 지정된 개체에 대한 정보 가져오기

이미지 라벨링이 성공하면 VisionImageLabel 객체의 배열이 완료 핸들러에 전달됩니다. 각 객체에서 이미지에서 인식된 특징에 대한 정보를 얻을 수 있습니다.

예를 들어:

빠른

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

오브젝티브-C

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

다음 단계

,

Firebase ML을 사용하여 이미지에서 인식되는 객체에 레이블을 지정할 수 있습니다. 이 API의 기능에 대한 정보는 개요 를 참조하십시오.

시작하기 전에

    아직 앱에 Firebase를 추가하지 않았다면 시작하기 가이드 의 단계에 따라 추가하세요.

    Swift 패키지 관리자를 사용하여 Firebase 종속 항목을 설치하고 관리합니다.

    1. Xcode에서 앱 프로젝트를 연 상태에서 파일 > 패키지 추가 로 이동합니다.
    2. 메시지가 표시되면 Firebase Apple 플랫폼 SDK 저장소를 추가합니다.
    3.   https://github.com/firebase/firebase-ios-sdk
    4. Firebase ML 라이브러리를 선택합니다.
    5. 완료되면 Xcode는 백그라운드에서 종속성을 자동으로 해결하고 다운로드하기 시작합니다.

    다음으로 몇 가지 인앱 설정을 수행합니다.

    1. 앱에서 Firebase를 가져옵니다.

      빠른

      import FirebaseMLModelDownloader

      오브젝티브-C

      @import FirebaseMLModelDownloader;
  1. 프로젝트에 클라우드 기반 API를 아직 활성화하지 않았다면 지금 활성화하십시오.

    1. Firebase 콘솔의 Firebase ML API 페이지 를 엽니다.
    2. 아직 프로젝트를 Blaze 요금제로 업그레이드하지 않은 경우 업그레이드 를 클릭하여 업그레이드하십시오. (프로젝트가 Blaze 요금제에 없는 경우에만 업그레이드하라는 메시지가 표시됩니다.)

      Blaze 수준 프로젝트만 클라우드 기반 API를 사용할 수 있습니다.

    3. 클라우드 기반 API가 아직 활성화되지 않은 경우 클라우드 기반 API 활성화 를 클릭합니다.

이제 이미지에 레이블을 지정할 준비가 되었습니다.

1. 입력 이미지 준비

UIImage 또는 CMSampleBufferRef 를 사용하여 VisionImage 개체를 만듭니다.

UIImage 를 사용하려면:

  1. 필요한 경우 imageOrientation 속성이 .up 이 되도록 이미지를 회전합니다.
  2. 올바르게 회전된 UIImage 를 사용하여 VisionImage 객체를 만듭니다. 회전 메타데이터를 지정하지 마십시오. 기본값인 .topLeft 를 사용해야 합니다.

    빠른

    let image = VisionImage(image: uiImage)

    오브젝티브-C

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

CMSampleBufferRef 를 사용하려면:

  1. CMSampleBufferRef 버퍼에 포함된 이미지 데이터의 방향을 지정하는 VisionImageMetadata 개체를 만듭니다.

    이미지 방향을 얻으려면:

    빠른

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

    오브젝티브-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;
      }
    }

    그런 다음 메타데이터 개체를 만듭니다.

    빠른

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

    오브젝티브-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. CMSampleBufferRef 개체와 회전 메타데이터를 사용하여 VisionImage 개체를 만듭니다.

    빠른

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

    오브젝티브-C

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

2. 이미지 라벨러 구성 및 실행

이미지의 객체에 레이블을 지정하려면 VisionImage 객체를 VisionImageLabelerprocessImage() 메서드에 전달합니다.

  1. 먼저 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)
    

    오브젝티브-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. 그런 다음 이미지를 processImage() 메서드에 전달합니다.

    빠른

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

    오브젝티브-C

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

3. 레이블이 지정된 개체에 대한 정보 가져오기

이미지 라벨링이 성공하면 VisionImageLabel 객체의 배열이 완료 핸들러에 전달됩니다. 각 객체에서 이미지에서 인식된 특징에 대한 정보를 얻을 수 있습니다.

예를 들어:

빠른

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

오브젝티브-C

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

다음 단계