iOS에서 AutoML 학습 모델을 사용하여 이미지 라벨 지정

<ph type="x-smartling-placeholder">

AutoML Vision Edge를 사용하여 자체 모델을 학습시킨 후에는 다음 안내를 따르세요. 앱에서 이를 사용하여 이미지에 라벨을 지정할 수 있습니다

AutoML Vision Edge에서 학습된 모델을 통합하는 방법에는 두 가지가 있습니다. 다음을 수행할 수 있습니다. 모델의 파일을 Xcode 프로젝트에 복사하여 모델을 번들로 묶습니다. Firebase에서 동적으로 다운로드할 수 있습니다.

모델 번들 옵션
앱에 번들로 제공
  • 모델이 번들에 포함됨
  • iOS 기기가 오프라인 상태일 때도 모델을 즉시 사용할 수 있습니다.
  • Firebase 프로젝트가 필요하지 않음
Firebase로 호스팅
  • 모델을 업로드하여 Firebase 머신러닝
  • App Bundle 크기 줄이기
  • 모델이 요청 시 다운로드됩니다.
  • 앱을 다시 게시할 필요 없이 모델 업데이트 푸시
  • Firebase 원격 구성으로 간편하게 A/B 테스트 진행
  • Firebase 프로젝트 필요

사용해 보기

  • 샘플 앱을 사용하여 이 API의 사용 예를 참조하세요.

시작하기 전에

1. Podfile에 ML Kit 라이브러리를 포함합니다.

모델을 앱과 번들로 묶는 방법은 다음과 같습니다.
    pod 'GoogleMLKit/ImageLabelingAutoML'
    
Firebase에서 모델을 동적으로 다운로드하려면 LinkFirebase 종속됩니다.
    pod 'GoogleMLKit/ImageLabelingAutoML'
    pod 'GoogleMLKit/LinkFirebase'
    
2. 프로젝트의 포드를 설치하거나 업데이트한 후 Xcode 프로젝트를 엽니다. .xcworkspacecode>를 사용합니다. ML Kit는 Xcode에서 지원됨 버전 13.2.1 이상이 필요합니다. 3. 모델을 다운로드하려면 iOS 프로젝트에 Firebase 추가 '확인'을 클릭하세요. 이 작업은 있습니다.

1. 모델 로드

로컬 모델 소스 구성

모델을 앱과 번들로 묶으려면 다음 안내를 따르세요.

1. 다운로드한 zip 보관 파일에서 모델과 모델의 메타데이터를 추출합니다. Firebase Console에서 폴더로 복사합니다.
    your_model_directory
      |____dict.txt
      |____manifest.json
      |____model.tflite
    
세 파일이 모두 같은 폴더에 있어야 합니다. 이러한 파일은 다운로드한 파일을 그대로 유지한 채 수정 (파일 이름 포함)하지 않습니다.

2. 폴더를 Xcode 프로젝트에 복사합니다. 이때 신중하게 선택해야 합니다. 이때 폴더 참조를 만듭니다. 모델 파일 및 메타데이터 App Bundle에 포함되어 ML Kit에서 사용할 수 있습니다.

3. AutoMLImageLabelerLocalModel 객체를 만들고 모델 매니페스트 파일:

Swift

guard let manifestPath = Bundle.main.path(
    forResource: "manifest",
    ofType: "json",
    inDirectory: "your_model_directory"
) else { return }
let localModel = AutoMLImageLabelerLocalModel(manifestPath: manifestPath)

Objective-C

NSString *manifestPath =
    [NSBundle.mainBundle pathForResource:@"manifest"
                                  ofType:@"json"
                             inDirectory:@"your_model_directory"];
MLKAutoMLImageLabelerLocalModel *localModel =
    [[MLKAutoMLImageLabelerLocalModel alloc] initWithManifestPath:manifestPath];

Firebase 호스팅 모델 소스 구성

