nn-morse、その後2024/04/04 11:10

前回の続き。 深層学習でモールス信号を解読するソフト(nn-morse)を動かすにはPytorchが必要だが、 当局のPi4は(SatNOGS環境のために)32bit OSなのでPytorchが動かず、ネット記事をみてonnxruntimeを使うことに決めた。

onnxruntimeをググるとPi4でbuildする記事が多かったが、whlファイルを見付けた。 自分の環境はpython 3.9なので、onnxruntime-1.16.0-cp39-cp39-linux_armv7lをダウンロードすればOK。 それからruntimeの実行には、libopenblas-baseの追加が必要!だった。

SatNOGS Observation #928492を処理した結果を以下に示す。 206秒の録音を約30秒で処理できたので、まずまずのスピードだと思う。 デコードの成績はまあまあ:単語を正しく区切れてないが、文字は正しく認識できている。あと、サイズの大きなWAVファイルを処理すると4GBモデルでもOOM Killerが発動するので注意💦

$ time python3 decode_morse.py 9284942.wav
… 3TOKYO METROPOLITAN COLLEGEOFINDUSTRIALTECHNOLOGY …

real	0m29.735s
user	0m31.408s
sys	0m6.287s

このプログラムはgithubにて公開しました。

nn-morse,再び2024/03/26 08:05

モールス信号を深層学習:nn-morseでデコードする話の続き。

トーン周波数の範囲設定が、オリジナルの100~950Hzに対して、 解読させたいsatnogsのAudioファイルでは(ざっくり)200~2800Hzなので、 周波数範囲とサンプリング周波数を変更して、Google Colabを使って再学習した (その設定は、従来環境:実PCでは、計算時間とGPUメモリの兼ね合いで、トライできなかった)。

loss値が下がらないので、入力層の数:spectrogram_size∝サンプリング周波数なので、中間層の数を増やしてみたが、決定打にならず。 Audioファイルでのトーン周波数のヒストグラムを作成して、 出現頻度の高い周波数(680〜1680Hz)に絞ったのが、一番効いたかも。

その変更+オリジナルにない符号(Slash, Hyphen, Colon)を学習させたら、 lossは(2200stepまで回すことになったが)0.30でサチった。オリジナルに比べるとちょと高め...だが良しとしよう。 以下は、実データによるデコード結果。 実マシンで学習したときと大差は無かった💦けど、

HSU-SAT1はnn-morseの圧勝だし、耳だと短点連打の完コピーは難しい。

0JS1YHSHSUSAT104.19V0.10A8.46DEEEEETETTTE 

KOSEN-1ではHyphenを正しく認識できている。

HJR5YGJ KOSEN-1 S1 3E 1E 93 AE     S2 1E 00 00 00 

このモデルをエッジ環境でも動かしたいので、Pytorch⇛ONNX変換して、onnxruntimeで動くようにしてみた。 ONNX変換は、画像処理(入力サイズが固定長)の事例ばかりで、 信号処理のような「入力サイズが可変長」のリンクが見付からず、難儀した。

それから、Pytorchで記述された処理(入力データの用意、推論結果から文字列への変換)をnumpyに置き換える必要があり、 PyTorchで定義されたテンソルをNumpy配列に変換する作業は、Rubyistの自分には書けないので、 Google ColabのAIコーディング機能(Colab AI)を使ってコード修正したら・何とか・なった。

以下は、ONNXモデルによるデコード結果で、Pytorchと同じ文字列が得られた。

HSU-SAT1

0JS1YHSHSUSAT104.19V0.10A8.46DEEEEETETTTE 

KOSEN-1

HJR5YGJ KOSEN-1 S1 3E 1E 93 AE     S2 1E 00 00 00

CaribouLite #102024/02/03 11:57

ラズパイ HATなSDR: Cariboulite、 今月もソフト更新あり。「Invert IQが必要」な件が解消して良かったが、受信中に信号が頻繁に何度も途切れる症状にカイゼンなし。ただしSDRソフトをGqrxからSDR++に変更したら解消した。謎だ...

本日の衛星: RS-44で交信。

新・GPU機械学習環境の構築2024/01/27 11:03

ディープラーニングを使ったモールス信号の解読にあたり、 深層学習の環境を実マシンからGoogle Colabに移行した。

いま試しているソフト:nn-morse、 オリジナル版はpytorch 1.5対応だったが、Colab標準のpytorch 2.1でもコードの修正 ほぼなし で使うことができた。 修正点は、ColabのCPUコア数=2に合わせて、DataLoaderのnum_workers=2としただけ。 GPUメモリは15.4GBと大きいので、batchサイズの修正は不要だった。

で、my実マシンで1.6日かかる計算が、無料版で使えるGPU/Telsa T4では8時間で終わって素晴しい!

が、あの「GPUバックエンドに接続できません」が表示されて、学習が途中で切断されてイラッとしたので、 有料版Google Colab Proを契約した。 それはGoogleの思う壺なのだろうが、コスパは良い(¥23円/時間)し,GPUの使用上限に達する頻度が減った気がする。

本日の衛星: RS-44で交信。

CaribouLite #92024/01/20 17:55

ラズパイ HATなSDR: Cariboulite、 今月のソフト更新あり。周波数を動作範囲外に設定したときのバグは解消したが、受信中に信号が頻繁に何度も途切れる新たなバグが発生して、泣いてます。

本日の衛星: RS-44で交信。