ML Kit を使用して画像にラベルを付ける(iOS)

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. クラウドベースのモデルを使用するが、プロジェクトを Blaze プランにアップグレードしていない場合は、Firebase コンソールでアップグレードしてください。Blaze レベルのプロジェクトのみが Cloud Vision API を使用できます。
  5. クラウドベース モデルを使用する場合は、Cloud Vision API も有効にします。
    1. Cloud Console API ライブラリで Cloud Vision API を開きます。
    2. ページ上部のメニューで Firebase プロジェクトが選択されていることを確認します。
    3. API がまだ有効になっていない場合は、[有効にする] をクリックします。
    端末モデルのみを使用する場合は、この手順を省略できます。

これで、端末モデルまたはクラウドベース モデルを使用して画像にラベルを付ける準備ができました。


端末上での画像のラベル付け

端末上での画像ラベル付けモデルを使用するには、以下のとおりにイメージ ラベラーを構成して実行します。

1. イメージ ラベラーを構成する

デフォルトでは、端末上のイメージ ラベラーは、信頼スコアが 0.5 以上のラベルのみを返します。この設定を変更する場合は、次の例のように VisionLabelDetectorOptions オブジェクトを作成します。

Swift

let options = VisionLabelDetectorOptions(
  confidenceThreshold: Constants.labelConfidenceThreshold
)

Objective-C

FIRVisionLabelDetectorOptions *options =
    [[FIRVisionLabelDetectorOptions alloc] initWithConfidenceThreshold:0.6f];

2. イメージ ラベラーを実行する

画像内のエンティティを認識してラベル付けするには、画像を UIImage または CMSampleBufferRef として VisionLabelDetectordetect(in:) メソッドに渡します。

  1. VisionLabelDetector のインスタンスを取得します。

    Swift

    lazy var vision = Vision.vision()
    let labelDetector = vision.labelDetector(options: options)
    

    Objective-C

    FIRVision *vision = [FIRVision vision];
    FIRVisionLabelDetector *labelDetector = [vision labelDetector];
    // Or, to change the default settings:
    // FIRVisionLabelDetector *labelDetector =
    //     [vision labelDetectorWithOptions:options];
    
  2. 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. VisionImageMetadata オブジェクトを作成し、CMSampleBufferRef バッファに格納されている画像データの向きを指定します。

      たとえば、画像データを正しい向きにするには時計回りに 90 度回転させる必要がある場合は、次のようにします。

      Swift

      let metadata = VisionImageMetadata()
      metadata.orientation = .rightTop  // Row 0 is on the right and column 0 is on the top
      

      Objective-C

      // Row 0 is on the right and column 0 is on the top
      FIRVisionImageMetadata *metadata = [[FIRVisionImageMetadata alloc] init];
      metadata.orientation = FIRVisionDetectorImageOrientationRightTop;
      
    2. CMSampleBufferRef オブジェクトと回転メタデータを使用して VisionImage オブジェクトを作成します。

      Swift

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

      Objective-C

      FIRVisionImage *image = [[FIRVisionImage alloc] initWithBuffer:buffer];
      image.metadata = metadata;
      
  3. 次に、画像を detect(in:) メソッドに渡します。

    Swift

    labelDetector.detect(in: visionImage) { features, error in
      guard error == nil, let features = features, !features.isEmpty else {
        // ...
        return
      }
    
      // ...
    }

    Objective-C

    [labelDetector detectInImage:image
                      completion:^(NSArray<FIRVisionLabel *> *labels,
                                   NSError *error) {
      if (error != nil || labels.count == 0) {
        return;
      }
      // Got labels. Access label info via FIRVisionLabel.
    }];
    

3. ラベル付きオブジェクトに関する情報を取得する

画像のラベル付けに成功すると、VisionLabel オブジェクトの配列が完了ハンドラに渡されます。各オブジェクトから、画像内で認識された特徴に関する情報を取得できます。

例:

Swift

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

Objective-C

for (FIRVisionLabel *label in labels) {
  NSString *labelText = label.label;
  NSString *entityId = label.entityID;
  float confidence = label.confidence;
}

