人工衛星とデータ処理 - Advent Calendar を書いています -
こんにちは,みっくんです.いよいよ寒くなってきましたね.今日は所属している学科のアドベントカレンダーを書くということで,最近興味があることを軽くまとめてみました.
この記事は東京大学航空宇宙工学科/専攻 Advent Calendar 2018の12/20の記事です.
はじめに
まず記事を書くにあたって,内容はせっかくだし航空宇宙感の高い記事を書こうと思い,研究室で取り扱っている”人工衛星”と,近年流行り(と個人的に関心のある)の”機械学習”の観点から少しまとめています.前半で衛星データビジネスの概観や最近検討されている人工衛星上でのオンボードデータ処理についての動向,後半におまけとしてかる〜〜い実験を行なっています.
人工衛星上での機械学習処理
近年,いわゆる”超小型衛星”と呼ばれる100kg以下程度の従来の衛星と比べてかなり軽量で安価な人工衛星の打ち上げ機会が増加していて,観測機器(地球観測衛星だとカメラなど)の性能の向上とともに衛星側で作り出すデータの量が増大しつつあり,また低軌道などにおいて複数衛星を用いて観測を行うことで,即時性の高いデータを取得することが可能になっています.これを元にして様々なサービスが展開されていて,最近特にキャッチーなものとしては合成開口レーダー(SAR)の画像を用いて駐車場の車の数をカウントしてWalmartの混雑度とか収益とかを予測できるサービスなどがありますね.
このようなデータビジネスが台頭している一方で,現在の地上局ー衛星間の通信速度はそこまで大きくありません.そこで現在検討が進んでいるのが,衛星側でもう機械学習による予測処理を行ってしまって地上にダウンリンクするデータ量を減らすオンボードデータ処理です.例えば,それまで都市だったところが水地になっている場合(洪水,津波被害などが考えられますね)のみを選択してダウンリンクするなどが考えられますね.もちろん機械学習用にGPUを超小型衛星に乗っけて打ち上げるのには電力やサイズなどで困難が伴うので軌道上の推論処理のコンピューティングにはやや厳しめの制約があったり,民生の機械学習用の小型チップを載せて推論処理を加速させたりなどの検討がされています.
1例として,ESA(欧州宇宙機関)ではIntelに買収されたMyriadという会社の画像処理専用のハードウェアアクセラレータであるNeural Compute Stickを用いた衛星の開発を進めており,来年の打ち上げが予定されているようです.このチップはだいたいUSBメモリくらいのサイズで消費電力も小さいし,RasPiにぶっさしたら使えて開発しやすい*1ので超小型向きであると言えます.
spacenews.com
ちょっとコーディングしてみた
MobileNetを用いたオンボード画像処理に関する研究
今回このようなオンボード処理を取り扱っている論文として,ISSモジュールのフライトコンピュータで実行可能な機械学習を用いた画像処理モデルについての研究*2について検討をしてみたいと思います.MobileNetとは,Googleがエッジ端末上での機械学習を迅速に行うことができるように作成したネットワークで,最大の特徴としてハイパーパラメータ(width multiplier)によって学習するモデルのデータサイズを調節することができ,実行速度と識別性能に関してトレードオフが出てきている点が挙げられます.
この研究においてはまず複数の機械学習モデルの性能を比較した上で,一番識別性能が嬉しいモデルについてモデルの軽量化を行いオンボードで処理できるようにしています.一方で軽量化したモデルでオンボードで識別した際の識別性能については定量的に評価されていません.どれくらいのスコアになるのか興味があったので追試を行ってみようと思います.
実装
tf.kerasを用いて軽く実装を行いました.流石に生の軌道上データは入手できなかったので使用したデータは4波長で撮影したSAR画像のデータセット(SAT-4 and SAT-6 airborne datasets)です.Google Colaboratory上で実行しているため,メモリ節約のために学習にあたってテストデータを使用して交差検証してます.DataGenerator何それおいしいの??まだまだ拙いところばかりですので,改善点があれば指摘していただけるとありがたいです.
import numpy as np import tensorflow as tf tfk = tf.keras class mobn_sar6(): """docstring for mobn_sar6.""" def __init__(self, alpha=0.5, depth_multiplier=1): self.mobn = tfk.applications.MobileNet(include_top=False, weights=None, alpha=alpha, depth_multiplier=depth_multiplier, input_shape=(32,32,4)) def build(self): dsimg = tfk.layers.Input(shape=(28,28,4)) x = tfk.layers.ZeroPadding2D(padding=2)(dsimg) # MobileNet対応サイズまでデータを拡大 x = self.mobn(x) x = tfk.layers.Flatten()(x) x = tfk.layers.Dense(256, activation='relu')(x) x = tfk.layers.Dropout(0.6)(x) x = tfk.layers.Dense(6, activation='softmax')(x) self.model = tfk.Model(inputs=dsimg, outputs=x) return model if __name__ == '__main__': # DeepSat SAT6 Datasetの読み込み x_test = sar6['test_x'] y_test = sar6['test_y'] x_test = x_test.T / 255 x_test = x_test.transpose(0,2,3,1) y_test = y_test.T mobn = mobn_sar6() model = mobn.build() model.compile(loss='categorical_crossentropy', optimizer=tf.train.AdamOptimizer(), metrics=['accuracy'] ) model.summary() early_stopping = tfk.callbacks.EarlyStopping(patience=5) model.fit(x_test, y_test, validation_split=0.2, batch_size=128, epochs=100, callbacks=[early_stopping], verbose=1 )
結果
結果については,皆様の手元でコードを走らせてみれば比較的すぐに出てくると思います.時間が足りない時間が欲しい!!!!!!僕の方でも適宜結果が出次第こちらの記事でもアップデートをかけていくのでまた暇なときにでも覗きにきてください.