콘솔로 이동

iOS에서 ML Kit를 사용하여 이미지 라벨 지정

ML Kit를 통해 기기별 모델 또는 클라우드 모델을 사용하여 이미지에서 인식된 객체에 라벨을 지정할 수 있습니다. 각 방법의 이점에 대해 알아보려면 개요를 참조하세요.

이 API의 사용 예는 GitHub의 ML Kit 빠른 시작 샘플을 참조하세요.

시작하기 전에

  1. 앱에 Firebase를 아직 추가하지 않은 경우 시작 가이드의 단계에 따라 추가합니다.
  2. Podfile에 ML Kit 라이브러리를 포함합니다.
    pod 'Firebase/Core'
    pod 'Firebase/MLVision'

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

    프로젝트의 포드를 설치하거나 업데이트한 후 .xcworkspace를 사용하여 Xcode 프로젝트를 열어야 합니다.
  3. 앱에서 Firebase를 가져옵니다.

    Swift

    import Firebase

    Objective-C

    @import Firebase;
  4. 클라우드 기반 모델을 사용하려는 경우 프로젝트에 클라우드 기반 API를 아직 사용 설정하지 않았으면 지금 설정하세요.

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

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

    3. Cloud 기반 API가 아직 사용 설정되지 않은 경우 Enable Cloud-based API(Cloud 기반 API 사용 설정)를 클릭합니다.

    기기별 모델만 사용하려는 경우 이 단계를 건너뛸 수 있습니다.

이제 기기별 모델 또는 클라우드 기반 모델을 사용하여 이미지에 라벨을 지정할 수 있습니다.

1. 입력 이미지 준비

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

UIImage를 사용하는 방법은 다음과 같습니다.

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

    Swift

    let image = VisionImage(image: uiImage)

    Objective-C

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

CMSampleBufferRef를 사용하는 방법은 다음과 같습니다.

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

    예를 들어 기기의 후면 카메라에서 캡처한 이미지 데이터를 사용하는 경우 다음과 같습니다.

    Swift

    let metadata = VisionImageMetadata()
    
    // Using back-facing camera
    let devicePosition: AVCaptureDevice.Position = .back
    
    let deviceOrientation = UIDevice.current.orientation
    switch deviceOrientation {
    case .portrait:
      metadata.orientation = devicePosition == .front ? .leftTop : .rightTop
    case .landscapeLeft:
      metadata.orientation = devicePosition == .front ? .bottomLeft : .topLeft
    case .portraitUpsideDown:
      metadata.orientation = devicePosition == .front ? .rightBottom : .leftBottom
    case .landscapeRight:
      metadata.orientation = devicePosition == .front ? .topRight : .bottomRight
    case .faceDown, .faceUp, .unknown:
      metadata.orientation = .leftTop
    }
    

    Objective-C

    // Calculate the image orientation
    FIRVisionDetectorImageOrientation orientation;
    
    // Using front-facing camera
    AVCaptureDevicePosition devicePosition = AVCaptureDevicePositionFront;
    
    UIDeviceOrientation deviceOrientation = UIDevice.currentDevice.orientation;
    switch (deviceOrientation) {
        case UIDeviceOrientationPortrait:
            if (devicePosition == AVCaptureDevicePositionFront) {
                orientation = FIRVisionDetectorImageOrientationLeftTop;
            } else {
                orientation = FIRVisionDetectorImageOrientationRightTop;
            }
            break;
        case UIDeviceOrientationLandscapeLeft:
            if (devicePosition == AVCaptureDevicePositionFront) {
                orientation = FIRVisionDetectorImageOrientationBottomLeft;
            } else {
                orientation = FIRVisionDetectorImageOrientationTopLeft;
            }
            break;
        case UIDeviceOrientationPortraitUpsideDown:
            if (devicePosition == AVCaptureDevicePositionFront) {
                orientation = FIRVisionDetectorImageOrientationRightBottom;
            } else {
                orientation = FIRVisionDetectorImageOrientationLeftBottom;
            }
            break;
        case UIDeviceOrientationLandscapeRight:
            if (devicePosition == AVCaptureDevicePositionFront) {
                orientation = FIRVisionDetectorImageOrientationTopRight;
            } else {
                orientation = FIRVisionDetectorImageOrientationBottomRight;
            }
            break;
        default:
            orientation = FIRVisionDetectorImageOrientationTopLeft;
            break;
    }
    
    FIRVisionImageMetadata *metadata = [[FIRVisionImageMetadata alloc] init];
    metadata.orientation = orientation;
    
  2. CMSampleBufferRef 객체 및 회전 메타데이터를 사용하여 VisionImage 객체를 만듭니다.

    Swift

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

    Objective-C

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

2. 이미지 레이블러 구성 및 실행

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

  1. 우선 VisionImageLabeler의 인스턴스를 가져옵니다.

    기기별 이미지 레이블러를 사용하려면 다음 안내를 따르세요.

    Swift

    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)
    

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

    클라우드 이미지 레이블러를 사용하려면 다음 안내를 따르세요.

    Swift

    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)
    

    Objective-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() 메소드에 전달합니다.

    Swift

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

    Objective-C

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

3. 라벨이 지정된 객체 정보 가져오기

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

예를 들면 다음과 같습니다.

Swift

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

Objective-C

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

실시간 성능 향상을 위한 팁

실시간 애플리케이션에서 이미지 라벨을 지정하려는 경우 최상의 프레임 속도를 얻으려면 다음 안내를 따르세요.

  • 이미지 레이블러 호출을 제한합니다. 이미지 레이블러가 실행 중일 때 새 동영상 프레임이 제공되는 경우 프레임을 낮춥니다.

다음 단계

Cloud API를 사용하는 앱을 프로덕션 환경에 배포하기 전에 승인되지 않은 API 액세스로 인한 영향을 방지하고 완화하려면 몇 가지 추가 조치를 수행해야 합니다.