機械の音で、故障の診断 Sound Sensor Transformer.
CNN-Transformer ハイブリッドモデル で、動画のクラス分類をする。
かって、CNNとLSTMを組み合わせたモデルの「LRCN (Long-term Recurrent Convolutional Networks)」の、 LSTM 部分を、
Transformer に置き換えたモデル。第2段。
今回は、上記をベースに、
教師なし Transformer (Temporal AutoEncoder) を使います。
よく、わからん。Google AI の口車に乗せられて、とりあえず、作ってみました。
要は、正常の音(今回は、動画の Sound 部分) のデータばかり、学習させて、
取り込んだ音から model に再現させて、同じになるように、weight を学習させる。
その、オリジナルの音と、model が再現させた 音の違いを、
比較して、どれくらい、違いがあるかによって、正常、異常を判定する。とのことじゃ。
最終的に、オリジナルと再現の違いの算出方法と、どの程度の threshold をするかに、良し悪しが、出るみたいじゃ。
故障の音が入った場合は、再現された音と大きく異なる事で、異常を判定する。との事。
1. 最初は、何を学習させるか、と言うところから、決めないといかん。
当初、洗濯機の脱水機の音にしようと思ったが、
Youtube だと、洗濯機の動画は、商品の紹介ばかりみたい。
バイクの排気音だけの、動画は、よく見かけるので、こちらが、簡単か。
とりあえず、 Train 用の jupyter notebook は、もうできているので、あとは、動画を集めるだけじゃ。
とりあえず、 Train を、 github に上げました。
sound_sensor_transformer_train
バイクのアイドリングの動画(mp4) ファイルを数個用意して、Audio 部分を使って、学習させました。
後は、Torch から、 ONNX に変換して、Orange pi 5 onnx で、predict が出来る事を確認しました。
確認方法は、バイクの加速時の動画、アクセルを煽った時の動画を読み込ませて、Loss がエラーになる事で行います。
2. マイクから取り込んだ音で、Predict
Orange pi 5 onnx を使って、USB マイクから、バイクの動画の音をキャプションさせて、予測させます。
この段かいでは、現調の難しさに直面します。
注) マイクは、Sound 用のマイクが良いとおもいます。会話用だと、ローパス Cut のフィルターが入っているので、
Cut された音が必要なターゲットだと、大変です。
マイクで、Cut された音は、あとから、イコライジングしても、基本、復元できません。
注2) まあ、いずれにしても、現実の音をマイクで拾って、情報処理するのは、結構難しい。
要所要所で、マイクで実際拾った音を、スピーカに出して、自分の耳で確認することが、大事。
まあ、なんとか、アイドリングの音を、Loss 無く判定できるようになりました。
一応、MQTT で、Predict 値を、Publish して、クライアント側で、グラフで確認できるようにしました。
最終的には、なにか、具体的機械の音を学習させて、実際に試してみたいぞね!!
3. おんちゃんの雑談。
実社会で、これが本当に使えるか?
環境音が大きい環境では、本来の性能が発揮出来るかは、大いに疑問が残る。
実際、工場などでは、役に立つかは? どうじゃろうか?
鶏舎の異変の感知は、どう?
こちらは、教師あり学習させたほうが良いよいかも。しかし、異変の時の音は、やはり入手しずらいか。
事務所の夜間の監視は?
これは、リアルタイムで、使えるかも。
4. Pytorch について。
随分久しぶりに、pytorch を、最近使っちょります。
以前は、2019 年頃は、ほとんど理解できていなかったが、最近、Google Ai にわからない所を、聞きながら、コードをいじったりしていたら、
なんとなく、Pytorch の便利さに気がついてきました。 Tensorflow や、Keras が、使われなくなった事が、理解できる。
pytorch は、なにより学習が早い。これは、感心する。
パーツ、と言うか、関数と言うか、これらが、一通り揃っていて、これらを組み合わせれば、おんちゃんでも簡単に、model が出来てしまう。すごい!!
ただし、まともに動くかどうかは、別じゃが。
モデルの中の、tensor オブジェクトと言うのかわからんが、
pytorch だと、それぞれ別々に、optimizer や、scheduler を用意して、別々に実行できるみたい。
これは、便利じゃ。ただし、その効果の程は、わからんが。
5. model の修正。 by nishi 2026.5.2
1) model の outputs 1 channel -> 3 channels に、拡張。
これで、outputs の 画像が、より細かくなるみたい。
とにかく、バイクのシャリシャリの入った、 動画を、エラー判定すには、必要みたい。
2) model の outputs を sigmoid() を通さない。または、softplus() を通す。
sigmoid() を、通すと、loss=0.199 台止まりになる。
通さなければ、loss=0.15 を切る。
とにかく、シャリシャリを拾うには、loss < 0.15 でないと、出来ない。
注) loss < 0.15 でも、outputs = 3 channles でないと、シャリシャリを拾えない。