AutoML でトレーニングされたモデルを使用して画像にラベルを付ける(iOS)
<ph type="x-smartling-placeholder">AutoML Vision Edge を使用して独自のモデルをトレーニングしたら、 アプリでこれを使用して画像にラベルを付けることができます。
AutoML Vision Edge からトレーニングされたモデルを統合するには、2 つの方法があります。Google Chat では モデルのファイルを Xcode プロジェクトにコピーしてモデルをバンドルする。 Firebase から動的にダウンロードできます。
モデルのバンドル オプション | |
---|---|
アプリにバンドルされている |
|
Firebase でホスト |
|
試してみる
- サンプルアプリを試してみましょう。 この API の使用例をご覧ください
始める前に
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.tflite3 つのファイルはすべて同じフォルダに配置する必要があります。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; }
リアルタイムのパフォーマンスを改善するためのヒント
リアルタイム アプリケーションで画像にラベルを付ける場合は、 実現するためのガイドラインは次のとおりです。
- 動画フレームの処理には、検出機能の
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 をご覧ください。 をご覧ください。