Hamsy commited on
Commit
22ca435
·
verified ·
1 Parent(s): ff233d4

Upload app.py

Browse files
Files changed (1) hide show
  1. app.py +90 -0
app.py ADDED
@@ -0,0 +1,90 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+ import pickle
3
+ import numpy as np
4
+ import pandas as pd
5
+ import os
6
+
7
+ # 1. Chargement des Artefacts
8
+ MODEL_FILE = "smartrack_health_alert_vet_model.pkl"
9
+ ENCODER_FILE = "species_encoder_vet.pkl"
10
+
11
+ # Assurez-vous que ces fichiers audio ont été générés en amont
12
+ ALERT_AUDIO = "alert_high.mp3"
13
+ OK_AUDIO = "alert_ok.mp3"
14
+
15
+ try:
16
+ model = pickle.load(open(MODEL_FILE, "rb"))
17
+ encoder = pickle.load(open(ENCODER_FILE, "rb"))
18
+ except Exception as e:
19
+ # Cas d'erreur pour le déploiement
20
+ print(f"Erreur de chargement des artefacts : {e}")
21
+ model = None
22
+
23
+ classes = ['OK (Santé Normale)', 'ALERTE (Intervention Recommandée)']
24
+ SPECIES_LIST = list(encoder.categories_[0])
25
+
26
+
27
+ # 2. Fonction de Prédiction avec Output Audio
28
+ def predict_health_alert_vocal(species, hr, spo2, temp, acc_mean, gyro_mean):
29
+ """ Prend les données et renvoie le texte d'alerte ET le fichier audio correspondant. """
30
+
31
+ if model is None:
32
+ return "Erreur: Modèle non chargé.", None # Retourne le texte et l'audio (None)
33
+
34
+ input_data = pd.DataFrame({
35
+ 'hr': [hr], 'spo2': [spo2], 'temp': [temp],
36
+ 'acc_mean': [acc_mean], 'gyro_mean': [gyro_mean],
37
+ 'species': [species]
38
+ })
39
+
40
+ numerical_features = input_data.drop('species', axis=1)
41
+ species_encoded = encoder.transform(input_data[['species']])
42
+ species_df = pd.DataFrame(species_encoded, columns=encoder.get_feature_names_out(['species']))
43
+
44
+ X_final = pd.concat([numerical_features, species_df], axis=1)
45
+
46
+ prediction = model.predict(X_final)[0]
47
+ probas = model.predict_proba(X_final)[0]
48
+ predicted_class = classes[prediction]
49
+
50
+ # Choix du fichier audio et du message
51
+ if prediction == 1:
52
+ audio_path = ALERT_AUDIO
53
+ alert_style = "🚨 **ALERTE: Problème de Santé Détecté** 🚨"
54
+ action_message = "Veuillez vérifier immédiatement l'animal ou consulter un vétérinaire. Écoutez l'alerte vocale ci-dessous."
55
+ else:
56
+ audio_path = OK_AUDIO
57
+ alert_style = "✅ **Statut de Santé: OK**"
58
+ action_message = "Les signes vitaux sont dans la plage normale pour l'espèce. Écoutez le message de confirmation ci-dessous."
59
+
60
+ output_text = f"## {alert_style} \n\n"
61
+ output_text += f"**Espèce :** {species.capitalize()}\n"
62
+ output_text += f"**Statut Analysé :** **{predicted_class}**\n\n"
63
+ output_text += f"--- \n\n"
64
+ output_text += f"**Action Recommandée :** {action_message}\n\n"
65
+ output_text += f"*(Probabilité d'Alerte : {probas[1]*100:.2f}%)*"
66
+
67
+ return output_text, audio_path # Retourne le texte ET le chemin du fichier audio
68
+
69
+
70
+ # 3. Création de l'Interface Gradio (avec le composant Audio)
71
+ iface = gr.Interface(
72
+ fn=predict_health_alert_vocal, # Nouvelle fonction
73
+ inputs=[
74
+ gr.Dropdown(choices=SPECIES_LIST, label="1. Espèce Animale", value="boeuf"),
75
+ gr.Slider(minimum=30, maximum=200, value=75, label="2. Rythme Cardiaque (BPM)"),
76
+ gr.Slider(minimum=80, maximum=100, value=96, label="3. Saturation O₂ (SpO2 %)"),
77
+ gr.Slider(minimum=35.0, maximum=42.0, value=38.0, label="4. Température Corporelle (°C)"),
78
+ gr.Slider(minimum=0.0, maximum=5.0, value=0.5, label="5. Mouvement (Accél. Moy.)"),
79
+ gr.Slider(minimum=0.0, maximum=5.0, value=1.5, label="6. Mouvement (Gyro. Moy.)"),
80
+ ],
81
+ outputs=[
82
+ gr.Markdown(label="Rapport Textuel d'Alerte"), # Premier output: Texte
83
+ gr.Audio(label="Alerte Vocale (Cliquez pour Écouter)"), # Deuxième output: Audio
84
+ ],
85
+ title="Système d'Alerte de Santé Vétérinaire SmarTrack (Vocal)",
86
+ description="Le modèle prédit l'état de santé et génère une alerte vocale immédiate pour le propriétaire.",
87
+ )
88
+
89
+ # if __name__ == "__main__":
90
+ # iface.launch()