ML Kit を使用すると、画像内で認識されたオブジェクトにラベルを付けることができます。デフォルト モデルは、 ML Kit は 400 種類以上のラベルをサポートしています。
試してみる
- サンプルアプリを試してみましょう。 この API の使用例をご覧ください
始める前に
- Podfile に次の ML Kit Pod を追加します。
pod 'GoogleMLKit/ImageLabeling', '15.5.0'
- プロジェクトの Pod をインストールまたは更新したら、Xcode プロジェクトを開きます。
.xcworkspace
。ML Kit は Xcode バージョン 12.4 以降でサポートされています。
これで、画像にラベルを付ける準備が整いました。
1. 入力画像を準備する
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];
2. 画像ラベラーを構成して実行する
画像内のオブジェクトにラベルを付けるには、VisionImage
オブジェクトを
ImageLabeler
の processImage()
メソッド。
- まず、
ImageLabeler
のインスタンスを取得します。
Swift
let labeler = ImageLabeler.imageLabeler() // Or, to set the minimum confidence required: // let options = ImageLabelerOptions() // options.confidenceThreshold = 0.7 // let labeler = ImageLabeler.imageLabeler(options: options)
Objective-C
MLKImageLabeler *labeler = [MLKImageLabeler imageLabeler]; // Or, to set the minimum confidence required: // MLKImageLabelerOptions *options = // [[MLKImageLabelerOptions alloc] init]; // options.confidenceThreshold = 0.7; // MLKImageLabeler *labeler = // [MLKImageLabeler imageLabelerWithOptions: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*_Nullable labels, NSError *_Nullable error) { if (error != nil) { return; } // Task succeeded. // ... }];
3. ラベル付きオブジェクトに関する情報を取得する
画像のラベル付けに成功すると、完了ハンドラは
ImageLabel
オブジェクト。各 ImageLabel
オブジェクトは、
画像内のラベルが付けられています。ベースモデルは、400 種類以上のラベルをサポートしています。
各ラベルのテキストの説明を取得したり、
一致の信頼スコアが含まれます。例:
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; }
リアルタイムのパフォーマンスを改善するためのヒント
リアルタイム アプリケーションで画像にラベルを付ける場合は、 実現するためのガイドラインは次のとおりです。
- 動画フレームの処理には、画像ラベラーの
results(in:)
同期 API を使用します。発信 このメソッドは、AVCaptureVideoDataOutputSampleBufferDelegate
の <ph type="x-smartling-placeholder"></ph> 指定された動画から結果を同期的に取得するcaptureOutput(_, didOutput:from:)
関数 クリックします。<ph type="x-smartling-placeholder"></ph>のままにするAVCaptureVideoDataOutput
さんのtrue
としてのalwaysDiscardsLateVideoFrames
。画像ラベラーの呼び出しをスロットリングします。新しい 動画フレームが使用可能になると、画像ラベラーはドロップされます。 - 画像ラベラーの出力を使用してグラフィックを まず ML Kit から結果を取得してから、画像をレンダリングする 1 ステップでオーバーレイできますこれにより、ディスプレイ サーフェスにレンダリングされます。 各入力フレームに対して 1 回だけです。updatePreviewOverlayViewWithLastFrame をご覧ください。 をご覧ください。