自分が管理するGCPアカウントで立ち上げたGCPプロジェクトに、手元のMacbookからsshリモート接続して、GCPのAPIを叩くシリーズの第3弾です。
__初回の記事__では、次の準備作業を行いました。
1. GCPアカウントの取得
2. GCPプロジェクトの作成
3. 作成したGCPプロジェクトの認証キー(jsonファイル)の作成と、ローカルPCへのダウンロード
1〜3の手順は、次のウェブページがわかりやすいです。私もこのウェブページに沿って、準備を行いました。
続けて、Macbookの任意の場所(ディレクトリ)に、ダウンロードした__認証キーのファイル(jsonファイル)を格納__しました。
(以下、XXYYZZAABBCCDDの部分は、各自のjsonファイル名に読み替えて下さい)
electron@diynoMacBook-Pro Desktop % cd gcp
electron@diynoMacBook-Pro gcp % ls
XXYYZZAABBCCDD.json
electron@diynoMacBook-Pro gcp %
そして、__認証キー(jsonファイル)の格納先の絶対パスを、GCPの環境変数として、Macbookへの登録__を行いました。
(以下、XXYYZZAABBCCDDの部分は、各自のjsonファイル名に読み替えて下さい)
electron@diynoMacBook-Pro gcp % export GOOGLE_APPLICATION_CREDENTIALS="/Users/electron/Desktop/gcp/XXYYZZAABBCCDD.json"
##画像に写る光景(景色)の所在場所の推定APIを試した
第3弾の本記事では、画像ファイルの中に収められた光景(景色)が、地球上のどの国・街に実在する場所を捉えたものなのかを推定するAPIを使ってみました。
Googleについては、2016年に公開された論文によって、同社が以下のようなモデルを社内で開発していたことが、判明していました。
- Exifメタデータ付きの景色の画像を含む9,000万枚の画像を、畳み込みニューラル・ネットワークモデル__"PlaNet"__に学ばせた結果、Exifデータを持たない画像の撮影場所を一定の正解率で言い当てるモデル
GCPで提供されているAPIの裏側で、2016年に公開された当該論文の研究成果が動いているのかどうかは、少し探してみた限り、情報は見当たりませんでした。
( 論文 )
PlaNet と名付けらえた AI は、写真をピクセル単位に分解して各ピクセルの並びや全体のパターンを学習し、それをライブラリ内にあるジオタグ入りの写真と比較することで撮影場所を特定しようというのです。
同プロジェクトは、Google のコンピュータビジョン技術のスペシャリスト Tobias Weyand が率いており、最近行われたテストでは、PlaNet は世界の 9,000 万枚のジオタグ情報を蓄積した状態で、230 万枚のジオタグ無し写真の場所を検索したところ、28.4% の写真について国を特定でき、48% は大陸を特定できたそうです。
精度はまだまだ低いように思えますが、PlaNet の進化によって徐々に精度は上がり、数年後には実用的なものになると予想されます。
##今回動かすスクリプト (Python3)
実装コードは、次の記事を参考にしました。
import io
import argparse, os
from pathlib import Path
from google.cloud import vision
# 画像ファイル名をコマンドライン引数から受け取る
parser = argparse.ArgumentParser(description='') #
parser.add_argument('file_name')
args = parser.parse_args()
image_file = args.file_name
client = vision.ImageAnnotatorClient()
p = Path().parent / image_file
with p.open('rb') as image_file:
land_content = image_file.read()
land_image = vision.Image(content=land_content)
land_response = client.landmark_detection(image=land_image)
landmarks = land_response.landmark_annotations
try:
print("\n解析対象のファイル : " + str(args.file_name) + "\n")
if (landmarks is None) or (len(landmarks) == 0):
print("\n撮影場所の検出に成功しませんでした。\n")
else:
print("推定される撮影場所が" + str(len(landmarks)) + " 件、見つかりました。 \n")
for landmark in landmarks:
print(landmark.description)
for location in landmark.locations:
lat_lng = location.lat_lng
print('緯度 : {}'.format(lat_lng.latitude))
print('軽度 : {}'.format(lat_lng.longitude))
print("\n-------------------------\n")
except:
pass
###( 検証結果 )
- 撮影場所が見つからない画像が頻出する。
- 推定結果が返された画像については、推定精度は信頼度が高い。
electron@diynoMacBook-Pro gcp % python3 picture_location_detection.py kokugikan_1.png
解析対象のファイル : kokugikan_1.png
撮影場所の検出に成功しませんでした。
electron@diynoMacBook-Pro gcp %
electron@diynoMacBook-Pro gcp % python3 picture_location_detection.py kokugikan_2.png
解析対象のファイル : kokugikan_2.png
撮影場所の検出に成功しませんでした。
electron@diynoMacBook-Pro gcp %
electron@diynoMacBook-Pro gcp % python3 picture_location_detection.py kaminari.png
解析対象のファイル : kaminari.png
推定される撮影場所が3 件、見つかりました。
Sensō-ji
緯度 : 35.7147651
軽度 : 139.7966553
-------------------------
Kaminarimon Gate Sensouji
緯度 : 35.711154900000004
軽度 : 139.7963795
-------------------------
Kaminarimon
緯度 : 35.711048999999996
軽度 : 139.796348
-------------------------
electron@diynoMacBook-Pro gcp %
electron@diynoMacBook-Pro gcp % python3 picture_location_detection.py lumine.png
解析対象のファイル : lumine.png
撮影場所の検出に成功しませんでした。
electron@diynoMacBook-Pro gcp %
electron@diynoMacBook-Pro gcp % python3 picture_location_detection.py sky_tree.png
解析対象のファイル : sky_tree.png
推定される撮影場所が2 件、見つかりました。
Sumida Park
緯度 : 35.7160545
軽度 : 139.803313
-------------------------
Sensō-ji
緯度 : 35.7147651
軽度 : 139.7966553
-------------------------
electron@diynoMacBook-Pro gcp %
electron@diynoMacBook-Pro gcp % python3 picture_location_detection.py big_sight.png
解析対象のファイル : big_sight.png
推定される撮影場所が1 件、見つかりました。
Tokyo Big Sight
緯度 : 35.630368
軽度 : 139.793215
-------------------------
electron@diynoMacBook-Pro gcp %
electron@diynoMacBook-Pro gcp % python3 picture_location_detection.py white_house.png
解析対象のファイル : white_house.png
推定される撮影場所が7 件、見つかりました。
President's Park
緯度 : 38.8957766
軽度 : -77.0371152
-------------------------
White House
緯度 : 38.895909
軽度 : -77.032871
-------------------------
White House
緯度 : 38.8913
軽度 : -77.032914
-------------------------
White House
緯度 : 38.897312
軽度 : -77.036564
-------------------------
The White House South Lawn
緯度 : 38.8968324
軽度 : -77.036512
-------------------------
White House
緯度 : 38.902255
軽度 : -77.037162
-------------------------
Lafayette Square
緯度 : 38.8995369
軽度 : -77.0365489
-------------------------
electron@diynoMacBook-Pro gcp %
electron@diynoMacBook-Pro gcp % python3 picture_location_detection.py red_square.png
解析対象のファイル : red_square.png
推定される撮影場所が2 件、見つかりました。
Lenin's Mausoleum
緯度 : 55.753817999999995
軽度 : 37.620084000000006
-------------------------
State Historical Museum
緯度 : 55.75453
軽度 : 37.619247
-------------------------
electron@diynoMacBook-Pro gcp %
electron@diynoMacBook-Pro gcp % python3 picture_location_detection.py yasuda_hall.png
解析対象のファイル : yasuda_hall.png
推定される撮影場所が1 件、見つかりました。
University of Tokyo
緯度 : 35.713207
軽度 : 139.761586
-------------------------
electron@diynoMacBook-Pro gcp %
electron@diynoMacBook-Pro gcp % python3 picture_location_detection.py waseda_univ.png
解析対象のファイル : waseda_univ.png
撮影場所の検出に成功しませんでした。
electron@diynoMacBook-Pro gcp %
electron@diynoMacBook-Pro gcp % python3 picture_location_detection.py kyoto_univ.png
解析対象のファイル : kyoto_univ.png
推定される撮影場所が1 件、見つかりました。
Kyoto University
緯度 : 35.025666699999995
軽度 : 135.780855
-------------------------
electron@diynoMacBook-Pro gcp %
electron@diynoMacBook-Pro gcp % python3 picture_location_detection.py space_station.png
解析対象のファイル : space_station.png
撮影場所の検出に成功しませんでした。
electron@diynoMacBook-Pro gcp %