衛星データ解析を簡単に早く実行したいと思ったことはありませんか。
Elixirというプログラミング言語は並列計算が得意であり、大規模なデータ解析に向いているとされています。そのため、衛星データ解析への利用が期待されています。
しかし、Pythonと比較するとライブラリがあまり充実していないため敷居が高くなっています。そのため、本記事ではElixirの環境構築と衛星データからRGB画像の生成までを紹介します。
macOS Ventura(13.5), Windows 11(22H2), Elixir 1.15.4, Livebook v0.10.0(Elixir 1.15.2)
Elixirとは?
Elixirは、2012年に開発されたプログラミング言語で、Erlang VM(BEAM)上で動作する関数型プログラミング言語です。低遅延、分散処理が得意といった特徴があり、障害耐性があることからWeb開発、組み込みソフトウェアといった用途で利用されてきました。主な特徴をまとめると以下が挙げられます。
- 関数型プログラミング:
- コードの予測やテストが容易である。
- 耐障害性:
- Erlang VM (BEAM)上で動作するため、低遅延、分散、高可用性などの特性がある。
- 並行性と並列性:
- メッセージパッシングを介してプロセス間での通信を行い、共有メモリを使用しないため、並行処理の際の競合やデッドロックが回避される。
- フォールトトレラント:
- 監視ツリーという仕組みがあり、一部のプロセスが失敗しても他の部分が正常に動作し続けることができます。これにより、障害を隔離し、自動復旧を行うことができる。
他にも特徴はありますが上記に挙げた特に並行性の部分が注目され、大規模なデータ解析への応用が期待されています。
Elixirの実装方法
Elixirを動かすにはいくつか方法がありますが、今回はローカル環境とLivebookでの動かし方について紹介します。
ローカル環境で動かす
Elixirは公式サイトからインストーラーがダウンロードできます。
$ brew install elixir
インストールが完了したら、以下のコマンドでバージョン名が表示されるかを確認します。
$ elixir --version
以下のように表示されればインストール成功です。(2023年8月現在)
Erlang/OTP 26 [erts-14.0.2] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [jit] [dtrace]
Elixir 1.15.4 (compiled with Erlang/OTP 26)
Windows版は複数のインストール方法がありますが、基本的には①②の順にそれぞれのインストーラの指示に従ってインストールしていきます。ElixirはErlang VM上でコードが実行されるため、必ず①からインストールしましょう。
それではElixirを実際に動かしてみます。Macではターミナル、Windowsではコマンドプロンプトを開き、
$ iex
と入力するとElixirが起動します。次に以下のコマンドを実行すると、お馴染みのHello worldがElixir上で実行されます。
IO.puts "Hello world"
IOというのはElixirのモジュールの一つで、putsというのはIOモジュールの関数で他の言語でいうprintに相当します。
Livebookで動かす
LivebookとはPythonでいうJupyterのような、対話式にコーディングができるアプリケーションです。今回は公式サイトからインストールします。Mac版ではインストーラを開くと下記のウィンドウが開くのでLivebook.appを自身の環境にドラッグ&ドロップしましょう。
Livebookを開くと以下のような画面が開きます。右上の「+ New notebook」をクリックします。
以下のような画面に遷移するので、Sectionに実行したいコードを入力します。入力したコードは「ctrl+enter」で実行できます。
今回はローカルと同様にHello worldを実行してみました。特に問題なければ、画像のようにSectionのボックスの下に実行結果が表示されます。
Livebookで衛星データを表示する
それでは、Livebook上で衛星データを使用してRGB画像の生成を行ってみます。
使用したデータはS2A_MSIL2A_20230805T012701_N0509_R074_T54SUE_20230805T050856
でこちらのサイトからダウンロードしました。ダウンロードしたzipファイルを解凍し、GRANULE> L2A_T54SUE…> IMG_DATA> R10m
に保存されているT54SUE_20230805T012701_B02_10m.jp2, T54SUE_20230805T012701_B03_10m.jp2, T54SUE_20230805T012701_B04_10m.jp2
の3つのファイルをElixirを実行するフォルダ配下にコピーします。
次に、Livebookを起動し「+ New notebook」をクリックし、実際にコードを実行してみましょう。
LivebookでのRGB画像の生成
まず必要なライブラリを環境中にインストールします。LivebookのSectionに以下のコードを入力し実行します。
Mix.install([
{:mogrify, "~> 0.9.3"}
])
以下のように最後にokが表示されれば成功です。
mogrifyというのはImageMagickという画像の変換、編集、合成などを行うツールをElixir上で動作させるためのライブラリです。
次に、ImageMagickというツールをインストールします。こちらは公式サイトからOSに対応したインストーラがあるので、こちらを利用してインストールします。MacではHomebrew経由でもインストール可能です。その場合はターミナルでbrew install imagemagick
を実行します。
次にLivebookに戻り衛星データの3つのファイルを以下のコードを実行し読み込みます。
# 画像ファイルを読み込む
red = Mogrify.open("T54SUE_20230805T012701_B04_10m.jp2") |> Mogrify.custom("channel", "R")
green = Mogrify.open("T54SUE_20230805T012701_B03_10m.jp2") |> Mogrify.custom("channel", "G")
blue = Mogrify.open("T54SUE_20230805T012701_B02_10m.jp2") |> Mogrify.custom("channel", "B")
実行結果は以下のようになればOKです。
ここではMogrifyを使用して、画像ファイルを読み込んだ後、Mogrify.custom
で対応する色チャンネルを設定しています。
次に、Mogrifyで画像の合成ができるように拡張子をjp2
からpng
に修正します。
# 各チャンネルを一時ファイルとして保存
red_path = "red_temp.png"
green_path = "green_temp.png"
blue_path = "blue_temp.png"
red |> Mogrify.save(path: red_path)
green |> Mogrify.save(path: green_path)
blue |> Mogrify.save(path: blue_path)
実行結果は以下のようになればOKです。
最後に、以下のコードを実行しpngに変換した3つの画像ファイルを1つのRGB画像に合成します。
# RGB画像を合成
combined_path = "combined_rgb.png"
System.cmd("magick", [red_path, green_path, blue_path, "-combine", combined_path])
実行結果に{””, 0}
と出力されていればOKです。combined_rgb.png
という画像ファイルが生成されているので開いてみます。おそらく以下のような画像が表示されます。
このままでは暗くてよくわからないので、以下のコードで輝度を調節します。
# 輝度の調節
System.cmd("magick", [combined_path, "-modulate", "300", combined_path])
combined_rgb.png
を開きなおすと以下のようにはっきりとした画像が表示されればOKです。
最後に
今回はElixirの使い始めとして環境構築とRGB画像の生成について紹介しました。
Elixirはまだまだ発展途上であり、ライブラリの充実度からまずはPythonが選択されることが多いと思います。しかし、今後よりデータ解析が大規模になるにつれてElixirという選択肢が出てくるかもしれません。
その際には本記事を参考にしてもらえればと思います。