원격 호스팅 모델을 사용하려면 AutoMLImageLabelerRemoteModel를 만드세요. 객체로서 모델을 게시할 때 할당한 이름을 지정합니다.

Swift

let remoteModel = AutoMLImageLabelerRemoteModel(
    name: "your_remote_model"  // The name you assigned in
                               // the Firebase console.
)

Objective-C

MLKAutoMLImageLabelerRemoteModel *remoteModel =
    [[MLKAutoMLImageLabelerRemoteModel alloc]
        initWithName:@"your_remote_model"];  // The name you assigned in
                                             // the Firebase console.

그런 다음 모델을 다운로드할 조건을 지정하여 모델 다운로드 작업을 선택합니다. 모델이 기기에 없거나 최신 모델이 사용 가능해지면 태스크는 DAG를 비동기식으로 있습니다.

Swift

let downloadConditions = ModelDownloadConditions(
  allowsCellularAccess: true,
  allowsBackgroundDownloading: true
)

let downloadProgress = ModelManager.modelManager().download(
  remoteModel,
  conditions: downloadConditions
)

Objective-C

MLKModelDownloadConditions *downloadConditions =
    [[MLKModelDownloadConditions alloc] initWithAllowsCellularAccess:YES
                                         allowsBackgroundDownloading:YES];

NSProgress *downloadProgress =
    [[MLKModelManager modelManager] downloadModel:remoteModel
                                       conditions:downloadConditions];

대부분의 앱은 초기화 코드에서 다운로드 작업을 시작하지만 모델을 사용하기 전에 언제든지 이 작업을 할 수 있습니다.

모델에서 이미지 라벨러 만들기

모델 소스를 구성한 후 모델 소스에서 ImageLabeler 객체를 만듭니다. 있습니다.

로컬로 번들된 모델만 있다면 AutoMLImageLabelerLocalModel 객체 및 신뢰도 점수 구성 원하는 기준점을 설정할 수 있습니다 (모드 평가 참고).

Swift

let options = AutoMLImageLabelerOptions(localModel: localModel)
options.confidenceThreshold = NSNumber(value: 0.0)  // Evaluate your model in the Firebase console
                                                    // to determine an appropriate value.
let imageLabeler = ImageLabeler.imageLabeler(options: options)

Objective-C

MLKAutoMLImageLabelerOptions *options =
    [[MLKAutoMLImageLabelerOptions alloc] initWithLocalModel:localModel];
options.confidenceThreshold = @(0.0);  // Evaluate your model in the Firebase console
                                       // to determine an appropriate value.
MLKImageLabeler *imageLabeler =
    [MLKImageLabeler imageLabelerWithOptions:options];

원격 호스팅 모델이 있는 경우에는 모델이 다운로드할 수 있습니다. 모델 다운로드 상태를 확인할 수 있습니다. 모델 관리자의 isModelDownloaded(remoteModel:) 메서드를 사용하여 작업을 실행하면 안 됩니다.

이는 라벨러를 실행하기 전에만 확인하면 되지만 원격 호스팅 모델과 로컬로 번들된 모델이 모두 있는 경우 ImageLabeler를 인스턴스화할 때 이 확인을 실행하는 것이 좋습니다. 원격 모델에서 라벨러를 가져오고(다운로드된 경우) 로컬 모델에서 라벨을 지정합니다. 없습니다.

Swift

var options: AutoMLImageLabelerOptions!
if (ModelManager.modelManager().isModelDownloaded(remoteModel)) {
  options = AutoMLImageLabelerOptions(remoteModel: remoteModel)
} else {
  options = AutoMLImageLabelerOptions(localModel: localModel)
}
options.confidenceThreshold = NSNumber(value: 0.0)  // Evaluate your model in the Firebase console
                                                    // to determine an appropriate value.
let imageLabeler = ImageLabeler.imageLabeler(options: options)

Objective-C

