【Elixir】衛星データをLivebook (Elixir) で利用する【衛星データ】

衛星データ解析を簡単に早く実行したいと思ったことはありませんか。

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開発、組み込みソフトウェアといった用途で利用されてきました。主な特徴をまとめると以下が挙げられます。

  1. 関数型プログラミング:
    • コードの予測やテストが容易である。
  2. 耐障害性:
    • Erlang VM (BEAM)上で動作するため、低遅延、分散、高可用性などの特性がある。
  3. 並行性と並列性:
    • メッセージパッシングを介してプロセス間での通信を行い、共有メモリを使用しないため、並行処理の際の競合やデッドロックが回避される。
  4. フォールトトレラント:
    • 監視ツリーという仕組みがあり、一部のプロセスが失敗しても他の部分が正常に動作し続けることができます。これにより、障害を隔離し、自動復旧を行うことができる。

他にも特徴はありますが上記に挙げた特に並行性の部分が注目され、大規模なデータ解析への応用が期待されています。

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という選択肢が出てくるかもしれません。

その際には本記事を参考にしてもらえればと思います。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です