Mapillaryからほしい画像を取得する

1.4K Views

February 16, 25

スライド概要

2025/02/15 FOSS4G Hokkaido 2024
https://foss4g.hokkaido.jp/2024/

profile-image

地図、地理空間情報、街が好きです。

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

関連スライド

各ページのテキスト
1.

Mapillaryから ほしい画像を取得する FOSS4G Hokkaido 2024 2025/2/15 bannyaaa

2.

自己紹介 ✓id: bannyaaa ✓SIerでおしごと(GISは趣味) ✓家のチーフ家事育児オフィサー ✓好きなもの ‣ 物語(時間・仮想空間・記憶を扱った作品が好み) ‣ 旅行(計画をたてたり、他人の旅行記を読むのも)

3.

話すこと 1. Mapillaryの概要 2. 画像の取得方法 3. 画像のフィルタリング

4.

1. Mapillaryの概要

5.

©︎ ©︎ ©︎ ©︎ Mapillaryとは Mapillaryで共有されている画像例 ✓ユーザーが街路画像(street-level imagery)をアップロードして共有 できるプラットフォーム ✓スウェーデンのMapillary AB社が 2013年に提供開始、2020年に Meta社が買収 allennatai(CC BY-SA) fpm(CC BY-SA) mitz(CC BY-SA) nickp(CC BY-SA) ✓全世界で20億枚以上の画像が共有 されている

6.

Mapillaryのプラットフォームでできること ✓ユーザーは、画像のアップロードとダウンロードができる ✓プラットフォーム上で画像が解析され、顔・ナンバープレートはぼかされる Mapillaryのプラットフォーム アップロード 物体検出 ぼかし ダウンロード

7.

Mapillaryの画像の特徴 ✓顔とナンバープレートに自動でぼかしが入るので、加工の手間がかからない ✓オープンデータ(CC BY-SA)であり、研究やビジネスなど幅広く使える ✓ボランティアベースで、撮影対象・構図、撮影機材、撮影条件(天候、時間 帯)にばらつきがあるため、利用目的に合わせた画像のフィルタリングが必要

8.

Mapillaryの画像の活用例 ✓OpenStreetMapの編集 ✓AIモデルの学習や検証 ✓都市の環境評価

9.

2. 画像の取得方法

10.

2. 画像の取得方法 〜取得手段の紹介〜

11.

画像の取得手段(1. Webアプリ) ✓地図や画像を見ながらダウンロード対象を選べる ✓手作業のため大量の画像のダウンロードには向かない 出典:https://www.mapillary.com/app

12.

画像の取得手段(2. データセット) ✓用途にあわせてフィルタリング済みの画像セットが配布されている ✓データセットのライセンスは要確認(Mapillary提供のものは商用不可) 出典:https://www.mapillary.com/datasets

13.

画像の取得手段(3. API) ✓プログラムからMapillaryのWeb APIにアクセスして画像をダウンロード ✓プログラムを開発する必要があるが、条件にあった画像を一括で取得できる ✓MapillaryのPython SDK(ライブラリ)は今後の更新に期待 Mapillaryのプラットフォーム 条件を指定 プログラム ダウンロード

14.

2. 画像の取得方法 〜MapillaryのAPI〜

15.

MapillaryのAPIの概要 ✓利用にはアクセストークンが必要 ‣ 自身のアカウントのDevelopersページで、アプリ情報を登録すると発行さ れるʼClient Tokenʼを使う ✓APIのカテゴリは2つ ‣ ベクトルタイル:交通標識や信号の(推定)位置、画像の撮影地点をタイル で配信するAPI群 ‣ エンティティ:画像の属性情報(撮影日や撮影地点)にアクセスするため のAPI群

16.

プラットフォーム内での画像の扱い ✓APIのリクエストで返るのは、画像の属性情報(画像ファイルではない) ✓画像がアップロードされると画像IDがふられ、撮影日時や画像ファイルの保 存先URLといった属性情報が紐づく(と考える) 画像情報のイメージ 画像ID 1234567890 撮影日時 2025/2/15 00:00 撮影地点 (141.35, 43.06) 物体検出結果 信号、横断歩道 画像ファイルURL https://… … 画像ファイル

17.
[beta]
Image API (imageエンドポイント)
指定した画像IDに紐づく属性情報を取得するAPI
Image APIに画像IDと取得したい属性情報を渡す
import requests
my_token = 'MLY|xxx'
image_id = '1949184908580152'
url = f'https://graph.mapillary.com/
{image_id}?
fields=captured_at,geometry,thumb_original_u
rl&access_token={my_token}'
response = requests.get(url)
data = response.json()
print(data)