クラウドでの画像のラベル付け

クラウドベースの画像ラベル付けモデルを使用するには、以下のとおりにイメージ ラベラーを構成して実行します。

1. イメージ ラベラーを構成する

デフォルトでは、Cloud 検出ツールは安定バージョンのモデルを使用して、最大 10 件の結果を返します。これらの設定のいずれかを変更する場合は、次の例のように VisionCloudDetectorOptions オブジェクトを使用して指定します。

Swift

let options = VisionCloudDetectorOptions()
options.modelType = .latest
options.maxResults = 20

Objective-C

FIRVisionCloudDetectorOptions *options =
    [[FIRVisionCloudDetectorOptions alloc] init];
options.modelType = FIRVisionCloudModelTypeLatest;
options.maxResults = 20;

次のステップでは、Cloud 検出ツール オブジェクトを作成するときに VisionCloudDetectorOptions オブジェクトを渡します。

2. イメージ ラベラーを実行する

画像内のエンティティを認識してラベル付けするには、画像を UIImage または CMSampleBufferRef として VisionCloudLabelDetectordetect(in:) メソッドに渡します。

  1. VisionCloudLabelDetector のインスタンスを取得します。

    Swift

    let labelDetector = vision.cloudLabelDetector()
    // Or, to change the default settings:
    // let labelDetector = Vision.vision().cloudLabelDetector(options: options)

    Objective-C

    FIRVision *vision = [FIRVision vision];
    FIRVisionCloudLabelDetector *labelDetector = [vision cloudLabelDetector];
    // Or, to change the default settings:
    // FIRVisionCloudLabelDetector *labelDetector =
    //     [vision cloudLabelDetectorWithOptions:options];
    
  2. 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. VisionImageMetadata オブジェクトを作成し、CMSampleBufferRef バッファに格納されている画像データの向きを指定します。

      たとえば、画像データを正しい向きにするには時計回りに 90 度回転させる必要がある場合は、次のようにします。

      Swift

      let metadata = VisionImageMetadata()
      metadata.orientation = .rightTop  // Row 0 is on the right and column 0 is on the top
      

      Objective-C

      // Row 0 is on the right and column 0 is on the top
      FIRVisionImageMetadata *metadata = [[FIRVisionImageMetadata alloc] init];
      metadata.orientation = FIRVisionDetectorImageOrientationRightTop;
      
    2. CMSampleBufferRef オブジェクトと回転メタデータを使用して VisionImage オブジェクトを作成します。

      Swift

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

      Objective-C

      FIRVisionImage *image = [[FIRVisionImage alloc] initWithBuffer:buffer];
      image.metadata = metadata;
      
  3. 次に、画像を detect(in:) メソッドに渡します。

    Swift

      labelDetector.detect(in: visionImage) { labels, error in
        guard error == nil, let labels = labels, !labels.isEmpty else {
          // ...
          return
        }
    
        // Labeled image
        // START_EXCLUDE
        self.resultsText = labels.map { label -> String in
          "Label: \(String(describing: label.label ?? "")), " +
            "Confidence: \(label.confidence ?? 0), " +
          "EntityID: \(label.entityId ?? "")"
          }.joined(separator: "\n")
        self.showResults()
      }
    }

    Objective-C

    [labelDetector detectInImage:image
                      completion:^(NSArray<FIRVisionCloudLabel *> *labels,
                                   NSError *error) {
      if (error != nil || labels.count == 0) {
        return;
      }
      // Got labels. Access label info via FIRVisionCloudLabel.
    }];
    

3. ラベル付きオブジェクトに関する情報を取得する

画像のラベル付けに成功すると、VisionCloudLabel オブジェクトの配列が完了ハンドラに渡されます。各オブジェクトから、画像内で認識されたエンティティに関する情報を取得できます。

例:

Swift

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

Objective-C

for (FIRVisionCloudLabel *label in labels) {
  NSString *labelText = label.label;
  NSString *entityId = label.entityId;
  float confidence = [label.confidence floatValue];
}

フィードバックを送信...

ご不明な点がありましたら、Google のサポートページをご覧ください。