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