Amazon SageMaker Geospatial ML AwsAdventCalendar
はじめに
このブログはAI/ML on AWS Advent Calendar 2022の6日目の記事です。
re:invent2022で発表されたAmazon SageMaker Geospatial MLについて整理したいと思います。
別途コンソールで試した記事は既にあるのですが、不明点もあり再整理したい内容となります。
Sagemaker Geospatialってなに?
地理空間機械学習(ML)サポートし、地理空間データを使ったモデルの構築、トレーニング、デプロイが容易とするサービス。AWSが提供するオープンデータ(USGS Landsat、Sentinel-2)、または衛生画像・イメージ・地図情報・GPSなどを持ち込みデータにアクセスし、事前に学習したMLモデルを選択して、モデル構築を加速。予測結果に対して地図上で分析・探索し、結果を共有・共同作業することが可能。
ユースケースとしては自然災害による地域経済への影響分析、建設プロジェクトの追跡、住みやすい都市環境の設計などに用いられる
Sagemaker Geospatialがやれること
■IAM Policyで確認
キーワードとしては以下3点のようです、意味は後述
- EarthObservationJobs
- VectorEnrichmentJobs
- RasterDataCollections
■Amazon SageMaker Studioで確認
キーワードとしては以下4点のようです、意味は後述
- Earth Observation jobs
- Vector Enrichment jobs
- Map Visualization
- Geospatial Notebooks
■整理
キーワード | 説明 |
---|---|
Earth Observation jobs | 地球表面から収集したデータを取得し、変換し、可視化して、洞察や予測を行う。 |
Vector Enrichment jobs | Amazon Location Services を使用して、地図座標を人間の読みやすい住所に逆ジオコーディングします。不正確な経度と緯度を既知の道路網セグメントにスナップして、マップマッチングを実行する処理 |
Raster Data Collections | USGS Landsat、Sentinel-2のデータコレクション |
Map Visualization | Amazon S3からCSV、JSON、GeoJSONファイルをアップロードし、強力な可視化ツールを使ってデータを可視化することができます。 |
Geospatial Notebooks | GDAL、Fiona、GeoPandas、Shapely、RasterioなどのライブラリやSageMaker固有のライブラリを使って、地理空間ノートブック内でデータを変換し、可視化することができます。 |
Role・Policyについて
sagemaker
とsagemaker-geospatial
は別カテゴリでAPIやIAMは整理されています。信頼関係や許可については必要に応じて更新をお願いします、詳細はリンク先参照
https://docs.aws.amazon.com/sagemaker/latest/dg/sagemaker-geospatial-roles.html
Earth Observation jobsをやってみる
繰り返しとなりますが、機能としては「地球表面から収集したデータを取得し、変換し、可視化して、洞察や予測を行う。」となります。jobが行えるオペレーションは以下です。
ちなみにRaster Data CollectionsはUSGS Landsat、Sentinel-2の2つあるが、全てのオペレーションが利用できる訳ではないです、今回は"クラウド除去"を実施しますがUSGS Landsatを利用します
■search-raster-data-collection
条件に合う画像がRaster Data Collectionsにないとエラーになるため、事前に調査を行います。
cli-input-jsonを準備
cli-input-json
{
"Arn": "arn:aws:sagemaker-geospatial:us-west-2:378778860802:raster-data-collection/public/gmqa64dcu2g9ayx1",
"RasterDataCollectionQuery": {
"TimeRangeFilter": {
"StartTime": "2022-01-01T00:00:00Z",
"EndTime": "2022-11-30T23:59:59Z"
},
"AreaOfInterest": {
"AreaOfInterestGeometry": {
"PolygonGeometry": {
"Coordinates": [
[
[
139.720509,
35.635363
],
[
139.720787,
35.628579
],
[
139.711368,
35.62891
],
[
139.711625,
35.634561
],
[
139.711625,
35.635136
],
[
139.720509,
35.635363
]
]
]
}
}
},
"PropertyFilters": {
"Properties": [
{
"Property": {
"LandsatCloudCoverLand": {
"LowerBound": 0.0,
"UpperBound": 20.0
}
}
}
],
"LogicalOperator": "AND"
}
}
}
cmd
!aws sagemaker-geospatial search-raster-data-collection --cli-input-json file://srdc.json
result
14個の結果が取得できることを確認
{
"ApproximateResultCount": 14,
略
}
■start-earth-observation-job
cli-input-jsonを準備
cli-input-json
{
"Name": "otameshi-1",
"InputConfig": {
"RasterDataCollectionQuery": {
"RasterDataCollectionArn": "arn:aws:sagemaker-geospatial:us-west-2:378778860802:raster-data-collection/public/gmqa64dcu2g9ayx1",
"TimeRangeFilter": {
"StartTime": "2022-01-01T00:00:00Z",
"EndTime": "2022-11-30T23:59:59Z"
},
"AreaOfInterest": {
"AreaOfInterestGeometry": {
"PolygonGeometry": {
"Coordinates": [
[
[
139.720509,
35.635363
],
[
139.720787,
35.628579
],
[
139.711368,
35.62891
],
[
139.711625,
35.634561
],
[
139.711625,
35.635136
],
[
139.720509,
35.635363
]
]
]
}
}
},
"PropertyFilters": {
"Properties": [
{
"Property": {
"LandsatCloudCoverLand": {
"LowerBound": 0.0,
"UpperBound": 20.0
}
}
}
],
"LogicalOperator": "AND"
}
}
},
"JobConfig": {
"CloudRemovalConfig": {
"AlgorithmName": "INTERPOLATION"
}
},
"ExecutionRoleArn": "arn:aws:iam::123456789012:role/service-role/AmazonSageMaker-ExecutionRole-20221117T213439"
}
cmd
!aws sagemaker-geospatial start-earth-observation-job --cli-input-json file://seoj.json
result
result
{
"Name": "otameshi-1",
"Arn": "arn:aws:sagemaker-geospatial:us-west-2:123456789012:earth-observation-job/rwrjjc7dtvw3",
"CreationTime": "2022-12-04T12:37:04.354625+00:00",
"DurationInSeconds": 0,
"Status": "INITIALIZING",
"InputConfig": {
"RasterDataCollectionQuery": {
"RasterDataCollectionArn": "arn:aws:sagemaker-geospatial:us-west-2:378778860802:raster-data-collection/public/gmqa64dcu2g9ayx1",
"RasterDataCollectionName": "Landsat Collection 2 Level-2 Science Products",
"TimeRangeFilter": {
"StartTime": "2022-01-01T00:00:00Z",
"EndTime": "2022-11-30T23:59:59Z"
},
"AreaOfInterest": {
"AreaOfInterestGeometry": {
"PolygonGeometry": {
"Coordinates": [
[
[
139.720509,
35.635363
],
[
139.720787,
35.628579
],
[
139.711368,
35.62891
],
[
139.711625,
35.634561
],
[
139.711625,
35.635136
],
[
139.720509,
35.635363
]
]
]
}
}
},
"PropertyFilters": {
"Properties": [
{
"Property": {
"LandsatCloudCoverLand": {
"LowerBound": 0.0,
"UpperBound": 20.0
}
}
}
],
"LogicalOperator": "AND"
}
}
},
"JobConfig": {
"CloudRemovalConfig": {
"AlgorithmName": "INTERPOLATION"
}
},
"ExecutionRoleArn": "arn:aws:iam::123456789012:role/service-role/AmazonSageMaker-ExecutionRole-20221117T213439",
"Tags": {}
}
■get-earth-observation-job
start-earth-observation-jobで得たArnを利用します
cmd
!aws sagemaker-geospatial get-earth-observation-job --arn "arn:aws:sagemaker-geospatial:us-west-2:123456789012:earth-observation-job/rwrjjc7dtvw3"
result
30分近く要しましたが、正常終了
result
{
"Arn": "arn:aws:sagemaker-geospatial:us-west-2:123456789012:earth-observation-job/rwrjjc7dtvw3",
"Name": "otameshi-1",
"CreationTime": "2022-12-04T12:37:04.354625+00:00",
"DurationInSeconds": 1720,
"Status": "COMPLETED",
"InputConfig": {
"RasterDataCollectionQuery": {
"RasterDataCollectionArn": "arn:aws:sagemaker-geospatial:us-west-2:378778860802:raster-data-collection/public/gmqa64dcu2g9ayx1",
"RasterDataCollectionName": "Landsat Collection 2 Level-2 Science Products",
"TimeRangeFilter": {
"StartTime": "2022-01-01T00:00:00Z",
"EndTime": "2022-11-30T23:59:59Z"
},
"AreaOfInterest": {
"AreaOfInterestGeometry": {
"PolygonGeometry": {
"Coordinates": [
[
[
139.720509,
35.635363
],
[
139.720787,
35.628579
],
[
139.711368,
35.62891
],
[
139.711625,
35.634561
],
[
139.711625,
35.635136
],
[
139.720509,
35.635363
]
]
]
}
}
},
"PropertyFilters": {
"Properties": [
{
"Property": {
"LandsatCloudCoverLand": {
"LowerBound": 0.0,
"UpperBound": 20.0
}
}
}
],
"LogicalOperator": "AND"
}
}
},
"JobConfig": {
"CloudRemovalConfig": {
"AlgorithmName": "INTERPOLATION",
"InterpolationValue": "-9999"
}
},
"OutputBands": [
{
"BandName": "coastal",
"OutputDataType": "FLOAT32"
},
{
"BandName": "blue",
"OutputDataType": "FLOAT32"
},
{
"BandName": "green",
"OutputDataType": "FLOAT32"
},
{
"BandName": "red",
"OutputDataType": "FLOAT32"
},
{
"BandName": "nir",
"OutputDataType": "FLOAT32"
},
{
"BandName": "swir16",
"OutputDataType": "FLOAT32"
},
{
"BandName": "swir22",
"OutputDataType": "FLOAT32"
},
{
"BandName": "qa_aerosol",
"OutputDataType": "FLOAT32"
},
{
"BandName": "qa_pixel",
"OutputDataType": "FLOAT32"
},
{
"BandName": "qa_radsat",
"OutputDataType": "FLOAT32"
},
{
"BandName": "lwir11",
"OutputDataType": "FLOAT32"
},
{
"BandName": "atran",
"OutputDataType": "FLOAT32"
},
{
"BandName": "cdist",
"OutputDataType": "FLOAT32"
},
{
"BandName": "drad",
"OutputDataType": "FLOAT32"
},
{
"BandName": "urad",
"OutputDataType": "FLOAT32"
},
{
"BandName": "trad",
"OutputDataType": "FLOAT32"
},
{
"BandName": "emis",
"OutputDataType": "FLOAT32"
},
{
"BandName": "emsd",
"OutputDataType": "FLOAT32"
}
],
"ExecutionRoleArn": "arn:aws:iam::123456789012:role/service-role/AmazonSageMaker-ExecutionRole-20221117T213439",
"Tags": {}
}
■結果
input
左側に雲画像が見えるかと思います
input
雲を除去が表示されます。いろんなレイヤーがあるけどイマイチわからん。
Vector Enrichment jobsをやってみる(逆ジオコーディング)
リバースジオコーディングとマップマッチングの2つの機能がありますので、まずは逆ジオコーディングを試します。
■csvファイル準備
軽度と緯度を記載したファイルをS3にUpLoadしておきます、場所は目黒セントラルスクエアです
No | X | Y |
---|---|---|
1 | 139.7170453392394 | 35.633382211006634 |
■start-vector-enrichment-job
cli-input-jsonを準備
JobConfig.ReverseGeocodingConfigはcsvのカラム名に合わせます。
{
"Name": "otameshi-2",
"InputConfig": {
"DocumentType": "CSV",
"DataSourceConfig": {
"S3Data": {
"S3Uri": "s3://sagemaker-us-west-2-123456789012/meguro.csv"
}
}
},
"JobConfig": {
"ReverseGeocodingConfig": {
"YAttributeName": "Y",
"XAttributeName": "X"
}
},
"ExecutionRoleArn": "arn:aws:iam::123456789012:role/service-role/AmazonSageMaker-ExecutionRole-20221117T213439"
}
cmd
!aws sagemaker-geospatial start-vector-enrichment-job --cli-input-json file://svej.json
result
result
{
"Name": "otameshi-2",
"Arn": "arn:aws:sagemaker-geospatial:us-west-2:123456789012:vector-enrichment-job/rj594z2abxhh",
"Type": "REVERSE_GEOCODING",
"CreationTime": "2022-12-04T01:06:26.796946+00:00",
"DurationInSeconds": 0,
"Status": "INITIALIZING",
"InputConfig": {
"DocumentType": "CSV",
"DataSourceConfig": {
"S3Data": {
"S3Uri": "s3://sagemaker-us-west-2-123456789012/meguro.csv"
}
}
},
"JobConfig": {
"ReverseGeocodingConfig": {
"YAttributeName": "Y",
"XAttributeName": "X"
}
},
"ExecutionRoleArn": "arn:aws:iam::123456789012:role/service-role/AmazonSageMaker-ExecutionRole-20221117T213439",
"Tags": {}
}
■get-vector-enrichment-job
cmd
start-vector-enrichment-jobで得たARNを利用してget-vector-enrichment-jobを実施
!aws sagemaker-geospatial get-vector-enrichment-job --arn "arn:aws:sagemaker-geospatial:us-west-2:123456789012:vector-enrichment-job/rj594z2abxhh"
result
result
{
"Arn": "arn:aws:sagemaker-geospatial:us-west-2:123456789012:vector-enrichment-job/rj594z2abxhh",
"Type": "REVERSE_GEOCODING",
"Name": "otameshi-2",
"CreationTime": "2022-12-04T01:06:26.796946+00:00",
"DurationInSeconds": 9,
"Status": "COMPLETED",
"InputConfig": {
"DocumentType": "CSV",
"DataSourceConfig": {
"S3Data": {
"S3Uri": "s3://sagemaker-us-west-2-123456789012/meguro.csv"
}
}
},
"JobConfig": {
"ReverseGeocodingConfig": {
"YAttributeName": "Y",
"XAttributeName": "X"
}
},
"ExecutionRoleArn": "arn:aws:iam::123456789012:role/service-role/AmazonSageMaker-ExecutionRole-20221117T213439",
"Tags": {}
}
■export-vector-enrichment-job
cli-input-jsonを準備
Arnはstart-vector-enrichment-jobで得たArnとなる
{
"Arn": "arn:aws:sagemaker-geospatial:us-west-2:123456789012:vector-enrichment-job/56u98fe5dakd",
"ExecutionRoleArn": "arn:aws:iam::123456789012:role/service-role/AmazonSageMaker-ExecutionRole-20221117T213439",
"OutputConfig": {
"S3Data": {
"S3Uri": "s3://sagemaker-us-west-2-123456789012",
"KmsKeyId": ""
}
}
}
cmd
!aws sagemaker-geospatial export-vector-enrichment-job --cli-input-json file://evej.json
result
IN_PROGRESSで結果は出るが、S3に出力されるまで正常終了・異常終了が見えないのがいまいち。。。
result
{
"Arn": "arn:aws:sagemaker-geospatial:us-west-2:123456789012:vector-enrichment-job/rj594z2abxhh",
"CreationTime": "2022-12-04T01:13:05.250466+00:00",
"ExecutionRoleArn": "arn:aws:iam::123456789012:role/service-role/AmazonSageMaker-ExecutionRole-20221117T213439",
"ExportStatus": "IN_PROGRESS",
"OutputConfig": {
"S3Data": {
"S3Uri": "s3://sagemaker-us-west-2-123456789012",
"KmsKeyId": ""
}
}
}
s3の中身
No | X | Y | reverse_geo.address_number | reverse_geo.country | reverse_geo.label | reverse_geo.municipality | reverse_geo.neighborhood | reverse_geo.postal_code | reverse_geo.region | reverse_geo.status |
---|---|---|---|---|---|---|---|---|---|---|
1 | 139.7170453392394 | 35.633382211006634 | 5 | JPN | 東京都品川区上大崎3-1-5 | 3 | 1410021 | 東京都 | Valid Data |
出力結果の住所を確認
期待通り、目黒セントラルスクエアの住所が取得できました。
Vector Enrichment jobsをやってみる(マップマッチング)
マップマッチングも試してみます。
■csvファイル準備
Id、タイムスタンプ、軽度、緯度を記載したファイルをS3にUpLoadしておきます。
id | latitude | longitude | pdate |
---|---|---|---|
1 | 35.636770 | 139.713786 | 2022-12-4 10:01:00 |
2 | 35.636062 | 139.714042 | 2022-12-4 10:01:00 |
3 | 35.637651 | 139.713943 | 2022-12-4 10:01:00 |
4 | 35.635253 | 139.714373 | 2022-12-4 10:01:00 |
5 | 35.638022 | 139.714223 | 2022-12-4 10:01:00 |
6 | 35.637934 | 139.715278 | 2022-12-4 10:01:00 |
■start-vector-enrichment-job
cli-input-jsonを準備
JobConfig.MapMatchingConfigはcsvのカラム名に合わせます。
{
"Name": "otameshi-3",
"InputConfig": {
"DocumentType": "CSV",
"DataSourceConfig": {
"S3Data": {
"S3Uri": "s3://sagemaker-us-west-2-123456789012/meguro2.csv"
}
}
},
"JobConfig": {
"MapMatchingConfig": {
"IdAttributeName": "id",
"YAttributeName": "longitude",
"XAttributeName": "latitude",
"TimestampAttributeName": "pdate"
}
},
"ExecutionRoleArn": "arn:aws:iam::123456789012:role/service-role/AmazonSageMaker-ExecutionRole-20221117T213439"
}
cmd
!aws sagemaker-geospatial start-vector-enrichment-job --cli-input-json file://svej.json
result
result
{
"Name": "otameshi-3",
"Arn": "arn:aws:sagemaker-geospatial:us-west-2:123456789012:vector-enrichment-job/w5bqkei4a3x7",
"Type": "MAP_MATCHING",
"CreationTime": "2022-12-04T05:27:39.521644+00:00",
"DurationInSeconds": 0,
"Status": "INITIALIZING",
"InputConfig": {
"DocumentType": "CSV",
"DataSourceConfig": {
"S3Data": {
"S3Uri": "s3://sagemaker-us-west-2-123456789012/data.csv"
}
}
},
"JobConfig": {
"MapMatchingConfig": {
"IdAttributeName": "id",
"YAttributeName": "latitude",
"XAttributeName": "longitude",
"TimestampAttributeName": "pdate"
}
},
"ExecutionRoleArn": "arn:aws:iam::123456789012:role/service-role/AmazonSageMaker-ExecutionRole-20221117T213439",
"Tags": {}
}
■get-vector-enrichment-job
cmd
start-vector-enrichment-jobで得たARNを利用してget-vector-enrichment-jobを実施
!aws sagemaker-geospatial get-vector-enrichment-job --arn "arn:aws:sagemaker-geospatial:us-west-2:123456789012:vector-enrichment-job/w5bqkei4a3x7"
result
result
{
"Arn": "arn:aws:sagemaker-geospatial:us-west-2:123456789012:vector-enrichment-job/w5bqkei4a3x7",
"Type": "MAP_MATCHING",
"Name": "otameshi-3",
"CreationTime": "2022-12-04T05:27:39.521644+00:00",
"DurationInSeconds": 104,
"Status": "COMPLETED",
"InputConfig": {
"DocumentType": "CSV",
"DataSourceConfig": {
"S3Data": {
"S3Uri": "s3://sagemaker-us-west-2-123456789012/data.csv"
}
}
},
"JobConfig": {
"MapMatchingConfig": {
"IdAttributeName": "id",
"YAttributeName": "latitude",
"XAttributeName": "longitude",
"TimestampAttributeName": "pdate"
}
},
"ExecutionRoleArn": "arn:aws:iam::123456789012:role/service-role/AmazonSageMaker-ExecutionRole-20221117T213439",
"Tags": {}
}
■export-vector-enrichment-job
cli-input-jsonを準備
Arnはstart-vector-enrichment-jobで得たArnとなる
{
"Arn": "arn:aws:sagemaker-geospatial:us-west-2:123456789012:vector-enrichment-job/w5bqkei4a3x7",
"ExecutionRoleArn": "arn:aws:iam::123456789012:role/service-role/AmazonSageMaker-ExecutionRole-20221117T213439",
"OutputConfig": {
"S3Data": {
"S3Uri": "s3://sagemaker-us-west-2-123456789012",
"KmsKeyId": ""
}
}
}
cmd
!aws sagemaker-geospatial export-vector-enrichment-job --cli-input-json file://xvej.json
result
IN_PROGRESSで結果は出るが、S3に出力されるまで正常終了・異常終了が見えないのがいまいち。。。
result
{
"Arn": "arn:aws:sagemaker-geospatial:us-west-2:123456789012:vector-enrichment-job/w5bqkei4a3x7",
"CreationTime": "2022-12-04T05:43:42.553090+00:00",
"ExecutionRoleArn": "arn:aws:iam::123456789012:role/service-role/AmazonSageMaker-ExecutionRole-20221117T213439",
"ExportStatus": "IN_PROGRESS",
"OutputConfig": {
"S3Data": {
"S3Uri": "s3://sagemaker-us-west-2-123456789012",
"KmsKeyId": ""
}
}
}
■アウトプット
マッチングせずにデータが無し。マッピングされたgeojsonを吐き出すと思ったけどちゃうん?
{"mapMatchRecords":[]}
Map Visualizationをやってみる
https://nlftp.mlit.go.jp/index.html
国土交通省から適当にデータを探して道路データを表示させてみました。
レイヤーを重ねて道路と水害地域など表現できるかと思います。
改善要望
■コンソールのvector-enrichment-jobについて
Earth Observation jobsに比べると詳細ステータス確認や削除ができないので、レベル感は合わせて欲しい。
■export-vector-enrichment-job(逆ジオコーディング)について
startやgetでは正常終了しているが、exportの中身はエラーになっている場合がある、startで弾いて欲しい。
■export-vector-enrichment-jobについて
aws sagemaker-geospatial export-vector-enrichment-job
でVECの結果が出力されるが1行データでも即時ではない。ステータスがIN_PROGRESSになることは確認できるが、その後に"異常終了" or "処理中"かが拾えるAPIが無い?と思われる。
■jobのページング・検索について
ページングが一枚目しか表示されない、検索が効いてない。
!aws sagemaker-geospatial list-vector-enrichment-jobs | grep "Arn" | wc -l
11
参考記事
https://aws.amazon.com/jp/sagemaker/geospatial/
https://awscli.amazonaws.com/v2/documentation/api/latest/reference/sagemaker-geospatial/index.html
Discussion