撮影日時、撮影場所、画像ファイルURLの取得結果
{
"captured_at": 1551196876000,
"geometry": {
"type": "Point",
"coordinates": [
141.35039489997,
43.0671272
]
},
"thumb_original_url": "https://scontentitm1-1.xx.fbcdn.net/m1/v/t6/An-…省略…bca",
"id": "1949184908580152"
}

18.
[beta]
©︎

Image API (imageエンドポイント)
指定した画像IDに紐づく属性情報を取得するAPI
画像ファイルURLからダウンロード

指定した画像IDの画像ファイル(.jpg)

# URLはdata['thumb_original_url']に格納
image_file = f’{image_id}.jpg'
with open(image_file, 'wb') as handler:
image_data =
requests.get(data['thumb_original_url'],
stream=True).content
handler.write(image_data)

torishin (CC BY-SA)

19.
[beta]
©︎

Image API (imageエンドポイント)
指定した画像IDに紐づく属性情報を取得するAPI
画像ファイルURLからダウンロード

指定した画像IDの画像ファイル(.jpg)

# URLはdata['thumb_original_url']に格納
image_file = f’{image_id}.jpg'
with open(image_file, 'wb') as handler:
image_data =
requests.get(data['thumb_original_url'],
stream=True).content
handler.write(image_data)

画像IDがわかれば画像ファイルは取得できる

torishin (CC BY-SA)

20.

Image API (imagesエンドポイント) Bounding Boxで指定した範囲から複数の画像情報を取得するAPI 設定したBounding Boxの座標が取得できるWebサイト 出典:https://boundingbox.klokantech.com/

21.
[beta]
Image API (imagesエンドポイント)
Bounding Boxで指定した範囲から複数の画像情報を取得するAPI
Image APIにBounding Boxと取得したい属性情報を渡す

範囲内の画像情報の取得結果
{

import requests
my_token = 'MLY|xxx'
url = f'https://graph.mapillary.com/images?
fields=id,thumb_original_url&bbox=141.350529
1192,43.0668274429,141.3521117692,43.0677236
36&access_token={my_token}'
response = requests.get(url)
data = response.json()
print(data)

"data": [
{
"id": "1349076868955436",
"thumb_original_url": "https://scontentnrt1-2.xx.fbcdn.net/m1/v/t6/An-…省略…bca"
},
{
"id": "634820688601325",
"thumb_original_url": "https://scontentnrt1-2.xx.fbcdn.net/m1/v/t6/An_…省略…bca"
},
…
]
}

22.

3. 画像のフィルタリング

23.

©︎ ©︎ ©︎ ©︎ ©︎ ©︎ 目的に沿った画像を集めるには? 全世界の多種多様な画像の中から、研究や調査で必要とする画像を取得する 特定の範囲から画像を集める 目的の物体が写った画像を集める ChenJJ(CC BY-SA) musashino5(CC BY-SA) Ca73(CC BY-SA) ほしい画像 yasunari(CC BY-SA) 出典:https://www.mapillary.com/app watalucky(CC BY-SA) mitz(CC BY-SA)

24.

3. 画像のフィルタリング 〜特定の範囲から画像を集める〜

25.

例題:札幌市内の全画像を集めたい 「国土数値情報(行政区域データ)」(国土交通省)を加工して作成

26.

Image APIの取得範囲を工夫する 札幌市を囲うBounding Boxを取得範囲に指定してImage APIを実行する 「国土数値情報(行政区域データ)」(国土交通省)を加工して作成

27.

Image APIの取得範囲を工夫する 札幌市を囲うBounding Boxを取得範囲に指定してImage APIを実行する Image APIの取得件数は最大2,000件なので困難 「国土数値情報(行政区域データ)」(国土交通省)を加工して作成

28.

Image APIの取得範囲を工夫する タイルと同じ大きさのBounding Boxを設定してImage APIを実行する Zoom Level: 12 「国土数値情報(行政区域データ)」(国土交通省)を加工して作成 Zoom Level: 16 「国土数値情報(行政区域データ)」(国土交通省)を加工して作成

29.

Image APIの取得範囲を工夫する タイルと同じ大きさのBounding Boxを設定してImage APIを実行する Zoom Level: 12 Zoom Level: 16 画像は取得できるけど、もっとよい方法はないか🧐 「国土数値情報(行政区域データ)」(国土交通省)を加工して作成 「国土数値情報(行政区域データ)」(国土交通省)を加工して作成

30.

ベクトルタイルを組み合わせるアプローチ Coverage tiles APIから取得したベクトルタイルの画像情報が利用できそう Coverage tilesのAPIドキュメント 出典: https://www.mapillary.com/developer/api-documentation ベクトルタイルの可視化(オレンジ色の点が画像)

