Tekoäly tunnistaa pumpun äänestä poikkeaman
Asiakas otti yhteyttä ja kysyi, voisimmeko kehittää menetelmän, jolla voitaisiin tunnistaa pumpun mahdolliset vikaantumiset ilman uusia antureita tai mittalaitteita. He halusivat selvittää, onko mahdollista havaita poikkeamia pelkästään pumpun äänen perusteella.
Tavoitteena oli rakentaa koneoppimiseen perustuva tunnistusmenetelmä, joka kuuntelee ääntä, oppii normaalin toiminnan ominaisuudet ja tunnistaa poikkeamat. Ratkaisu päädyttiin toteuttamaan autoencoder-neuroverkon avulla, joka soveltuu erityisesti epänormaalin käytöksen havaitsemiseen ilman erikseen merkittyjä vikatietoja.
Tämä artikkeli kuvaa testin vaiheet ja havainnot, sekä antaa kuvia ja koodiesimerkkejä äänidata-analyysista.
Teollisuudessa pumpun ääni voi paljastaa paljon koneen kunnosta. Tässä projektissa testasin, voiko konvoluutioneuroverkko (CNN) havaita poikkeamia pumpun äänestä ilman fyysisiä antureita. Rakensin siihen perustuvan autoencoder-neuroverkon ja toteutin testit Pythonilla, TensorFlow’lla ja librosalla.
Äänidatan keruu ja esikäsittely
Äänitykset tehtiin iPhonen AVR PRO -tallenninsovelluksella tuotantotilanteessa. Nauhoitukset kattoivat pumppujen käynnistyksiä tuotannon eri vaiheissa.
Jälkikäsittely tehtiin Pythonissa Jupyter Notebookilla:
- Audiodatan analyysiin käytiettiin librosa-kirjastoa
- Äänet muunnettiin mel-spektrogrammeiksi
- Kuvamuodossa data syötettiin CNN-neuroverkolle
1. Äänidatan keruu ja esikäsittely
- Pumpun äänet nauhoitettiin iPhonen sovelluksella ja ne tallenettiin .wav-muotoon.
- Lataus tehtiin librosa.load, jossa sample rate pakotettiin 16 kHz:iin.
y, sr = librosa.load(”pump3_1.wav”, sr=16000)
MFCC-koeffisientit (13 kpl) laskettiin ja visualisoitiin:
mfccs = librosa.feature.mfcc(y=y, sr=sr, n_mfcc=13)
librosa.display.specshow(mfccs, x_axis=’time’)
Kuva 1: MFCC-koeffisientit pumpun äänestä
- Mel-spektrogrammi laskettiin ja muunnettiin dB-asteikolle:
mel_spec = librosa.feature.melspectrogram(y=y, sr=sr,
n_mels=128)
mel_spec_db = librosa.power_to_db(mel_spec, ref=np.max)
librosa.display.specshow(mel_spec_db, sr=sr, x_axis=”time”,
y_axis=”mel”)
Kuva 2: Mel-spektrogrammi pumpun äänestä
STFT-spektri tehtiin vertailevaksi näkymäksi:
stft = np.abs(librosa.stft(y, n_fft=2048, hop_length=512))
stft_db = librosa.amplitude_to_db(stft, ref=np.max)
librosa.display.specshow(stft_db, sr=sr, x_axis=”time”,
y_axis=”log”)
Kuva 3: STFT-spektri pumpun äänestä