GISコミュニティフォーラム開催報告:「ArcGISでデータサイエンスしよう ~より高度で自由な地理空間分析へ~」②

Document created by hiromu_nakamuraesrij-esridist Employee on Sep 4, 2019Last modified by hiromu_nakamuraesrij-esridist Employee on Sep 11, 2019
Version 4Show Document
  • View in full screen mode

はじめに

2019 5 22 () 24 ()、東京ミッドタウン 六本木にて第15GIS コミュニティフォーラム及びプレフォーラム・セミナーが開催されました。

公開可能なセッションの発表資料は ESRIジャパンのサポートサイトで公開しております。また、GeoNet ブログでは開発者向けのセッションで使用したコードなどをご紹介しています。発表資料や GeoNet 記事、GitHub へのリンクなどの詳細は第15回GISコミュニティフォーラム開催報告記をご覧ください。

テクニカル セッション「ArcGISでデータサイエンスしよう ~より高度で自由な地理空間分析へ~」の中では、R Python との連携による高度な解析についてデモンストレーションを交えてご紹介しました。少し間が空いてしまいましたが、今回は ArcGIS API for Python ArcGIS Pro を用いてディープ ラーニング モデルを作成し、航空写真から航空機を検出したデモンストレーションについて詳細をご紹介いたします。R との連携については前回の記事をご参照ください。

 

 

概要

本稿は以下の流れに沿ってご紹介します。

 

  1. ArcGIS API for Python を用いたディープ ラーニングについて
  2. 環境構築
  3. セッションでご紹介したデモンストレーションの全体像
  4. デモンストレーションの再現手順
    1. トレーニング データの作成
    2. ArcGIS API for Python を用いたディープ ラーニング モデルの作成
    3. 作成したディープ ラーニング モデルの適用
  5. まとめ

 

 

1.ArcGIS API for Python を用いたディープ ラーニングについて

ArcGIS API for Python は、Web GIS (ArcGIS Online / ArcGIS Enterprise) を活用してマップと地理空間データを扱うための API です。本 API は、想定されるユーザーが以下の 4 つのタイプとして明確に定められています。

 

  1. Web GIS の管理者
  2. コンテンツ作成者
  3. GIS アナリスト/データ サイエンティスト
  4. 開発者

 

上記の中でも、特に GIS アナリスト/データ サイエンティストに対しては、Web サイトで公開されているサンプル コードの数が最も多く、米国 Esri 社も利用の推進に力を入れているセグメントです。

ArcGIS API for Python は、TensorFlowPyTorch 等のディープ ラーニング用フレームワークと組み合わせて使用することが可能です。特に PyTorch については、PyTorch をベースに開発されている fastai というライブラリをラッピングしており、両者を追加でインストールすることで、arcgis.learn モジュールから直接機能を呼び出して使用することができるようになっています。

以降では、GIS コミュニティフォーラムでご紹介したデモンストレーションをもとに、具体的な環境構築の方法、トレーニング データの作成、ArcGIS API for Python によるディープ ラーニングの学習、そして学習したモデルを適用するまでの一連の流れをご紹介していきます。

 

 

2.環境構築

① 使用したソフトウェア等

ご紹介したデモンストレーションで使用したソフトウェア、エクステンションおよび Python のライブラリは以下のとおりです(右側に記載した数字は使用したバージョンです)。

 

 

② GeoAI Data Science VM について

ディープ ラーニングによる学習を実行するにあたり、比較的ハイスペックな GPU が必要となるため、今回は Microsoft Azure の Geo AI Data Science VM (GeoAI DSVM) を使用して仮想マシンを構築しました。Azure 上での GeoAI DSVM のプロビジョニングについては Microsoft Azure のドキュメントをご参照ください。GeoAI DSVM には ArcGIS Pro の英語版があらかじめインストールされています。

 

③ ディープ ラーニング用の Python 環境の作成

ArcGIS Pro は Miniconda を内包しており、Python パッケージ マネージャーから複数の Python 環境を作成・管理することができます (詳細については「ArcGIS API for Python のコアコンセプト その 2」を参照ください)。以降では、この機能を用いてデフォルトの Python 環境とは別にディープ ラーニング用の環境を作成します。

必須ではありませんが、GeoAI DSVM の ArcGIS Pro の UI を日本語に設定したい場合は、弊社サポートサイトから日本語版をダウンロードしてインストールしてください。

