Update app.py
Browse files
app.py
CHANGED
|
@@ -51,7 +51,7 @@ class HeartPredictor:
|
|
| 51 |
|
| 52 |
def load_normalization_params(self):
|
| 53 |
"""Load the saved normalization parameters from training"""
|
| 54 |
-
norm_file = "
|
| 55 |
if os.path.exists(norm_file):
|
| 56 |
with open(norm_file, 'rb') as f:
|
| 57 |
self.norm_params = pickle.load(f)
|
|
@@ -233,59 +233,43 @@ class HeartPredictor:
|
|
| 233 |
|
| 234 |
def _predict_segment(self, audio_segment, debug=False):
|
| 235 |
"""Predict on a single segment using training methodology"""
|
| 236 |
-
|
| 237 |
-
|
| 238 |
-
|
| 239 |
-
|
| 240 |
-
|
| 241 |
-
|
| 242 |
-
|
| 243 |
-
|
| 244 |
-
print("Extracting features...")
|
| 245 |
-
features = self.extract_features(denoised_audio, TARGET_SR)
|
| 246 |
-
|
| 247 |
-
# Prepare inputs exactly as in training
|
| 248 |
-
print("Preparing inputs...")
|
| 249 |
-
X_mfcc, X_chroma, X_mspec = self.prepare_input(features)
|
| 250 |
|
| 251 |
-
|
| 252 |
-
|
| 253 |
-
|
| 254 |
-
|
| 255 |
-
X_mspec_norm = self.normalize_with_training_stats(X_mspec, 'mspec')
|
| 256 |
|
| 257 |
-
|
| 258 |
-
|
| 259 |
-
|
| 260 |
-
|
| 261 |
-
|
| 262 |
-
|
| 263 |
-
|
| 264 |
-
"
|
| 265 |
-
"
|
| 266 |
-
|
| 267 |
-
|
| 268 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 269 |
}
|
| 270 |
-
|
| 271 |
-
|
| 272 |
-
result["normalization_check"] = {
|
| 273 |
-
"mfcc_norm_mean": float(np.mean(X_mfcc_norm)),
|
| 274 |
-
"mfcc_norm_std": float(np.std(X_mfcc_norm)),
|
| 275 |
-
"chroma_norm_mean": float(np.mean(X_chroma_norm)),
|
| 276 |
-
"chroma_norm_std": float(np.std(X_chroma_norm)),
|
| 277 |
-
"mspec_norm_mean": float(np.mean(X_mspec_norm)),
|
| 278 |
-
"mspec_norm_std": float(np.std(X_mspec_norm))
|
| 279 |
-
}
|
| 280 |
-
|
| 281 |
-
print("Segment prediction completed successfully")
|
| 282 |
-
return result
|
| 283 |
-
|
| 284 |
-
except Exception as e:
|
| 285 |
-
print(f"SEGMENT PROCESSING ERROR: {str(e)}")
|
| 286 |
-
import traceback
|
| 287 |
-
traceback.print_exc()
|
| 288 |
-
raise
|
| 289 |
|
| 290 |
# FastAPI app
|
| 291 |
app = FastAPI(title="Heart Sound Classifier API", version="1.0.0")
|
|
|
|
| 51 |
|
| 52 |
def load_normalization_params(self):
|
| 53 |
"""Load the saved normalization parameters from training"""
|
| 54 |
+
norm_file = "comprehensive_norm_params.pkl"
|
| 55 |
if os.path.exists(norm_file):
|
| 56 |
with open(norm_file, 'rb') as f:
|
| 57 |
self.norm_params = pickle.load(f)
|
|
|
|
| 233 |
|
| 234 |
def _predict_segment(self, audio_segment, debug=False):
|
| 235 |
"""Predict on a single segment using training methodology"""
|
| 236 |
+
# Apply same denoising as training
|
| 237 |
+
denoised_audio = self.denoise_audio(audio_segment, TARGET_SR)
|
| 238 |
+
|
| 239 |
+
# Extract features exactly as in training
|
| 240 |
+
features = self.extract_features(denoised_audio, TARGET_SR)
|
| 241 |
+
|
| 242 |
+
# Prepare inputs exactly as in training
|
| 243 |
+
X_mfcc, X_chroma, X_mspec = self.prepare_input(features)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 244 |
|
| 245 |
+
# FIXED: Use training normalization approach
|
| 246 |
+
X_mfcc_norm = self.normalize_with_training_stats(X_mfcc, 'mfcc')
|
| 247 |
+
X_chroma_norm = self.normalize_with_training_stats(X_chroma, 'chroma')
|
| 248 |
+
X_mspec_norm = self.normalize_with_training_stats(X_mspec, 'mspec')
|
|
|
|
| 249 |
|
| 250 |
+
# Get model prediction
|
| 251 |
+
raw_prediction = self.model.predict([X_mfcc_norm, X_chroma_norm, X_mspec_norm], verbose=0)
|
| 252 |
+
pred_prob = float(raw_prediction[0][0])
|
| 253 |
+
|
| 254 |
+
result = {
|
| 255 |
+
"raw_output": pred_prob,
|
| 256 |
+
"audio_stats": {
|
| 257 |
+
"mean": float(np.mean(denoised_audio)),
|
| 258 |
+
"std": float(np.std(denoised_audio))
|
| 259 |
+
} if debug else {}
|
| 260 |
+
}
|
| 261 |
+
|
| 262 |
+
if debug:
|
| 263 |
+
result["normalization_check"] = {
|
| 264 |
+
"mfcc_norm_mean": float(np.mean(X_mfcc_norm)),
|
| 265 |
+
"mfcc_norm_std": float(np.std(X_mfcc_norm)),
|
| 266 |
+
"chroma_norm_mean": float(np.mean(X_chroma_norm)),
|
| 267 |
+
"chroma_norm_std": float(np.std(X_chroma_norm)),
|
| 268 |
+
"mspec_norm_mean": float(np.mean(X_mspec_norm)),
|
| 269 |
+
"mspec_norm_std": float(np.std(X_mspec_norm))
|
| 270 |
}
|
| 271 |
+
|
| 272 |
+
return result
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 273 |
|
| 274 |
# FastAPI app
|
| 275 |
app = FastAPI(title="Heart Sound Classifier API", version="1.0.0")
|