宙畑 Sorabatake

衛星データ入門

衛星データ分析におススメの言語は?言語別の特徴まとめとElixir紹介

衛星データ分析をする際、良く用いられるのはPythonですが、他にも様々な特徴を持ったプログラミング言語があります。その特徴をまとめてお伝えします。

本記事ではElixirという言語を使って、衛星データ解析を実施しようと試みる株式会社オーイーシーの若林さんに、衛星データ解析で良く用いられる言語の紹介とElixirの素晴らしさについて語っていただきました!

コードベースでの衛星データ解析の特徴

衛星データを解析しようと思ったとき、様々な手法が考えられます。
Tellus OSQGIS のようなツールを使って、手動で解析することも可能です。
しかし、衛星データを活用したシステムを作りたい、と言ったような場合、ツールではなくコードで解析を行うことになります。
人の手を介さず、自動的に解析結果を出力するためです。
コードを使って(コードベースで)衛星データ解析を行う場合、どのようなことに気をつけなければならないでしょうか。

データの大きさ、多さ

衛星データを解析しようと Tellus などからファイルをダウンロードしてみると、最初に驚くのがファイルの大きさです。
当たり前のように一つのファイルで数百MBから数GBあります。
これにはいくつかの理由があります。

– 地球表面の広い範囲のデータを高解像度で保持するため
– 通常の画像が保持する色の種類(赤、緑、青)よりも多くの波長データ(赤外線など)を保持するため
– 通常の画像が保持する色の濃淡(256段階)よりも多くの段階を保持するため

より広く、細かく、様々なデータを保持するために、どうしてもファイルサイズが大きくなるのです。
現状ではまだまだ時間あたりのデータ数は少ないですが、今後超小型衛星が大量に打ち上げられていけば、よりリアルタイムに近い間隔でデータが取得できるようになります。

そうなると扱うデータの大きさだけでなく量も増えた上、エンドユーザーからはリアルタイムに処理することが求められるようになります。
コードベースで衛星データ解析を行う場合、このデータの大きさ、多さが一つの課題となります。

データ、処理の仕様

衛星は産官学様々な機関が打ち上げており、その目的、搭載しているセンサー、データの仕様なども様々です。
Tellus などからデータの仕様を確認することはできますが、それを個別に理解して解析するのは大変です。
ましてやそれをコードに落とし込むとなると、複雑で読みにくい、可読性の低いコードになってしまいがちです。

解析処理をコードで書くということは、そのコードを繰り返し実行したり、人と共有したり、システムに組み込むことが前提のはずです。
後に他の人が処理内容を読む、という点がツールを使って解析を行う場合との大きな違いと言えるでしょう。
可読性が低いコードは以下のような問題を引き起こします。

– 人が理解しにくい(教育に使いにくい)
– 人が修正しにくい(保守コストが高い、バグ発生のリスクが高い)​

コードベースで衛星データ解析を行う場合、いかに可読性の高いコードを書くかが重要になります。

コードベースでの衛星データ解析の方法

上記のような特徴を踏まえて、コードベースで衛星データ解析を行う場合、どのような方法が考えられるでしょうか。
それぞれご紹介していきます。

Python

まず調べると出てくるのが Python でしょう。
というよりも Web 上にある情報ではほぼ Python で占められています。

Python はデータサイエンスや機械学習で使われてきた歴史があるため、そのためのライブラリが充実しています。
ライブラリが充実していれば、詳細な処理内容はライブラリに任せてしまえるため、自分の書くコード量が減り、可読性が高くなります。

また、 Jupyter というツールを使ってブラウザ上でコードの実行、結果の確認ができるため、プログラマ以外の人でも入門しやすい、という利点があります。

Jupyter では解析結果を画像やグラフとして出力することもでき、視覚的に衛星データを確認しやすくなっています。
Google Colaboratory というサービスもあり、自分のマシン上に環境構築しなくても Python を始めることが可能です。

Python 自体はあまり高速ではありませんが、OpenCVPolars など、別の言語で実装されたライブラリを呼び出せるため、高速に画像処理、データ解析を実行することができます。

また、 Python で並列、分散処理を行うためのライブラリも存在するため、巨大で大量のデータを処理することも可能です。

ただし、 Python での並列、分散処理は複雑になりがちで、コードの可読性を著しく下げる傾向があります。
また、並列処理時にデータを共有メモリに保持するため、整合性を保てずエラーが発生するリスクがあります。
もしくは、整合性を保つために待ち時間が発生し、そのオーバーヘッドのために非効率になってしまうことがあります。

参考サイト:
Pythonで学ぶ衛星データ解析基礎
https://gihyo.jp/book/2022/978-4-297-13232-3