※ 英語環境でも以降の手順は同じです。

 

  • ArcGIS Pro を起動し、スタートアップ画面の左下にある [設定] をクリックします。
  • [Python] メニューオプションを選択します。
  • [環境の管理] ボタンをクリックし、「環境の管理」ウィンドウを開いて、[デフォルトのクローン] ボタンを選択します。
  • デフォルト環境のクローンが作成されます。
  • クローンの作成中は下部にインストール中のパッケージ名が表示されます。
    すべてのパッケージのインストールが完了すると、クローンされた環境が格納されているディレクトリ名が表示されます。
    ※ 完了前に操作をすると、作成した環境が正常に動作しない可能性があります。

    クローン環境作成の様子

  • 作成した環境のラジオボタンをクリックして、環境をアクティブにします。

    ※ アクティブな環境をデフォルトに戻したい場合は、arcgispro-py3 (デフォルトの環境) のラジオボタンをクリックしてください。

     

  • 環境をアクティブにしたら、ArcGIS Pro を終了し、[スタート] → [ArcGIS] → [Python コマンド プロンプト] の順にクリックして、Python コマンドプロンプトを起動します。

 

  • Python コマンド プロンプトが開いたら、以下のコマンドを一行ずつ実行して必要なライブラリをインストールします。都度インストールするか確認されるので、y → Enter でインストールを開始します。
conda install -c conda-forge spacy
conda install -c pytorch pytorch=1.0.0 torchvision
conda install -c fastai fastai=1.0.39
conda install -c arcgis arcgis=1.6.0 --no-pin

上記ライブラリのインストールが終了しましたら実行環境の準備は終了です。後ほど再度使用しますが、一度 Python コマンド プロンプトを閉じておきます。

 

 

3.セッションでご紹介したデモンストレーションの全体像

詳細に入る前にGIS コミュニティフォーラムでご紹介したデモの全体像を以下に示します。

① 初めに ArcGIS Pro [トレーニング サンプル マネージャー] [ディープ ラーニング用のトレーニング データをエクスポート] ツールを用いてトレーニング データとして航空写真から航空機の画像のトレーニング データを作成します。

② その後、作成したトレーニング データから、ArcGIS API for Python を用いて Single Shot Detector と呼ばれる手法で学習し、ディープ ラーニング モデルを作成します。

③ 最後に、ArcGIS Pro [ディープ ラーニングを使用したオブジェクトの検出] ツールと作成されたモデルを使用して、トレーニングに用いた航空写真とは別の場所の航空写真から航空機を検出します。上手く検出されると以下の画像のように航空機の位置を示す四角形のフィーチャクラスが作成されます。

 

 

4.デモンストレーションの再現手順

a. トレーニング データの作成

ここからは ArcGIS Pro のトレーニング サンプル マネージャー (Spatial Analyst もしくは Image Analyst が必要です) を使用して学習に用いるトレーニング データを作成していきます。今回は、Living Atlas から利用できる USA NAIP Imagery: Natural Color (ArcGIS Online の組織アカウント又は ArcGIS Developer Subscription のアカウントが必要です) を用いて米国内の主要な空港に駐機している航空機のトレーニング データを作成します。

ArcGIS Pro を起動し、新たなプロジェクトを作成し、マップを開きます。[カタログ ウィンドウ] を開き、[ポータル] [Living Atlas] をクリックし、「NAIP Imagery」と検索します。検索結果の中から「USA NAIP Imagery: Natural Color」をドラッグ & ドロップでマップに追加します。

 

[コンテンツ ウィンドウ] NAIP のイメージ レイヤーが追加されるので、米国内の主要な空港にマップを移動しましょう。主要な各空港の位置をブックマークしたブックマーク ファイル (US_airports.bkmx) GitHub 上で共有しています。インポートすることで、ブックマークから各空港へマップを移動することができるようになるのでご活用ください。ブックマーク ファイルのインポートの方法についてはブックマークに係るヘルプの中盤に記載されています (※ 当該機能は ArcGIS Pro 2.4 の機能です。2.3 を利用されている方は、アメリカ合衆国の空港の一覧などから大きな空港を数カ所選び、マップ操作で直接移動するか場所検索等の機能を用いて移動しましょう)。

 

次に、[コンテンツ ウィンドウ] NAIP のイメージ レイヤーをクリックし、レイヤーを選択した状態にしたら、リボンの [画像] [分類ツール] [トレーニング サンプル マネージャー] の順にクリックします。

 

