AutoML でトレーニングされたモデルを使用して画像にラベルを付ける(iOS)

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

AutoML Vision Edge を使用して独自のモデルをトレーニングしたら、 アプリでこれを使用して画像にラベルを付けることができます。

AutoML Vision Edge からトレーニングされたモデルを統合するには、2 つの方法があります。Google Chat では モデルのファイルを Xcode プロジェクトにコピーしてモデルをバンドルする。 Firebase から動的にダウンロードできます。

モデルのバンドル オプション
アプリにバンドルされている
  • モデルがバンドルの一部である
  • iOS デバイスがオフラインの場合でも、モデルをすぐに使用できます
  • Firebase プロジェクトは不要
Firebase でホスト
  • モデルを Cloud Storage にアップロードしてホストし、 Firebase ML
  • App Bundle のサイズを縮小する
  • モデルはオンデマンドでダウンロードされる
  • アプリを再公開せずにモデルの更新を push する
  • Firebase Remote Config で簡単に A/B テストを実施
  • Firebase プロジェクトが必要

試してみる

始める前に

1. Podfile に ML Kit ライブラリを含めます。

モデルをアプリにバンドルするには:
    pod 'GoogleMLKit/ImageLabelingAutoML'
    
Firebase からモデルを動的にダウンロードするには、LinkFirebase を追加します。 :
    pod 'GoogleMLKit/ImageLabelingAutoML'
    pod 'GoogleMLKit/LinkFirebase'
    
2.プロジェクトの Pod をインストールまたは更新したら、Xcode プロジェクトを開きます。 .xcworkspace というコードを使用します。ML Kit は Xcode でサポートされています バージョン 13.2.1 以降が必要です。 3. モデルをダウンロードする場合は、 Firebase を iOS プロジェクトに追加する まだ実施していない場合は 追加してくださいこれは、 モデルです。

1. モデルを読み込む

ローカルモデルソースを構成する

モデルをアプリにバンドルするには:

1.ダウンロードした ZIP アーカイブからモデルとそのメタデータを抽出する フォルダにコピーします。
    your_model_directory
      |____dict.txt
      |____manifest.json
      |____model.tflite
    
3 つのファイルはすべて同じフォルダに配置する必要があります。Cloud Storage バケットに ダウンロードしたときと同じ結果になります(ファイル名も含まれます)。

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.

次に、実行する条件を指定してモデルのダウンロード タスクを開始します。 ダウンロードを許可する対象のモデルがデバイスに搭載されていない場合や、 利用可能な場合、タスクは非同期でモデルの モデル:

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 を使用する場合は、次の手順を行います。

  • UIImage を使用して VisionImage オブジェクトを作成します。正しい .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. ラベル付きオブジェクトに関する情報を取得する

画像のラベル付けオペレーションが成功すると、 ImageLabel。各 ImageLabel は、発生したものを表します。 画像内のラベルが付けられています。各ラベルのテキストの説明を取得できます( 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;
}

リアルタイムのパフォーマンスを改善するためのヒント

リアルタイム アプリケーションで画像にラベルを付ける場合は、 実現するためのガイドラインは次のとおりです。