2
3

[Vision API] Javaで画像内のランドマークを検出する

Posted at

Googleが提供しているVision APIをJavaで使ってみました。

APIを使用し、画像内に含まれているランドマークを検出します。
ランドマークとは、よく知られている自然や人工建造物を示すそうです。

画像内のランドマークの位置だけではなく、緯度と経度も取得できます。

APIを利用する環境の準備から始める場合や、コードを実行する際は、
⧉[Vision API] Javaで画像内のいろいろなものを検出する
を参照ください。

No 目次
1 Feature.Typeの指定
2 実行結果の取得
1 レスポンスの出力
2 レスポンスの内容
3 結果の検証
1 ランドマークが少ない場合
2 ランドマークが多い場合
3 自然のランドマーク

1. Feature.Typeの指定

ランドマークを検出する場合は、
Feature.Type.LANDMARK_DETECTION
を指定します。

以下の記事でexecApi()にタイプを指定します。
⧉[Vision API] Javaで画像内のいろいろなものを検出する

2. 実行結果の取得

2.1. レスポンスの出力

取得した結果をコンソールに出力します。

private static void output(BatchAnnotateImagesResponse response){
    List<AnnotateImageResponse> responses = response.getResponsesList();

    for (AnnotateImageResponse res : responses) {
        if (res.hasError()) {
            System.out.format("Error: %s%n", res.getError().getMessage());
            return;
        }
        for (EntityAnnotation annotation : res.getLandmarkAnnotationsList()) {
            LocationInfo info = annotation.getLocationsList().listIterator().next();
            System.out.format("Landmark: %s%n %s%n", annotation.getDescription(), info.getLatLng());
        }
    }
}

2.2. レスポンスの内容

BatchAnnotateImagesResponseの
getResponsesListでAnnotateImageResponseリストが取得できます。
検出されなった場合は、空のリストが返ってきます。

AnnotateImageResponse

メソッド 戻り値 内容
getLandmarkAnnotationsList List<EntityAnnotation> 検出された情報

EntityAnnotation

メソッド 戻り値 内容
getMid string OpaqueエンティティID
getDescription string 検出されたランドマークの説明文
getScore float 検出結果の信頼度。範囲は0〜1
getBoundingPoly BoundingPoly ランドマークの画像領域
値は返ってきますが、未使用だそうです
getLocationsList List<LocationInfo> ランドマークの位置情報

BoundingPoly

未使用だそうです。

メソッド 戻り値 内容
getVerticesList List<Vertex> 境界ポリゴンの頂点。
左上、右上、左下、右下の順

Vertex

メソッド 戻り値 内容
getX int X座標
getY int Y座標

LocationInfo

メソッド 戻り値 内容
getLatLng LatLng ランドマークの緯度と経度の位置座標

LatLng

メソッド 戻り値 内容
getLatitude double 緯度
getLongitude double 経度

3. 結果の検証

画像に含まれるランドマークが少ない場合と多い場合、自然についてそれぞれ検証してみました。

3.1. ランドマークが少ない場合

検出させる元画像
元の画像、熊本城です。

検出された結果
検出結果信頼度: 0.7037737
ランドマーク: Kumamoto Castle Honmaru Palace
緯度: 32.80546909999999
経度: 130.7063329
熊本城の本丸とでました。

3.2. ランドマークが多い場合

検出させる元画像
どこの場所かわからない画像を検出させてみました。

検出された結果
どうやら大阪の梅田みたいです。
検出の信頼度は低いですが、Googleが言っているんだから多分そうなのでしょうw

・グランフロント大阪 タワーA
検出結果信頼度: 0.49405774
ランドマーク: Grand Front Osaka South Building Tower A
緯度: 34.7043234
経度: 135.4950067

・梅田阪急ビル オフィスタワー
検出結果信頼度: 0.40376985
ランドマーク: Umeda Hankyu Building Office Tower
緯度: 34.702442999999995
経度: 135.4991101

・梅田スカイビル
検出結果信頼度: 0.25185502
ランドマーク: Umeda Sky Building
緯度: 34.7052872
経度: 135.4896527

3.3. 自然のランドマーク

3.3.1. 富士山の場合

検出させる元画像
まずは日本人なら誰でも知っている富士山!

検出された結果
なんと!検出されませんでした。
検出されない場合は、AnnotateImageResponseのリストが空で返ってきます。

3.3.2. エアーズロックの場合

検出させる元画像
こちらはエアーズロック。こちらもみんな知っている

検出された結果
こちらは出てきた。
エアーズロックが見られる場所をウルルサンセットビューエリアというらしい。

・ウルルサンセットビューエリア
検出結果信頼度: 0.7684352
ランドマーク: Uluru Sunset Viewing Area
緯度: -25.336152099999996
経度: 131.0048557



おしまい。。。
2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3