Google Cloud Platformのニューラルネットワークで写真のランドマークを検出してみた
Contents
ランドマーク分析
以前にGCP(Google Cloud Platform)のニューラルネットワークモデルを使って複数の人物の顔写真より各人の顔のパーツの位置や感情を分析するCloud Vision APIについての記事を書いた。
その時はtypeにFACE_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 | 分析のタイプを指定する
等が指定可能で複数の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が正しかった事が分かる。
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のアソシエイトとして、当メディアは適格販売により収入を得ていますのでご了承ください。
最近のコメント