shiko217 commited on
Commit
2ae1b0d
·
unverified ·
0 Parent(s):

Initial commit with LFS

Browse files
Files changed (4) hide show
  1. .gitattributes +36 -0
  2. app.py +131 -0
  3. best_v2f_generalist.keras +3 -0
  4. requirements.txt +5 -0
.gitattributes ADDED
@@ -0,0 +1,36 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ *.7z filter=lfs diff=lfs merge=lfs -text
2
+ *.arrow filter=lfs diff=lfs merge=lfs -text
3
+ *.bin filter=lfs diff=lfs merge=lfs -text
4
+ *.bz2 filter=lfs diff=lfs merge=lfs -text
5
+ *.ckpt filter=lfs diff=lfs merge=lfs -text
6
+ *.ftz filter=lfs diff=lfs merge=lfs -text
7
+ *.gz filter=lfs diff=lfs merge=lfs -text
8
+ *.h5 filter=lfs diff=lfs merge=lfs -text
9
+ *.joblib filter=lfs diff=lfs merge=lfs -text
10
+ *.lfs.* filter=lfs diff=lfs merge=lfs -text
11
+ *.mlmodel filter=lfs diff=lfs merge=lfs -text
12
+ *.model filter=lfs diff=lfs merge=lfs -text
13
+ *.msgpack filter=lfs diff=lfs merge=lfs -text
14
+ *.npy filter=lfs diff=lfs merge=lfs -text
15
+ *.npz filter=lfs diff=lfs merge=lfs -text
16
+ *.onnx filter=lfs diff=lfs merge=lfs -text
17
+ *.ot filter=lfs diff=lfs merge=lfs -text
18
+ *.parquet filter=lfs diff=lfs merge=lfs -text
19
+ *.pb filter=lfs diff=lfs merge=lfs -text
20
+ *.pickle filter=lfs diff=lfs merge=lfs -text
21
+ *.pkl filter=lfs diff=lfs merge=lfs -text
22
+ *.pt filter=lfs diff=lfs merge=lfs -text
23
+ *.pth filter=lfs diff=lfs merge=lfs -text
24
+ *.rar filter=lfs diff=lfs merge=lfs -text
25
+ *.safetensors filter=lfs diff=lfs merge=lfs -text
26
+ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
27
+ *.tar.* filter=lfs diff=lfs merge=lfs -text
28
+ *.tar filter=lfs diff=lfs merge=lfs -text
29
+ *.tflite filter=lfs diff=lfs merge=lfs -text
30
+ *.tgz filter=lfs diff=lfs merge=lfs -text
31
+ *.wasm filter=lfs diff=lfs merge=lfs -text
32
+ *.xz filter=lfs diff=lfs merge=lfs -text
33
+ *.zip filter=lfs diff=lfs merge=lfs -text
34
+ *.zst filter=lfs diff=lfs merge=lfs -text
35
+ *tfevents* filter=lfs diff=lfs merge=lfs -text
36
+ *.keras filter=lfs diff=lfs merge=lfs -text
app.py ADDED
@@ -0,0 +1,131 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import numpy as np
3
+ import librosa
4
+ import scipy.signal
5
+ from scipy.stats import kurtosis
6
+ import gradio as gr
7
+ import tensorflow as tf
8
+ import warnings
9
+
10
+ warnings.filterwarnings('ignore', category=UserWarning)
11
+
12
+ MAX_TIME_FRAMES = 313
13
+ N_MELS = 128
14
+ N_1D_FEATURES = 22
15
+
16
+ LABEL_MAP_INVERSE = {
17
+ 0: 'Machine 1_Normal', 1: 'Machine 1_Abnormal',
18
+ 2: 'Machine 2_Normal', 3: 'Machine 2_Abnormal',
19
+ 4: 'Machine 3_Normal', 5: 'Machine 3_Abnormal'
20
+ }
21
+
22
+ class MachineListenerPreprocessor:
23
+ def __init__(self, target_sr=16000, n_fft=2048, hop_length=512, n_mels=N_MELS, n_mfcc=20):
24
+ self.sr = target_sr
25
+ self.n_fft = n_fft
26
+ self.hop_length = hop_length
27
+ self.n_mels = n_mels
28
+ self.n_mfcc = n_mfcc
29
+
30
+ def _apply_highpass_filter(self, y, cutoff=60.0):
31
+ nyquist = 0.5 * self.sr
32
+ normal_cutoff = cutoff / nyquist
33
+ if normal_cutoff >= 1.0:
34
+ return y
35
+ b, a = scipy.signal.butter(4, normal_cutoff, btype='high', analog=False)
36
+ return scipy.signal.filtfilt(b, a, y)
37
+
38
+ def _truncate_silence(self, y, top_db=25):
39
+ y_trimmed, _ = librosa.effects.trim(y, top_db=top_db, frame_length=self.n_fft, hop_length=self.hop_length)
40
+ return y_trimmed
41
+
42
+ def _mean_variance_normalize(self, y):
43
+ return (y - np.mean(y)) / (np.std(y) + 1e-8)
44
+
45
+ def process_audio(self, file_path):
46
+ y, _ = librosa.load(file_path, sr=self.sr)
47
+ y = self._apply_highpass_filter(y)
48
+ y = self._truncate_silence(y, top_db=25)
49
+
50
+ if len(y) == 0:
51
+ raise ValueError(f"Silence only: {file_path}")
52
+
53
+ y = self._mean_variance_normalize(y)
54
+
55
+ # 2D Features
56
+ mel_spec = librosa.feature.melspectrogram(y=y, sr=self.sr, n_fft=self.n_fft, hop_length=self.hop_length, n_mels=self.n_mels)
57
+ log_mel_spec = librosa.power_to_db(mel_spec, ref=np.max)
58
+
59
+ # 1D Features
60
+ mfccs_mean = np.mean(librosa.feature.mfcc(S=log_mel_spec, n_mfcc=self.n_mfcc), axis=1)
61
+ centroid_mean = np.mean(librosa.feature.spectral_centroid(y=y, sr=self.sr, n_fft=self.n_fft, hop_length=self.hop_length))
62
+
63
+ stft_mag = np.abs(librosa.stft(y, n_fft=self.n_fft, hop_length=self.hop_length))
64
+ frame_kurtosis = np.nan_to_num(kurtosis(stft_mag, axis=0, fisher=True, bias=False))
65
+ kurtosis_mean = np.mean(frame_kurtosis)
66
+
67
+ return {
68
+ "2d_spectrogram": log_mel_spec,
69
+ "1d_statistics": np.hstack([mfccs_mean, centroid_mean, kurtosis_mean]),
70
+ }
71
+
72
+ def pad_or_truncate(spectrogram, max_frames):
73
+ if spectrogram.shape[1] > max_frames:
74
+ return spectrogram[:, :max_frames]
75
+ elif spectrogram.shape[1] < max_frames:
76
+ pad_width = max_frames - spectrogram.shape[1]
77
+ return np.pad(spectrogram, pad_width=((0, 0), (0, pad_width)), mode='constant')
78
+ return spectrogram
79
+
80
+ # Load the model
81
+ try:
82
+ model = tf.keras.models.load_model('best_v2f_generalist.keras')
83
+ except Exception as e:
84
+ print("Warning: Could not load model. Ensure the path is correct.", e)
85
+ model = None
86
+
87
+ preprocessor = MachineListenerPreprocessor()
88
+
89
+ def predict(audio_filepath):
90
+ if model is None:
91
+ return "Model not loaded properly."
92
+ if audio_filepath is None:
93
+ return "Please upload an audio file."
94
+
95
+ try:
96
+ # Extract features
97
+ features = preprocessor.process_audio(audio_filepath)
98
+
99
+ spec_2d = pad_or_truncate(features["2d_spectrogram"], MAX_TIME_FRAMES)
100
+ stat_1d = features["1d_statistics"]
101
+
102
+ # Add batch dimensions
103
+ spec_2d_batch = np.expand_dims(spec_2d, axis=0)
104
+ # Note: If your model expects a specific shape, e.g., (batch, channels, height, width), adjust dimensions below.
105
+ spec_2d_batch = np.expand_dims(spec_2d_batch, axis=-1)
106
+ stat_1d_batch = np.expand_dims(stat_1d, axis=0)
107
+
108
+ # Predict
109
+ predictions = model.predict([spec_2d_batch, stat_1d_batch])
110
+
111
+ predicted_class_idx = np.argmax(predictions, axis=-1)[0]
112
+ predicted_label = LABEL_MAP_INVERSE.get(predicted_class_idx, "Unknown")
113
+
114
+ confidence = float(np.max(predictions))
115
+
116
+ return f"Prediction: {predicted_label} (Confidence: {confidence:.2f})"
117
+
118
+ except Exception as e:
119
+ return f"Error processing file: {str(e)}"
120
+
121
+ # Create Gradio interface
122
+ iface = gr.Interface(
123
+ fn=predict,
124
+ inputs=gr.Audio(type="filepath", label="Upload Machine Audio"),
125
+ outputs="text",
126
+ title="Machine Listener Diagnosis",
127
+ description="Upload a sound from a machine to predict whether it is Normal or Abnormal."
128
+ )
129
+
130
+ if __name__ == "__main__":
131
+ iface.launch()
best_v2f_generalist.keras ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:b6b374074a6eaa9c1588263282b63536f09ed8b2cc75439cdbca0492949ecb9e
3
+ size 3069230
requirements.txt ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ numpy
2
+ scipy
3
+ librosa
4
+ gradio
5
+ tensorflow