Google Cloud Platformのニューラルネットワークで写真のランドマークを検出してみた | そう備忘録

Google Cloud Platformのニューラルネットワークで写真のランドマークを検出してみた

ランドマーク分析

以前にGCP(Google Cloud Platform)のニューラルネットワークモデルを使って複数の人物の顔写真より各人の顔のパーツの位置や感情を分析するCloud Vision APIについての記事を書いた

その時はtypeにFACE_DETECTIONを指定したのだが今回はLANDMARK_DETECTIONを指定してランドマークから場所を特定してみたいと思う。

つまりある程度メジャーな場所であれば写真から場所を特定することができるという事である。

概要図

写真に写っている場所をランドマークより特定する。

landmark detection概要図

事前準備

VMインスタンスの準備からクラウドに写真をアップロードする所までは以前の記事の「写真の人物の顔の表情から感情分析 ~GCP~」と全く同じなので割愛する。

詳細はこちらの記事を参照して欲しい。

ストレージにファイルをアップロード

著作権フリーの風景写真をインターネットで探してGoogleのストレージにアップロードした。

今回使用するフリーの写真

今回使用させて貰ったのは以下の3つの写真。

誰でも知っている、例えばエジプトのピラミッドの様な写真では無くて、ある程度はメジャーだけど普通の人はあまり知らないであろう場所の写真を使うことにした。

1枚目は「イスラエル国ハイファのバーブ廟」。

イスラエル国ハイファのバーブ廟

2枚目は「クロアチアのアドリア海沿岸にあるドゥブロヴニクの城壁」。

クロアチアのアドリア海沿岸にあるドゥブロヴニクの城壁

3枚目は「日本の姫路城」。

姫路城

恥ずかしながら自分は姫路城以外は分からなかった。

Cloud Storageにアップロード

メニューから”storage”ー>”ブラウザ”、バケットの作成で”cloudvision20200628”を作成してその中に感情分析したい画像をアップロードした。(バケットの作成からファイルのアップロードまで詳しいやり方は以前の記事を参照して欲しい)

尚、外部から参照できるようにallUsersの権限を追加している。

ストレージにファイルをアップロード

landmark.jsonの作成

リクエスト用のJSONファイル(landmark.json)を準備する。

{
  "requests": [
      {
        "image": {
          "source": {
              "gcsImageUri": "gs://cloudvision20200628/landmark-03.jpg"
          }
        },
        "features": [
          {
            "type": "LANDMARK_DETECTION"
          }
        ]
      }
  ]
}

gcsImageUri

Google Storage上の写真のパス名を指定する

type

分析のタイプを指定する

  • LANDMARK_DETECTION:ランドマーク(写っている場所が何処かを判別)
  • TEXT_DETECTION:テキスト(画像上の文字をテキストに変換)
  • FACE_DETECTION:顔分析

等が指定可能で複数のtypeを指定する事も出来る

今回はLANDMARK_DETECTIONを指定した

実行コマンド

以下のコマンドでCloud Vision APIを呼び出して実行する。

curl -s -X POST -H "Content-Type: application/json" --data-binary @landmark.json  https://vision.googleapis.com/v1/images:annotate?key=${API_KEY}

実行結果(写真1)

最初にイスラエル国ハイファのバーブ廟の実行結果。

{
  "responses": [
    {
      "landmarkAnnotations": [
        {
          "mid": "/m/05n7j_",
          "description": "Bahá'í Gardens",
          "score": 0.7362325,
          "boundingPoly": {
            "vertices": [
              {
                "x": 1437
              },
              {
                "x": 3457
              },
              {
                "x": 3457,
                "y": 2382
              },
              {
                "x": 1437,
                "y": 2382
              }
            ]
          },
          "locations": [
            {
              "latLng": {
                "latitude": 32.814651,
                "longitude": 34.986777305603027
              }
            }
          ]
        },
        {
          "mid": "/m/05t83r",
          "description": "Bahá’í Gardens",
          "score": 0.323501,
          "boundingPoly": {
            "vertices": [
              {
                "x": 1423,
                "y": 575
              },
              {
                "x": 4067,
                "y": 575
              },
              {
                "x": 4067,
                "y": 1766
              },
              {
                "x": 1423,
                "y": 1766
              }
            ]
          },
          "locations": [
            {
              "latLng": {
                "latitude": 32.8124251,
                "longitude": 34.9857963
              }
            }
          ]
        }
      ]
    }
  ]
}

