コンソールへ移動

ML Kit を使用してランドマークを認識する(Android)

ML Kit を使用すると、画像内にあるよく知られたランドマークを認識できます。

準備

  1. Firebase プロジェクトを設定します。
    1. Firebase プロジェクトをまだ用意していない場合は、Firebase コンソールで Firebase プロジェクトを作成します。モバイルアプリに関連付けられた既存の Google プロジェクトがある場合は、[Google プロジェクトをインポート] をクリックします。それ以外の場合は、[プロジェクトを追加] をクリックします。
    2. [Android アプリに Firebase を追加] をクリックし、設定手順に沿って操作します。既存の Google プロジェクトをインポートする場合、このステップは自動的に行われることがあります。その場合は、構成ファイルをダウンロードするだけでかまいません。
    3. プロンプトが表示されたら、アプリのパッケージ名を入力します。必ずアプリで使用しているパッケージ名を入力してください。パッケージ名を設定できるのは、アプリを Firebase プロジェクトに追加するときだけです。
    4. google-services.json ファイルをダウンロードします。構成ファイルはいつでも再ダウンロードできます。
    5. このファイルをプロジェクトのモジュール フォルダ(通常は app/)にコピーしていない場合は、コピーします。
  2. EAP の連絡先から受け取った SDK を抽出します。
    unzip -d $SDK_DIR 3p_sdk.m2repo.zip
    
  3. SDK および Google サービス プラグインの抽出先となるディレクトリを、プロジェクト レベルの build.gradle に追加します。
    buildscript {
      // ...
      dependencies {
          // ...
          classpath 'com.google.gms:google-services:3.2.0' // google-services plugin
      }
    }
    
    allprojects {
      repositories {
        // Add this
        maven {
          url "$SDK_DIR"
        }
        // This should already be here
        jcenter()
    
        ...
      }
    }
    
  4. 次に、ML Kit の依存関係を含めて、アプリレベルの build.gradle ファイルに apply plugin 行を追加します。

    dependencies {
      // ...
      compile 'com.google.firebase:firebase-core:12.8.0-SNAPSHOT'
      compile 'com.google.firebase:firebase-ml-vision:12.8.0-SNAPSHOT'
    }
    
    // ADD THIS AT THE BOTTOM OF THE FILE
    apply plugin: 'com.google.gms.google-services'
    

ランドマーク検出ツールを設定する

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

たとえば、デフォルト設定を両方とも変更するには、次の例のように FirebaseVisionCloudDetectorOptions オブジェクトをビルドします。

FirebaseVisionCloudDetectorOptions options =
    new FirebaseVisionCloudDetectorOptions.Builder()
        .setModelType(FirebaseVisionCloudDetectorOptions.LATEST_MODEL)
        .setMaxResults(15)
        .build();

デフォルト設定を使用するには、次の手順で FirebaseVisionCloudDetectorOptions.DEFAULT を使用します。

ランドマーク検出ツールを実行する

画像内のランドマークを認識するには、画像を ByteBuffer オブジェクトとして FirebaseVisionCloudLandmarkDetectordetectInBuffer メソッドに渡すか、画像を android.graphics.Bitmap オブジェクトとして detectInImage メソッドに渡します。

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

    FirebaseVisionCloudLandmarkDetector detector = FirebaseVision.getInstance()
        .getVisionCloudLandmarkDetector(options);
    
  2. 画像のメタデータを含む FirebaseVisionImageMetadata オブジェクトを作成します。

    画像を ByteBuffer として渡す場合は、画像の高さ、幅、カラー エンコード形式、および向きを指定する必要があります。

    FirebaseVisionImageMetadata metadata = new FirebaseVisionImageMetadata.Builder()
        .setWidth(1280)
        .setHeight(720)
        .setFormat(FirebaseVisionImageMetadata.IMAGE_FORMAT_NV21)
        .setRotation(FirebaseVisionImageMetadata.ROTATION_0)
        .build();
    

    画像を Bitmap として渡す場合は、画像の向きを指定するだけで済みます。

    FirebaseVisionImageMetadata metadata = new FirebaseVisionImageMetadata.Builder()
        .setRotation(FirebaseVisionImageMetadata.ROTATION_0)
        .build();
    
  3. 最後に、画像を detectInBuffer または detectInImage メソッドに渡します。

    Task<SparseArray<FirebaseVisionCloudLandmark>> result =
        detector.detectInImage(image, metadata)  // or detectInBuffer(buffer, metadata)
        .addOnSuccessListener(
            this,
            new OnSuccessListener<SparseArray<FirebaseVisionCloudLandmark>>() {
              @Override
              public void onSuccess(SparseArray<FirebaseVisionCloudLandmark> landmarks) {
                // Task completed successfully
                // ...
              }
            })
        .addOnFailureListener(
            this,
            new OnFailureListener() {
              @Override
              public void onFailure(@NonNull Exception e) {
                // Task failed with an exception
                // ...
              }
            });
    

認識されたランドマークに関する情報を取得する

ランドマーク認識オペレーションが成功すると、FirebaseVisionCloudLandmark オブジェクトの配列が成功リスナーに渡されます。各 FirebaseVisionCloudLandmark オブジェクトは画像内で認識されたランドマークを表します。ランドマークごとに、入力イメージの境界座標、ランドマーク名、緯度と経度、ナレッジグラフ エンティティの ID(使用できる場合)、一致の信頼スコアを取得できます。次に例を示します。

for(int i = 0; i < landmarks.size(); i++) {
  FirebaseVisionCloudLandmark landmark = landmarks.valueAt(i);

  Rect bounds = landmark.getBoundingBox();
  String landmarkName = landmark.getlandmark();
  String entityId = landmark.getEntityId();
  float confidence = landmark.getScore();

  // Multiple locations are possible, e.g., the location of the depicted
  // landmark and the location the picture was taken.
  for (FirebaseVisionLatLng loc: landmark.getLocations()) {
    double latitude = loc.getLatitude();
    double longitude = loc.getLongitude();
  }
}