🚴🏻‍♀️

Amazon SageMaker Geospatial ML AwsAdventCalendar

2022/12/06に公開

はじめに

このブログはAI/ML on AWS Advent Calendar 2022の6日目の記事です。

re:invent2022で発表されたAmazon SageMaker Geospatial MLについて整理したいと思います。
別途コンソールで試した記事は既にあるのですが、不明点もあり再整理したい内容となります。

Sagemaker Geospatialってなに?

地理空間機械学習(ML)サポートし、地理空間データを使ったモデルの構築、トレーニング、デプロイが容易とするサービス。AWSが提供するオープンデータ(USGS LandsatSentinel-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 LandsatSentinel-2のデータコレクション
Map Visualization Amazon S3からCSV、JSON、GeoJSONファイルをアップロードし、強力な可視化ツールを使ってデータを可視化することができます。
Geospatial Notebooks GDAL、Fiona、GeoPandas、Shapely、RasterioなどのライブラリやSageMaker固有のライブラリを使って、地理空間ノートブック内でデータを変換し、可視化することができます。

Role・Policyについて

sagemakersagemaker-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 JPN 東京都品川区上大崎3-1-5 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/blogs/aws/preview-use-amazon-sagemaker-to-build-train-and-deploy-ml-models-using-geospatial-data/

https://aws.amazon.com/jp/sagemaker/geospatial/

https://awscli.amazonaws.com/v2/documentation/api/latest/reference/sagemaker-geospatial/index.html

Discussion