衛星画像データの解析を行うために学んだこと

先日の記事で紹介した通り,東大のディープラーニング講座DL4USを受講し,最終課題として「衛星画像とCNNを用いたスラムの特定」というテーマで解析を行いました。

この解析を行うにあたって,衛星画像の取得やQGISやPythonを用いた前処理が必要でした。今回の記事では,それについて私がどのような勉強をしたか順を追って紹介します。

学習のステップ

データ解析に関する私の事前知識ですが,普段の業務でテーブルデータは扱うものの,生の衛星画像を扱った経験はなく,観測衛星や地理データに関する知識もほとんどありませんでした。

そんな状態から以下のステップで学んで行きました。

  1. 観測衛星/衛星画像データに関する知識の学習
  2. 地理データ(ラスター/ベクター) に関する知識の学習
  3. QGISを用いた地理データの可視化/加工
  4. Pythonを用いた地理データの加工

観測衛星/衛星画像データの知識

まず基礎知識として衛星データの種類 (センサの種類,観測周波数),観測頻度観測エリア (観測幅),解像度 (分解能),データの入手方法など学びました。こちらは『宙畑 (Sorabatake)』さん(衛星についての記事を毎日アップしてる神ウェブサイト)の記事を読むことで一通り学びました。必読記事がこちらです。

宙畑さんの全記事の8割くらい読んだ覚えがありますが,とりあえずこの6つ読めば必要最低限の知識を学べます。

 

地理データの知識

地理データについては以下の2点,データの種類 (ラスターデータ / ベクターデータ)と座標参照系 (Coordinate Reference System:CRS)を押さえればいいかと思います。

データの種類

データ種類についてはesriジャパンのGIS基礎解説のページの説明がわかりやすいです。データは大きく以下の2つあります。

  1. ラスターデータ: 行と列の格子状に並んだピクセルで構成されるデータ
    • 衛星画像などの画像データなど
    • 拡張子はtiffやbmp
  2. ベクターデータ: ポイント(位置)・ライン(道路)・ポリゴン(建物)で表される情報(フィーチャー)を表現するデータ
    • 拡張子が.shp のいわゆるシェープファイル(shapefile)

シェープファイルでは,ポリゴンなどの1つの形(フィーチャー)が1レコードとなっているため,普段テーブルデータを扱っている方には比較的親しみやすい構造になってます。

f:id:shinmee:20200519203125p:plain
esriジャパンより引用

 

座標参照系 (Coordinate Reference System:CRS) 

CRSとは,地理データが地球上のどこに位置しているかを示す仕組みです(説明ムズい)。wikipediaの説明だと"a coordinate-based local, regional or global system used to locate geographical entities"です。データの種類(ラスターorベクター)にかかわらず,各ファイルがCRSを持っている,つまり座標の仕組みが設定されている必要があります。CRSには以下の2種類あります。

  1. 地理座標系 (Geographic Coordinate System)
    • 緯度と経度と標高によって表される座標
    • WGS 84という1984年にアメリカが開発した世界測地系が最も有名で,最も使われている。
  2. 投影座標系 (Projected Coordinate Reference System)
    • 赤道上のある地点を原点としたときに,対象の場所を(x, y)座標で表す方法

初学者には難解ですが,地理データを扱う際には避けて通れないので,理解が欠かせません。図解付きのわかりやすい説明がQGISの公式ページにあります。

 

QGISを用いた地理データの可視化/加工

QGISに関しては『Learn QGIS - Fourth Edition』という電子書籍を読みました。QGISの最新バージョンQGIS-3に対応している数少ない本の1つです。

私は最終章の手前まで読み,以下のことを一通り学べました。

  • QGISのタスクバーにある大量のボタンの完全なる把握
  • ベクターデータの作成/選択/編集/結合/保存
  • ラスター/ベクターデータの可視化
  • 可視化した地図の出力
  • 空間分析
    • ラスターの切り取り
    • ポリゴンの面積計算
    • ラスターのベクター化 / ベクターのラスター化
    • エリア毎の統計量(zonal statistics)の算出
    • ベクター同士の距離計算

QGISは地図を可視化するには最高のツールですが,正直言うと複雑な加工には適していません。例えば同じような加工を繰り返したい時,クリックで同じ作業をカチカチするのはストレスですし時間もかかります。こんなときPythonの地理データ用のライブラリの出番です。

 

Pythonを用いた地理データの加工

Pythonのライブラリを用いることで地理データの加工を効率的に,かつ再現性を担保しながら行なえます。こちらは特に書籍など用いず,公式のドキュメントだけ読んで勉強しました。便利なモジュールは以下です。

  • fiona
    • シェープファイル(.shp)を読み書きするライブラリ
    • geopandasと相性がいい
  • pyshpのshapefile
    • fiona同様に.shpを読み書きするライブラリ
  • Rasterio
    • 衛星画像(.tifなど)を扱うライブラリ
    • データの読み込み,バンドごとの値抽出,画像の大きさ抽出などできる
  • GeoPandas
    • Pandasの拡張パッケージ
    • shapefileを読み込め,ベクター情報を変数として格納でき,pandas.DataFrameのように扱える
    • CRSはオブジェクトの属性として格納できる
  • Shapely
    • ベクターデータを作成/処理するライブラリ
    • フィーチャー間の関係を真理値で返すメソッドが便利。例えば「点AがエリアBに含まれてるかどうか」簡単に調べられる。

またmatplotlibを使って地図の可視化もPythonで行えるようです(私は使いませんでしたが)。

 

最後に

何か新しいツールを身につける際に最も重要なことは,「ツールに関する最低限の知識を身につけて,そのツールで何ができるのかを把握すること」だと思っています。そこまで辿り着ければ,あとは自分がやりたいことに応じてググって解決方法を見つけられるからです。実際,今回の場合,私は上記の知識を習得した後,DL4USに必要な加工・分析はググって対応できました。是非皆さんもその辺を意識して勉強してみてください。

 

参考