31.
[beta]
ベクトルタイルから画像情報を抽出
札幌駅南東のタイルから画像情報が21,843件取得できた!(注:画像IDはid列)
Coverage tiles APIへのリクエストと画像情報の抽出
import requests
import geopandas as gpd
from vt2geojson.tools import vt_bytes_to_geojson
my_token = 'MLY|xxx'
# 札幌駅南東のタイル
z = 14; x = 14625; y = 6016
url = f'https://tiles.mapillary.com/maps/vtp/mly1_public/
2/{z}/{x}/{y}?access_token={my_token}'
response = requests.get(url)
# ベクトルタイルのデータをGeoPandasへ
vt_content = response.content
features = vt_bytes_to_geojson(vt_content, x, y, z)
gpd_fetures = gpd.GeoDataFrame.from_features(features)
# 画像情報のみを抽出
gpd_images = gpd_fetures[gpd_fetures.geom_type == 'Point']
print(gpd_images.shape)
print(gpd_images.head())

取得できた画像情報の件数と中身
(21843, 8)
geometry

captured_at

creator_id

\
213
214
215
216
217

POINT (141.37017 43.067)
POINT (141.35032 43.06665)
POINT (141.36193 43.05678)
POINT (141.36551 43.06388)
POINT (141.36821 43.05342)

1654253241889
1687726649648
1667722182988
1656820903787
1534899133759

102927448613350
102508918660458
103659545209604
103659545209604
104408981801642

213
214
215
216
217

id
380380077569429
310286147991198
540982981196628
772227227285279
1595819890628774

is_pano
False
False
False
False
False

213
214
215
216
217

sequence_id
mLDIlsM31dAhUOEaG0qnK6
lECRT3x7nfyiFKjeSDrW42
J2b7rApsH3awEV6Tcug5fQ
LB7ZjuKaU2wexvHVTDrXod
inkm40cf3x103jy9vcxozj

image_id
NaN
NaN
NaN
NaN
NaN

compass_angle
79.003472
21.918503
264.290754
0.000000
130.078125

\

32.

画像ファイルの取得にはもう一手間 ✓ベクトルタイルの画像情報には、画像ファイルのURLが含まれない ✓タイルから抽出した画像IDに対してImage APIを実行してURLを入手する Zoom Level: 14 Coverage tiles APIで取得した タイルから画像IDを抽出 Image APIで 画像IDからURLを入手 画像ID 「国土数値情報(行政区域データ)」(国土交通省)を加工して作成 画像ファイルURL 380380077569429 https://… 310286147991198 https://… 540982981196628 https://… … …

33.

3. 画像のフィルタリング 〜目的の物体の写った画像を集める〜

34.

©︎ 例題:信号の写った画像を集めたい watalucky (CC BY-SA)

35.
[beta]
Mapillaryの物体検出結果を使う
✓プラットフォーム内の画像の物体検出結果はImage APIから取得できる
✓1ページ前の画像において信号が検出できていることが確認できる
Image APIへのリクエスト
import requests
my_token = 'MLY|xxx'
image_id = '635260998015689'
url = f'https://graph.mapillary.com/
{image_id}?
fields=detections.value&access_token={my_
token}'
response = requests.get(url)
data = response.json()
print(data)

レスポンス
{
"detections": {
"data": [
…
{
"value": "object--traffic-light--generalupright-front",
"id": "635452301329892"
},
…
{
"value": "object--traffic-light--generalupright-front",
"id": "635452334663222"
},
…
]
}
}

36.

©︎ Mapillaryの物体検出結果を使う際の注意点 検出できるのは定義済みのカテゴリのみ 検出できない場合がある 出典:https://www.mapillary.com/developer/api-documentation/detections s1319oka (CC BY-SA)

37.
[beta]
©︎

Mapillaryの物体検出結果を使う際の注意点
検出できるのは定義済みのカテゴリのみ

検出できない場合がある

物体検出結果に信号がない
{
"detections": {
"data": [
{
"value": "regulatory--noparking--g1",
"id": "4350367648328543"
},
{
"value": "object--sign-advertisement",
"id": "4361214117243896"
},
{
"value": "object--sign--store",
"id": "4362053953826579"
}
]
}
}
出典:https://www.mapillary.com/developer/api-documentation/detections

s1319oka (CC BY-SA)

38.

©︎ 自前のAIモデルで物体検出する 画像をダウンロード後にYOLO等で物体検出してフィルタリングする手もある YOLO-Worldを使って信号が検出できた s1319oka (CC BY-SA)

39.

まとめ

40.

話したこと 1. Mapillaryの街路画像は、オープンデータとして利用できる 2. 画像IDが取得できれば、属性情報から画像ファイルのURLがたどれる 3. 範囲や写っている物体でフィルタリングをかけ、ほしい画像を取得する

41.

おしまい Mapillaryの画像を使ってみませんか?