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 testasimme, voiko konvoluutioneuroverkko (CNN) havaita poikkeamia pumpun äänestä ilman fyysisiä antureita. Rakensimme siihen perustuvan autoencoder-neuroverkon käyttäen ohjelmointiin Pythonia, TensorFlow’ta ja librosa-kirjastoa.
Alle on laitettu joitain avainasemassa olevia koodin kohtia. Jos ohjelmakoodi kiinnostaa kokonaisuudessa, voit laittaa siitä pyynnön sähköpostilla tai yhteydenottolomakkeen kautta.
Ää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
- Äänidatan keruu ja esikäsittely
- Pumpun äänet nauhoitettiin iPhonen sovelluksella ja ne tallenettiin .wav-muotoon.
- Lataus tehtiin librosa.load -funktiolla, 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ä
- Piirteiden muodostus neuroverkkoa varten
- MFCC:t muutettiin yksinkertaisesti keskiarvoksi ajassa:
mfcc_features = np.mean(mfccs.T, axis=0)
- Mel-spektrogrammin ominaisuudet litistettiin:
mel_features = mel_spec_db.flatten()[:5000] # Rajaus kiinteäksi
- Autoencoder-malli ja koulutus
Autoencoder on neuroverkko, joka oppii tiivistämään ja rekonstruoimaan syötteensä. Tätä ominaisuutta voidaan hyödyntää poikkeamien havaitsemiseen: jos verkko oppii vain normaalidataa, se ei osaa rekonstruoida poikkeavaa syötettä hyvin – ja tämä näkyy korkeana virheenä.
Autoencoder valittiin siksi, että:
- Sitä voi opettaa pelkällä normaalilla datalla (ei tarvitse erikseen vikatilanteita)
- Rakenteeltaan yksinkertainen ja nopea kouluttaa
- Hyvä yleiseen poikkeamien havaitsemiseen, ei sidottu tiettyyn vian muotoon
Verkko rakennettiin seuraavasti:
- Yksinkertainen autoencoder 13 MFCC-piirteelle:
model = Sequential([ Dense(64, activation='relu', input_dim=13), Dense(32, activation='relu'), Dense(64, activation='relu'), Dense(13, activation='sigmoid') ])
- Malli opetettiin:
model.fit(X_train, X_train, epochs=20, batch_size=32, validation_data=(X_test, X_test))
- Poikkeamat havaittiin rekonstruointivirheen avulla:
reconstruction_error = np.mean(np.abs(predictions - X_test), axis=1) threshold = np.percentile(reconstruction_error, 95) anomalies = reconstruction_error > threshold
- Reaaliaikainen kuuntelusilmukka (live-tunnistus)
- pyaudio:lla tehtiin 10 sekunnin tallennussilmukka, joka tunnisti poikkeamia reaaliajassa, kun rekonstruktioerrori ylitti kynnysarvon.
- Mukana oli myös ESC-napin tarkkailu keyboard-kirjastolla.
if reconstruction_error > THRESHOLD: print(f"Poikkeama havaittu! Rekonstruointivirhe: {reconstruction_error[0]:.4f}")
- Havaintotilanteessa ääniaallon muoto piirretään matplotlibilla.
- Yhteenveto
Tämä kokeilu osoitti, että yksinkertainenkin autoencoder voi havaita ääneen perustuvia poikkeamia ilman erillisiä tunnistimia. Tulokset olivat lupaavia, ja menetelmä on laajennettavissa tuotantokäyttöön sekä integroitavissa edge-laitteisiin.
Vielä emme ole löytäneet hyvää ja kustannuksiltaan kohtuullista anturia äänen mittaamiseen, joten jos joltain löytyy vinkkiä niin laitathan postia.