Firebase ML を使用して、画像内で認識されたオブジェクトにラベルを付けることができます。この API の機能の詳細については、概要をご覧ください。
始める前に
- 
まだアプリに Firebase を追加していない場合は、スタートガイドの手順に沿って追加してください。
- Xcode でアプリのプロジェクトを開いたまま、[File] > [Add Packages] の順に移動します。
- プロンプトが表示されたら、Firebase Apple プラットフォーム SDK リポジトリを追加します。
- Firebase ML ライブラリを選択します。
- ターゲットのビルド設定の [Other Linker Flags] セクションに -ObjCフラグを追加します。
- 上記の作業が完了すると、Xcode は依存関係の解決とバックグラウンドでのダウンロードを自動的に開始します。
- アプリに Firebase をインポートします。
  Swiftimport FirebaseMLModelDownloader Objective-C@import FirebaseMLModelDownloader; 
- 
  プロジェクトで Cloud ベースの API をまだ有効にしていない場合は、ここで有効にします。 - Firebase コンソールで [Firebase ML APIs] ページを開きます。
- 
      プロジェクトを従量課金制の Blaze 料金プランにまだアップグレードしていない場合は、[アップグレード] をクリックしてアップグレードします(プロジェクトをアップグレードするよう求められるのは、プロジェクトが Blaze 料金プランでない場合のみです)。 Cloud ベースの API を使用できるのは、Blaze 料金プランのプロジェクトのみです。 
- Cloud ベースの API がまだ有効になっていない場合は、[Cloud ベースの API を有効化] をクリックします。
 
Swift Package Manager を使用して Firebase の依存関係のインストールと管理を行います。
https://github.com/firebase/firebase-ios-sdk.git
次に、アプリ内の設定を行います。
これで、画像にラベルを付ける準備が整いました。
1. 入力画像を準備する
UIImage または CMSampleBufferRef を使用して VisionImage オブジェクトを作成します。
UIImage を使用するには:
- 必要に応じて、imageOrientationプロパティが.upになるように画像を回転させます。
- 適切に回転させた UIImageを使用してVisionImageオブジェクトを作成します。回転メタデータにはデフォルト値の.topLeftを使用する必要があるため、値を指定しないでください。Swiftlet image = VisionImage(image: uiImage) Objective-CFIRVisionImage *image = [[FIRVisionImage alloc] initWithImage:uiImage]; 
CMSampleBufferRef を使用するには:
- 
    VisionImageMetadataオブジェクトを作成し、CMSampleBufferRefバッファに格納されている画像データの向きを指定します。画像の向きは次のように取得します。 Swiftfunc 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 } } Objective-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; } } 次に、メタデータ オブジェクトを作成します。 Swiftlet cameraPosition = AVCaptureDevice.Position.back // Set to the capture device you used. let metadata = VisionImageMetadata() metadata.orientation = imageOrientation( deviceOrientation: UIDevice.current.orientation, cameraPosition: cameraPosition ) Objective-CFIRVisionImageMetadata *metadata = [[FIRVisionImageMetadata alloc] init]; AVCaptureDevicePosition cameraPosition = AVCaptureDevicePositionBack; // Set to the capture device you used. metadata.orientation = [self imageOrientationFromDeviceOrientation:UIDevice.currentDevice.orientation cameraPosition:cameraPosition]; 
- VisionImageオブジェクトと回転メタデータを使用して- CMSampleBufferRefオブジェクトを作成します。- Swift- let image = VisionImage(buffer: sampleBuffer) image.metadata = metadata - Objective-C- FIRVisionImage *image = [[FIRVisionImage alloc] initWithBuffer:sampleBuffer]; image.metadata = metadata; 
2. 画像ラベラーを構成して実行する
画像内のオブジェクトにラベルを付けるには、VisionImage オブジェクトを VisionImageLabeler の processImage() メソッドに渡します。
- まず、 - VisionImageLabelerのインスタンスを取得します。- 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];
- 次に、画像を - 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 APIs を使用するアプリを本番環境にデプロイする前に、不正な API アクセスを防いでその影響を軽減するため、いくつかの追加手順が必要になります。