出力結果のJSONの主な項目は以下の通り。

  • mid:ランドマークの値
  • description: ランドマークの名前
  • score: 信頼度
  • boundingPoly: ランドマークが特定された画像内の領域
  • locations キー: このランドマークの緯度と経度の座標
  • latitude:緯度
  • longitude:経度

Descriptionの「Bahá’í Gardens」をGoogleで検索した結果、同じ建物が写っているのでCloud Vision APIが正しかった事が分かる。

Googleの検出結果

Scoreは0.7362325とまぁまぁの精度であった事が分かる。

実行結果(その2)

続いて「クロアチアのアドリア海沿岸にあるドゥブロヴニクの城壁」の写真の検出結果。

{
  "responses": [
    {
      "landmarkAnnotations": [
        {
          "mid": "/m/080ntz4",
          "description": "Dubrovnik",
          "score": 0.38619778,
          "boundingPoly": {
            "vertices": [
              {
                "x": 2544,
                "y": 635
              },
              {
                "x": 5725,
                "y": 635
              },
              {
                "x": 5725,
                "y": 3595
              },
              {
                "x": 2544,
                "y": 3595
              }
            ]
          },
          "locations": [
            {
              "latLng": {
                "latitude": 42.640774,
                "longitude": 18.110136
              }
            }
          ]
        },
        {
          "mid": "/m/080ntz4",
          "description": "Muralles de Dubrovnik",
          "score": 0.3217469,
          "boundingPoly": {
            "vertices": [
              {
                "x": 2474,
                "y": 898
              },
              {
                "x": 6156,
                "y": 898
              },
              {
                "x": 6156,
                "y": 3396
              },
              {
                "x": 2474,
                "y": 3396
              }
            ]
          },
          "locations": [
            {
              "latLng": {
                "latitude": 42.641637599999996,
                "longitude": 18.1070654
              }
            }
          ]
        }
      ]
    }
  ]
}

こちらもDescriptionの「Dubrovnik」で検索をしてみるが、同じ風景である事が分かる。

しかしScoreは0.38619778と低めの値になった。

元の写真が若干くすんだ色の写真なのでもしかしたらその影響が合ったのかも知れない。

クロアチアのアドリア海沿岸にあるドゥブロヴニクの城壁

実行結果(その3)

最後に「日本の姫路城」の写真の検出結果。

{
  "responses": [
    {
      "landmarkAnnotations": [
        {
          "mid": "/m/018ncx",
          "description": "Himeji Castle",
          "score": 0.9066125,
          "boundingPoly": {
            "vertices": [
              {
                "x": 518,
                "y": 778
              },
              {
                "x": 4828,
                "y": 778
              },
              {
                "x": 4828,
                "y": 3300
              },
              {
                "x": 518,
                "y": 3300
              }
            ]
          },
          "locations": [
            {
              "latLng": {
                "latitude": 34.838561999999996,
                "longitude": 134.693177
              }
            }
          ]
        }
      ]
    }
  ]
}

こちらもDescriptionが”Himeji Castle”になっており正解であることが分かる。

Scoreは0.9066125となっておりかなり高い信頼度で予測した事が分かる。

好きな人が見ればもちろん日本の各城の違いは分かるのだろうがニューラルネットワークでも城を判別できる事が分かる。

終わりに

以上で風景写真から場所を特定するCloud Vision APIの記事は終了とする。

最後に

この記事が何処かで誰かの役に立つことを願っている。

尚、当記事中の商品へのリンクはAmazonアソシエイトへのリンクが含まれています。Amazonのアソシエイトとして、当メディアは適格販売により収入を得ていますのでご了承ください。

souichirou

やった事を忘れない為の備忘録 同じような事をやりたい人の参考になればと思ってブログにしてます。 主にレゴ、AWS(Amazon Web Services)、WordPress、Deep Learning、RaspberryPiに関するブログを書いています。 仕事では工場に協働ロボットの導入や中小企業へのAI/IoT導入のアドバイザーをやっています。 2019年7月にJDLA(一般社団法人 日本デイープラーニング協会)Deep Learning for GENERALに合格しました。 質問は記事一番下にあるコメントかメニュー上部の問い合わせからお願いします。

おすすめ

質問やコメントや励ましの言葉などを残す

名前、メール、サイト欄は任意です。
またメールアドレスは公開されません。