初心者向けTellus学習コース
https://tellusxdp.github.io/start-python-with-tellus/index.html

R

R はデータ解析に特化した言語で、 Python と同様にデータサイエンスに用いられてきました。
記述が非常にシンプルで学習コストが低い、という特徴があります。

ただし、R はデータ解析に特化しているため、例えば Web システムに組み込むようなことは難しくなります。
また、実行速度の面でも他言語と比べると遅いケースが多いため、巨大で大量のデータを処理するのには向いていません。

参考サイト:
Rを用いた衛星データ(LST, NDVI)の空間統計分析(京都大学)
http://www.gi.ce.t.kyoto-u.ac.jp/user/susaki/rsgis/qgis_R_geostatistics_rsdata1.html

Rユーザーのための衛星データ解析
https://bookdown.org/dev_jp_consultant/satellitePage/

JavaScript

ブラウザ上で衛星データを解析するツールとして、 Google Earth Engine が挙げられます。
Google Earth Engine の Code Editor では、 JavaScript を使って衛星データの取得、解析、地図上への表示が簡単にできます。

Google Colaboratory と同様、自分のマシンに環境構築をする必要がなく、高スペックも要求されません。
Google Earth Engine のデータ解析処理は全てクラウド上で実行されており、ブラウザからは「どういう演算をしたいか」をクラウドに伝えて、その結果を表示しているだけです。そのため、「どういう演算をしたいか」を記述する言語はデータ解析に特化していなくても構いません。

JavaScript はWeb開発言語として長く使われてきたため、習熟しているエンジニアが多く、エンジニアが衛星データ解析に入門するのにはうってつけと言えます。

参考サイト:
Google Earth Engine
https://earthengine.google.com/

EO browser Custom script
https://www.sentinel-hub.com/develop/custom-scripts/

Elixir

Elixir は分散処理を前提として設計された比較的新しい言語です。
また、「楽しく実装できる」ように作られているため、可読性の高いコードを書くことができます。
かつてはチャットサービスや多人数オンラインゲームなどで使われていましたが、近年データ解析や機械学習用のライブラリが多くリリースされており、多方面で使われるようになっています。

Elixir には Livebook というツールがあり、 Jupyter と同じようにブラウザ上で対話的にコードを実行できます。
Livebook は解析中にデータをアニメーションとして表示するなど、より強力な視覚的表現が容易に実装できるようになっています。

また、 Smart Cells という機能があり、コードを書かずにパラメータを指定するだけで地図やグラフを表示することも可能です。
Elixir 自体の記述がシンプルで可読性も高いため、 Livebook を使った衛星データ解析は入門に向いています。
Livebook は Fly.io や Hugging Face というクラウドサービス上で簡単に実行でき、環境構築なしで利用することもできます。

Elixir には Phoenix という堅牢・高速な Web フレームワークがあり、データ解析処理を Web システムに組み込むことも容易です。
Elixir Desktop などのライブラリを使うことで、デスクトップアプリケーション、モバイルアプリケーションとしても開発できます。

また、前述したように分散処理が前提の言語であるため、逐次処理を簡単に並列、分散化できます。
変数がイミュータブル(変化しない)という特徴があるため、並列、分散時に他プロセスとの間で共有メモリが書き換えられる、という心配がありません。

従って、バグが発生するリスクも低く、他プロセスを待つためのオーバーヘッドも発生しません。
効率良く並列、分散処理を実現できるため、低消費電力で高速に巨大で大量な衛星データを処理することができます。

ただし、衛星データ分析においては発展途上であるため、 Python と比較するとまだライブラリが充実しているとは言えません。
様々な研究者が Elixir を使うようになれば、今後のライブラリ開発にも期待できるでしょう。

参考サイト:
Livebook.dev
https://livebook.dev/

Hugging Face (Livebook on Spaces)
https://huggingface.co/docs/hub/spaces-sdks-docker-livebook#livebook-on-spaces

まとめ

現状では Python の実装例が非常に多く、ライブラリも充実しています。

しかし、将来的に大量の衛星データを処理する必要が出てくると、 Python や R では実行速度や堅牢性、消費電力の面などで限界が出てきます。

高効率な分散処理を実現できる Elixir は、将来的に衛星データ解析に必要とされるはずです。
また、 Elixir は非常に可読性が高く、Livebook による対話的、視覚的コーディングが容易にできるため、衛星データ解析の入門にも向いています。
Qiita などには Elixir による衛星データ解析の実装例も出ているため、是非参考にしてみてください。

宙畑編集部より今回は、Elixirで衛星データ分析にチャレンジしている若林さんに執筆いただきました。
他の言語を使っている方で、我こそはその良さを主張したい!という方は、ぜひご連絡お待ちしております!