[トレーニング サンプル マネージャー] のウィンドウが開くので、[スキーマの新規作成] アイコンをクリックします。

新しいスキーマを設定できるようになるので、[新しいスキーマ] を右クリックしてメニューを開き、[新しいクラスの追加] をクリックします。

[新しいクラスの追加] ダイアログに、以下画像の内容を入力し、[OK] ボタンをクリックします。この時設定した [名前] [] を、後ほど ArcGIS API for Python でディープ ラーニング モデルの学習を行う際に指定する必要があります。

 

[保存] アイコンをクリックし、名前を入力した後にフォルダを指定してスキーマを保存します。作成したスキーマはEsri 分類スキーマ (*.ecs) と呼ばれるファイルとして保存されます。スキーマを保存しておけば後日再利用することが可能です。

 

トレーニング サンプル サンプル マネージャーの画面で、[passenger_airplane] をクリックするとトレーニング サンプル作成のツールがアクティブになるので、円ツールを選択します。

 

先程マップに追加したNAIPの画像に対して、以下のように航空機の中心からドラッグしてトレーニング サンプルを作成していきます。

 

 

 

 

ラベル付けが終了したら以下のアイコンをクリックして、サンプルをフィーチャクラスとしてファイル ジオデータベースに保存しましょう。

 

最後にジオプロセシング ツールの [ディープ ラーニング用のトレーニング データをエクスポート] ツールに以下のパラメーターを設定して実行します。

  • 入力ラスター: USA NAIP Imagery: Natural Color
  • 出力フォルダー:任意のフォルダー(フォルダーを指定する際のダイアログで右クリックすると、新規フォルダーを作成できます)
  • 入力フィーチャクラスまたは分類ラスター:フィーチャクラスとして保存したサンプルを指定
  • クラス値フィールド:Classvalue
  • イメージ形式:PNG形式
  • メタデータ形式:PASCAL Visual Object Classes

 

エクスポートが完了すると指定した出力フォルダーに画像のチップや、各画像のチップ中のどこに航空機があるかを示す座標を含んだ xml ファイル等が出力されます。

上記のトレーニング データの作成手順は Learn ArcGIS でも詳しく解説していますので、併せてご参照ください。

 

b. ArcGIS API for Python を用いたディープ ラーニング モデルの作成

ここからは ArcGIS API for Python を用いてディープ ラーニング モデルを作成します。

改めて Python コマンド プロンプトを起動し、トレーニングデータをエクスポートしたフォルダーがあるディレクトリまで cdコマンドで移動します。

ディレクトリを移動したら、 jupyter notebook とコマンドを打って Jupyter Notebook を起動します。jupyter notebook で起動しなかった場合は半角スペースの代わりにハイフンを用いて jupyter-notebook とコマンドを打って実行します(参考:What to do when things go wrong - Jupyter fails to start)

 

Jupyter Notebook が起動したら新しいノートブックを作成してスクリプトを書いていきます。セッションで紹介した Jupyter Notebook GitHub 上で公開しています。以下ではコードの中身を説明していきます。

 

ArcGIS API for Python learn モジュールをインポートします。

from arcgis.learn import *

 

prepare_data() はディープ ラーニングの学習をするためのデータ オブジェクトを作成します。パラメーターとして、エクスポートしたトレーニングサンプルへのパスと、トレーニング サンプル マネージャーで新しいクラスを追加した際に指定した値と名前の組み合わせを辞書型にしたもの(今回の場合、{0: ”passenger_airplane”})を渡します。prepare_data() はトレーニング サンプルを自動でトレーニング用のデータと検証用のデータに分割してくれる他、画像の反転等を行いデータの量を増やしてくれます (data augmentation)。トレーニング用のデータ、検証用のデータ (そしてテスト用のデータ) の違いについては、fast.ai のブログ (英語) で詳しく解説されています。

dat = prepare_data(r"ImageChip4", {0: "passenger_airplane"})

 

show_batch() メソッドを使用すると作成したデータ オブジェクトがどのようなものかを確認することができます。

dat.show_batch()

 

ArcGIS API for Python では、物体検出に SingleShotDetector を利用します。クラスを作成する際、検出した物体を囲むアンカーボックスのアスペクト比や、学習に用いる畳み込みニューラル ネットワークのモデルを指定することができます。デフォルトのモデルは ResNet-34 です。