MLKAutoMLImageLabelerOptions *options;
if ([[MLKModelManager modelManager] isModelDownloaded:remoteModel]) {
  options = [[MLKAutoMLImageLabelerOptions alloc] initWithRemoteModel:remoteModel];
} else {
  options = [[MLKAutoMLImageLabelerOptions alloc] initWithLocalModel:localModel];
}
options.confidenceThreshold = @(0.0);  // Evaluate your model in the Firebase console
                                       // to determine an appropriate value.
MLKImageLabeler *imageLabeler =
    [MLKImageLabeler imageLabelerWithOptions:options];

원격 호스팅 모델만 있는 경우 모델 관련 사용을 중지해야 합니다. 비활성화되거나 UI의 일부를 숨기는 등의 작업을 할 수 없습니다. 모델이 다운로드되었음을 확인합니다.

기본값에 관찰자를 연결하여 모델 다운로드 상태를 가져올 수 있습니다. 알림 센터를 탭합니다. 관찰자에서 self의 약한 참조를 사용해야 합니다. 다운로드하는 데 시간이 걸릴 수 있고 원래 객체는 다운로드가 완료되면 해제됩니다. 예를 들면 다음과 같습니다.

Swift

NotificationCenter.default.addObserver(
    forName: .mlkitModelDownloadDidSucceed,
    object: nil,
    queue: nil
) { [weak self] notification in
    guard let strongSelf = self,
        let userInfo = notification.userInfo,
        let model = userInfo[ModelDownloadUserInfoKey.remoteModel.rawValue]
            as? RemoteModel,
        model.name == "your_remote_model"
        else { return }
    // The model was downloaded and is available on the device
}

NotificationCenter.default.addObserver(
    forName: .mlkitModelDownloadDidFail,
    object: nil,
    queue: nil
) { [weak self] notification in
    guard let strongSelf = self,
        let userInfo = notification.userInfo,
        let model = userInfo[ModelDownloadUserInfoKey.remoteModel.rawValue]
            as? RemoteModel
        else { return }
    let error = userInfo[ModelDownloadUserInfoKey.error.rawValue]
    // ...
}

Objective-C

__weak typeof(self) weakSelf = self;

[NSNotificationCenter.defaultCenter
    addObserverForName:MLKModelDownloadDidSucceedNotification
                object:nil
                 queue:nil
            usingBlock:^(NSNotification *_Nonnull note) {
              if (weakSelf == nil | note.userInfo == nil) {
                return;
              }
              __strong typeof(self) strongSelf = weakSelf;

              MLKRemoteModel *model = note.userInfo[MLKModelDownloadUserInfoKeyRemoteModel];
              if ([model.name isEqualToString:@"your_remote_model"]) {
                // The model was downloaded and is available on the device
              }
            }];

[NSNotificationCenter.defaultCenter
    addObserverForName:MLKModelDownloadDidFailNotification
                object:nil
                 queue:nil
            usingBlock:^(NSNotification *_Nonnull note) {
              if (weakSelf == nil | note.userInfo == nil) {
                return;
              }
              __strong typeof(self) strongSelf = weakSelf;

              NSError *error = note.userInfo[MLKModelDownloadUserInfoKeyError];
            }];

2. 입력 이미지 준비

VisionImage 객체를 UIImage 또는 CMSampleBuffer입니다.

UIImage를 사용하는 경우 다음 단계를 따르세요.

  • UIImageVisionImage 객체를 만듭니다. 올바른 .orientation를 지정해야 합니다.

    Swift

    let image = VisionImage(image: UIImage)
    visionImage.orientation = image.imageOrientation

    Objective-C

    MLKVisionImage *visionImage = [[MLKVisionImage alloc] initWithImage:image];
    visionImage.orientation = image.imageOrientation;