ssd = SingleShotDetector(dat, zooms = [1.0], ratios = [[1.0, 1.0]])

 

クラスを作成したら、学習を開始する前に lr_find() を使って適切な学習率を検討します。学習率はディープ ラーニング モデルを作成する際に分析者が設定する必要があるパラメーター (ハイパー パラメーター) です。低すぎる場合最適なモデルへの収束が遅くなり、高すぎると発散してしまいます。lr_find() は適切な学習率を検討する目安となるチャートを描画してくれるメソッドです。描画されるチャートでは縦軸の値 (Loss) が徐々に低下していきますが、ある時点で急上昇し始めるので、上昇しはじめる少し手前の学習率 (横軸のLearning Rate の値) を用います。

ssd.lr_find()

fit() メソッドで学習を開始します。パラメーターとして学習のエポック数と、先程 lr_find() で目安を付けた学習率を指定します。トレーニング サンプルの量にもよりますが、学習にはある程度時間がかかります。エポック毎に train_loss valid_loss の値が表示されていきますが、train_loss valid_loss より高い場合は学習が不足している可能性があります。逆にvalid_loss train_loss より極端に高い場合は、モデルがトレーニング用のデータに過剰に適合 (過学習) しており、トレーニング用のデータ以外では精度が出なくなっている可能性があります。

ssd.fit(epochs = 8, lr = slice(1e-3, 1e-2))

 

学習したモデルの結果は show_results() を使用することで確認することができます。左側に表示される画像が正解で、右側が学習したモデルの結果を示しています。

ssd.show_results(rows=25, thresh=0.5)

 

作成したモデルは save() メソッドに保存先のパスを指定して実行することで保存できます。保存されるファイルの中には Esri モデル定義ファイル (*.emd) が含まれています。このファイルは学習したディープ ラーニング モデルについて記述した JSON ファイルで、次項で説明する [ディープ ラーニングを使用したオブジェクトの検出] ツールのパラメーターとして使用します。

ssd.save(r"model4")

 

c. [ディープ ラーニングを使用したオブジェクトの検出] ツールの実行

Jupyter Notebookを保存・終了し、Python コマンド プロンプトを閉じて ArcGIS Pro を再度起動します。

プロジェクトを開いたら、トレーニング データのサンプルの作成に使用した空港とは別の空港にブックマークから移動しましょう。

ジオプロセシング ツールの[ディープ ラーニングを使用したオブジェクトの検出] ツール(Image Analyst が必要です) を実行して、ArcGIS API for Python を用いて作成した学習済みのモデルを適用します。ツールに入力するパラメーターは以下のとおりです。

[入力ラスター] にはNAIP Imagery: Natural Color を指定し、[出力検出オブジェクト] はアウトプットされるフィーチャクラスの保存先を指定します。[モデル定義] には前項で出力した *.emd ファイルを指定します。

 

また、以下の画像のように実行範囲を [デフォルト] から [現在の表示範囲] に変更することで、マップ上に表示されている範囲だけに絞って実行できます。

ツールを実行すると航空機が存在すると推定された場所に四角形のフィーチャが作成されるので、シンボルを調整してアウトラインのみを強調しましょう。

 

まとめ

長い記事になってしまいましたが、ArcGIS Pro でディープ ラーニング用の環境を作成するところから始まり、トレーニング サンプルの作成、ArcGIS API for Python を用いたディープ ラーニング モデルの学習、そして再度 ArcGIS Pro に戻り、学習したモデルを適用して物体検出を行う一連の手順をご紹介いたしました。

読者の皆様は上手く航空機を検出することができましたでしょうか?筆者の場合は上手く検出できたところもあれば、そうでないところもありました。

上手くいかなかった場合は、ハイパー パラメーターを調整したりトレーニング サンプルのとり方を変えたりすることで精度を向上させることが可能なので、挑戦してみてください。

Esri では今年の 3 月からインドのニューデリーに R&D センターを設立し、AI、ディープ ラーニング関連の研究開発を行っています。今後も様々な機能が実装されていくと考えられますのでご期待下さい。また、英語になりますが Esri のデータ サイエンティスト等が Medium 上で多くの機械学習・AI関連の記事を公開しています。今回ご紹介した SingleShotDetector を用いた物体検出以外にも GeoAI の記事が多数ありますので、こちらも併せてご覧ください。

 

関連リンク

1 person found this helpful

Attachments

    Outcomes