CMSampleBuffer를 사용하는 경우 다음 단계를 따르세요.

  • CMSampleBuffer

    이미지 방향을 가져오는 방법은 다음과 같습니다.

    Swift

    func imageOrientation(
      deviceOrientation: UIDeviceOrientation,
      cameraPosition: AVCaptureDevice.Position
    ) -> UIImage.Orientation {
      switch deviceOrientation {
      case .portrait:
        return cameraPosition == .front ? .leftMirrored : .right
      case .landscapeLeft:
        return cameraPosition == .front ? .downMirrored : .up
      case .portraitUpsideDown:
        return cameraPosition == .front ? .rightMirrored : .left
      case .landscapeRight:
        return cameraPosition == .front ? .upMirrored : .down
      case .faceDown, .faceUp, .unknown:
        return .up
      }
    }
          

    Objective-C

    - (UIImageOrientation)
      imageOrientationFromDeviceOrientation:(UIDeviceOrientation)deviceOrientation
                             cameraPosition:(AVCaptureDevicePosition)cameraPosition {
      switch (deviceOrientation) {
        case UIDeviceOrientationPortrait:
          return cameraPosition == AVCaptureDevicePositionFront ? UIImageOrientationLeftMirrored
                                                                : UIImageOrientationRight;
    
        case UIDeviceOrientationLandscapeLeft:
          return cameraPosition == AVCaptureDevicePositionFront ? UIImageOrientationDownMirrored
                                                                : UIImageOrientationUp;
        case UIDeviceOrientationPortraitUpsideDown:
          return cameraPosition == AVCaptureDevicePositionFront ? UIImageOrientationRightMirrored
                                                                : UIImageOrientationLeft;
        case UIDeviceOrientationLandscapeRight:
          return cameraPosition == AVCaptureDevicePositionFront ? UIImageOrientationUpMirrored
                                                                : UIImageOrientationDown;
        case UIDeviceOrientationUnknown:
        case UIDeviceOrientationFaceUp:
        case UIDeviceOrientationFaceDown:
          return UIImageOrientationUp;
      }
    }
          
  • 다음을 사용하여 VisionImage 객체를 만듭니다. CMSampleBuffer 객체 및 방향:

    Swift

    let image = VisionImage(buffer: sampleBuffer)
    image.orientation = imageOrientation(
      deviceOrientation: UIDevice.current.orientation,
      cameraPosition: cameraPosition)

    Objective-C

     MLKVisionImage *image = [[MLKVisionImage alloc] initWithBuffer:sampleBuffer];
     image.orientation =
       [self imageOrientationFromDeviceOrientation:UIDevice.currentDevice.orientation
                                    cameraPosition:cameraPosition];

3. 이미지 라벨러 실행

비동기식으로:

Swift

imageLabeler.process(image) { labels, error in
    guard error == nil, let labels = labels, !labels.isEmpty else {
        // Handle the error.
        return
    }
    // Show results.
}

Objective-C

[imageLabeler
    processImage:image
      completion:^(NSArray *_Nullable labels,
                   NSError *_Nullable error) {
        if (labels.count == 0) {
            // Handle the error.
            return;
        }
        // Show results.
     }];

동기식으로:

Swift

var labels: [ImageLabel]
do {
    labels = try imageLabeler.results(in: image)
} catch let error {
    // Handle the error.
    return
}
// Show results.

Objective-C

NSError *error;
NSArray *labels =
    [imageLabeler resultsInImage:image error:&error];
// Show results or handle the error.

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

이미지 라벨 지정 작업이 성공하면 ImageLabelImageLabel는 이전에 봤던 것들을 나타냅니다. 있습니다. 각 라벨의 텍스트 설명을 가져올 수 있습니다 (사용 가능한 경우 TensorFlow Lite 모델 파일의 메타데이터), 신뢰도 점수, 색인입니다. 예를 들면 다음과 같습니다.

Swift

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

Objective-C

for (MLKImageLabel *label in labels) {
  NSString *labelText = label.text;
  float confidence = label.confidence;
  NSInteger index = label.index;
}

실시간 성능 개선을 위한 팁

실시간 애플리케이션에서 이미지에 라벨을 지정하려면 다음 가이드라인을 참조하세요.