Tracy André commited on
Commit
38c5a30
·
1 Parent(s): 45c8c03
Files changed (3) hide show
  1. interface.py +196 -292
  2. main.py +6 -72
  3. main_fallback.py +0 -151
interface.py CHANGED
@@ -22,126 +22,73 @@ class AgricultureInterface:
22
  self._initialize_data()
23
 
24
  def _initialize_data(self):
25
- """Initialise les données au démarrage avec gestion d'erreur"""
26
- try:
27
- print("🔄 Initialisation des données...")
28
- self.data_loader.load_data()
29
- if self.data_loader.has_data():
30
- self.analyzer.set_data(self.data_loader.get_data())
31
- self.analyzer.analyze_data()
32
- self.visualizer.set_data(
33
- self.data_loader.get_data(),
34
- self.analyzer.get_risk_analysis()
35
- )
36
- print("✅ Initialisation réussie")
37
- else:
38
- print("⚠️ Aucune donnée disponible au démarrage")
39
- except Exception as e:
40
- print(f"❌ Erreur lors de l'initialisation: {e}")
41
- # L'application peut continuer même si l'initialisation échoue
42
 
43
  def refresh_data(self):
44
- """Rafraîchit toutes les données avec gestion d'erreur robuste"""
45
- try:
46
- print("🔄 Rafraîchissement des données...")
47
-
48
- # Chargement des données
49
- try:
50
- self.data_loader.load_data()
51
- except Exception as e:
52
- print(f"❌ Erreur lors du chargement: {e}")
53
- return self._get_error_outputs("Erreur lors du chargement des données")
 
54
 
55
- if self.data_loader.has_data():
56
- try:
57
- # Analyse des données
58
- self.analyzer.set_data(self.data_loader.get_data())
59
- self.analyzer.analyze_data()
60
- self.visualizer.set_data(
61
- self.data_loader.get_data(),
62
- self.analyzer.get_risk_analysis()
63
- )
64
-
65
- # Génération des outputs avec gestion d'erreur individuelle
66
- return (
67
- self._safe_get_summary_stats(),
68
- self._safe_create_culture_analysis(),
69
- self._safe_create_risk_distribution(),
70
- self._safe_create_risk_visualization(),
71
- self._safe_get_recommendations()
72
- )
73
-
74
- except Exception as e:
75
- print(f"❌ Erreur lors de l'analyse: {e}")
76
- return self._get_error_outputs(f"Erreur lors de l'analyse: {str(e)[:100]}...")
77
- else:
78
- print("⚠️ Aucune donnée disponible après chargement")
79
- return self._get_error_outputs("Aucune donnée disponible")
80
-
81
- except Exception as e:
82
- print(f"❌ Erreur critique dans refresh_data: {e}")
83
- return self._get_error_outputs("Erreur critique lors du rafraîchissement")
84
 
85
  def _get_error_outputs(self, error_message):
86
  """Retourne des outputs d'erreur standardisés"""
87
- try:
88
- empty_fig = self.visualizer._create_error_plot("❌ Erreur", error_message)
89
- return (
90
- f"❌ {error_message}",
91
- empty_fig,
92
- empty_fig,
93
- empty_fig,
94
- f"❌ {error_message}"
95
- )
96
- except:
97
- # Fallback ultime si même la création d'erreur échoue
98
- return (
99
- "❌ Erreur critique",
100
- None,
101
- None,
102
- None,
103
- "❌ Erreur critique"
104
- )
105
 
106
  def _safe_get_summary_stats(self):
107
  """Récupère les statistiques avec gestion d'erreur"""
108
- try:
109
- return self.analyzer.get_summary_stats()
110
- except Exception as e:
111
- print(f"❌ Erreur dans get_summary_stats: {e}")
112
- return "❌ Erreur lors de la génération des statistiques"
113
 
114
  def _safe_create_culture_analysis(self):
115
  """Crée l'analyse des cultures avec gestion d'erreur"""
116
- try:
117
- return self.visualizer.create_culture_analysis()
118
- except Exception as e:
119
- print(f"❌ Erreur dans create_culture_analysis: {e}")
120
- return self.visualizer._create_error_plot("❌ Erreur", "Impossible de créer l'analyse des cultures")
121
 
122
  def _safe_create_risk_distribution(self):
123
  """Crée la distribution des risques avec gestion d'erreur"""
124
- try:
125
- return self.visualizer.create_risk_distribution()
126
- except Exception as e:
127
- print(f"❌ Erreur dans create_risk_distribution: {e}")
128
- return self.visualizer._create_error_plot("❌ Erreur", "Impossible de créer la distribution des risques")
129
 
130
  def _safe_create_risk_visualization(self):
131
  """Crée la visualisation des risques avec gestion d'erreur"""
132
- try:
133
- return self.visualizer.create_risk_visualization()
134
- except Exception as e:
135
- print(f"❌ Erreur dans create_risk_visualization: {e}")
136
- return self.visualizer._create_error_plot("❌ Erreur", "Impossible de créer la visualisation des risques")
137
 
138
  def _safe_get_recommendations(self):
139
  """Récupère les recommandations avec gestion d'erreur"""
140
- try:
141
- return self.analyzer.get_low_risk_recommendations()
142
- except Exception as e:
143
- print(f"❌ Erreur dans get_low_risk_recommendations: {e}")
144
- return "❌ Erreur lors de la génération des recommandations"
145
 
146
  def create_interface(self):
147
  """Crée l'interface Gradio"""
@@ -189,219 +136,176 @@ class AgricultureInterface:
189
  return demo
190
 
191
  def _create_overview_tab(self):
192
- """Crée l'onglet de vue d'ensemble avec gestion d'erreur"""
193
- try:
194
- gr.Markdown("## Statistiques générales des données agricoles")
195
-
196
- self.stats_output = gr.Markdown(self._safe_get_summary_stats())
197
-
198
- with gr.Row():
199
- self.culture_plot = gr.Plot(self._safe_create_culture_analysis())
200
- self.risk_dist_plot = gr.Plot(self._safe_create_risk_distribution())
201
- except Exception as e:
202
- print(f"❌ Erreur lors de la création de l'onglet vue d'ensemble: {e}")
203
- gr.Markdown("❌ Erreur lors de la création de l'interface")
204
 
205
  def _create_risk_analysis_tab(self):
206
- """Crée l'onglet d'analyse des risques avec gestion d'erreur"""
207
- try:
208
- gr.Markdown("## Cartographie des risques adventices par parcelle")
209
-
210
- self.risk_plot = gr.Plot(self._safe_create_risk_visualization())
211
-
212
- gr.Markdown("""
213
- **Interprétation du graphique**:
214
- - **Axe X**: Surface de la parcelle (hectares)
215
- - **Axe Y**: IFT Herbicide approximatif
216
- - **Couleur**: Niveau de risque adventice
217
- - **Taille**: Nombre d'herbicides utilisés
218
-
219
- Les parcelles vertes (risque faible) sont idéales pour les cultures sensibles.
220
- """)
221
- except Exception as e:
222
- print(f"❌ Erreur lors de la création de l'onglet analyse des risques: {e}")
223
- gr.Markdown("❌ Erreur lors de la création de l'interface d'analyse des risques")
224
-
225
- def _create_recommendations_tab(self):
226
- """Crée l'onglet des recommandations avec gestion d'erreur"""
227
- try:
228
- self.reco_output = gr.Markdown(self._safe_get_recommendations())
229
-
230
- gr.Markdown("""
231
- ## 💡 Conseils pour la gestion des adventices
232
-
233
- ### Parcelles à Très Faible Risque (Vertes)
234
- - ✅ **Idéales pour pois et haricot**
235
- - ✅ Historique d'usage herbicide minimal
236
- - ✅ Pression adventice faible attendue
237
 
238
- ### Parcelles à Faible Risque (Vert clair)
239
- - ⚠️ Surveillance légère recommandée
240
- - ✅ Conviennent aux cultures sensibles avec précautions
241
 
242
- ### Parcelles à Risque Modéré/Élevé (Orange/Rouge)
243
- - Éviter pour cultures sensibles
244
- - 🔍 Rotation nécessaire avant implantation
245
- - 📈 Surveillance renforcée des adventices
 
 
246
 
247
- ### Stratégies alternatives
248
- - **Rotation longue**: 3-4 ans avant cultures sensibles
249
- - **Cultures intermédiaires**: CIPAN pour réduire la pression
250
- - **Techniques mécaniques**: Hersage, binage
251
- - **Biostimulants**: Renforcement naturel des cultures
252
  """)
253
- except Exception as e:
254
- print(f"❌ Erreur lors de la création de l'onglet recommandations: {e}")
255
- gr.Markdown(" Erreur lors de la création de l'interface de recommandations")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
256
 
257
  def _create_data_viewer_tab(self):
258
  """Crée l'onglet de visualisation des données par année"""
259
- try:
260
- gr.Markdown("## 📋 Exploration des Données par Année")
261
-
262
- # Récupérer les années disponibles
263
- available_years = self.visualizer.get_available_years()
264
-
265
- if not available_years:
266
- gr.Markdown("❌ Aucune année disponible dans les données")
267
- return
268
-
269
- # Ajouter une option "Toutes années"
270
- year_choices = ["Toutes les années"] + [str(year) for year in available_years]
271
-
272
- # Interface de sélection
273
- with gr.Row():
274
- with gr.Column(scale=1):
275
- year_selector = gr.Dropdown(
276
- choices=year_choices,
277
- value="Toutes les années",
278
- label="🗓️ Sélectionnez une année",
279
- interactive=True
280
- )
281
-
282
- with gr.Column(scale=1):
283
- update_btn = gr.Button(
284
- "🔄 Actualiser la vue",
285
- variant="primary"
286
- )
287
-
288
- # Informations sur la sélection
289
- self.data_info = gr.Markdown("📊 Sélectionnez une année pour voir les données")
290
 
291
- # Graphiques de résumé
292
- with gr.Row():
293
- with gr.Column():
294
- self.yearly_summary_plot = gr.Plot(
295
- self._safe_create_yearly_summary(None)
296
- )
297
-
298
- with gr.Column():
299
- self.monthly_activity_plot = gr.Plot(
300
- self._safe_create_monthly_activity(None)
301
- )
 
 
 
 
302
 
303
- # Tableau des données
304
- gr.Markdown("### 📋 Tableau des Données")
305
- self.data_table = gr.Dataframe(
306
- value=self._safe_create_data_table(None)[0],
307
- label="Données de la période sélectionnée",
308
- interactive=False,
309
- wrap=True,
310
- max_rows=100
311
- )
 
 
 
 
 
 
 
 
 
 
312
 
313
- # Fonction de mise à jour
314
- def update_data_view(selected_year):
315
- try:
316
- # Convertir la sélection
317
- year = None if selected_year == "Toutes les années" else int(selected_year)
318
-
319
- # Générer les nouvelles vues
320
- data_table, info_msg = self._safe_create_data_table(year)
321
- summary_plot = self._safe_create_yearly_summary(year)
322
- monthly_plot = self._safe_create_monthly_activity(year)
323
-
324
- return (
325
- info_msg,
326
- summary_plot,
327
- monthly_plot,
328
- data_table
329
- )
330
-
331
- except Exception as e:
332
- print(f"❌ Erreur lors de la mise à jour de la vue: {e}")
333
- error_plot = self.visualizer._create_error_plot(
334
- "❌ Erreur",
335
- f"Impossible de mettre à jour: {str(e)[:50]}..."
336
- )
337
- return (
338
- f"❌ Erreur: {str(e)[:100]}...",
339
- error_plot,
340
- error_plot,
341
- None
342
- )
343
 
344
- # Connecter les événements
345
- year_selector.change(
346
- update_data_view,
347
- inputs=[year_selector],
348
- outputs=[
349
- self.data_info,
350
- self.yearly_summary_plot,
351
- self.monthly_activity_plot,
352
- self.data_table
353
- ]
354
- )
355
-
356
- update_btn.click(
357
- update_data_view,
358
- inputs=[year_selector],
359
- outputs=[
360
- self.data_info,
361
- self.yearly_summary_plot,
362
- self.monthly_activity_plot,
363
- self.data_table
364
- ]
365
  )
366
-
367
- gr.Markdown("""
368
- ### 💡 Utilisation de l'onglet Données
369
-
370
- - **Sélection d'année** : Filtrez les données par millésime
371
- - **Graphique des interventions** : Types d'interventions les plus fréquents
372
- - **Activité mensuelle** : Répartition des interventions par mois
373
- - **Tableau détaillé** : Données brutes avec colonnes importantes
374
-
375
- > 📝 **Note** : Le tableau est limité à 1000 lignes pour des raisons de performance
376
- """)
377
-
378
- except Exception as e:
379
- print(f"❌ Erreur lors de la création de l'onglet données: {e}")
380
- gr.Markdown("❌ Erreur lors de la création de l'interface de données")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
381
 
382
  def _safe_create_data_table(self, year):
383
- """Crée le tableau de données avec gestion d'erreur"""
384
- try:
385
- return self.visualizer.create_data_table_by_year(year)
386
- except Exception as e:
387
- print(f"❌ Erreur dans create_data_table: {e}")
388
- return None, f"❌ Erreur: {str(e)[:100]}..."
389
 
390
  def _safe_create_yearly_summary(self, year):
391
- """Crée le résumé annuel avec gestion d'erreur"""
392
- try:
393
- return self.visualizer.create_yearly_summary_chart(year)
394
- except Exception as e:
395
- print(f"❌ Erreur dans create_yearly_summary: {e}")
396
- return self.visualizer._create_error_plot("❌ Erreur", "Impossible de créer le résumé")
397
 
398
  def _safe_create_monthly_activity(self, year):
399
- """Crée l'activité mensuelle avec gestion d'erreur"""
400
- try:
401
- return self.visualizer.create_monthly_activity_chart(year)
402
- except Exception as e:
403
- print(f"❌ Erreur dans create_monthly_activity: {e}")
404
- return self.visualizer._create_error_plot("❌ Erreur", "Impossible de créer l'activité mensuelle")
405
 
406
  def _create_about_tab(self):
407
  """Crée l'onglet à propos"""
 
22
  self._initialize_data()
23
 
24
  def _initialize_data(self):
25
+ """Initialise les données au démarrage"""
26
+ print("🔄 Initialisation des données...")
27
+ self.data_loader.load_data()
28
+ if self.data_loader.has_data():
29
+ self.analyzer.set_data(self.data_loader.get_data())
30
+ self.analyzer.analyze_data()
31
+ self.visualizer.set_data(
32
+ self.data_loader.get_data(),
33
+ self.analyzer.get_risk_analysis()
34
+ )
35
+ print("✅ Initialisation réussie")
36
+ else:
37
+ print("⚠️ Aucune donnée disponible au démarrage")
 
 
 
 
38
 
39
  def refresh_data(self):
40
+ """Rafraîchit toutes les données"""
41
+ print("🔄 Rafraîchissement des données...")
42
+
43
+ self.data_loader.load_data()
44
+ if self.data_loader.has_data():
45
+ self.analyzer.set_data(self.data_loader.get_data())
46
+ self.analyzer.analyze_data()
47
+ self.visualizer.set_data(
48
+ self.data_loader.get_data(),
49
+ self.analyzer.get_risk_analysis()
50
+ )
51
 
52
+ return (
53
+ self._safe_get_summary_stats(),
54
+ self._safe_create_culture_analysis(),
55
+ self._safe_create_risk_distribution(),
56
+ self._safe_create_risk_visualization(),
57
+ self._safe_get_recommendations()
58
+ )
59
+ else:
60
+ return self._get_error_outputs("Aucune donnée disponible")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
61
 
62
  def _get_error_outputs(self, error_message):
63
  """Retourne des outputs d'erreur standardisés"""
64
+ empty_fig = self.visualizer._create_error_plot("❌ Erreur", error_message)
65
+ return (
66
+ f"❌ {error_message}",
67
+ empty_fig,
68
+ empty_fig,
69
+ empty_fig,
70
+ f"❌ {error_message}"
71
+ )
 
 
 
 
 
 
 
 
 
 
72
 
73
  def _safe_get_summary_stats(self):
74
  """Récupère les statistiques avec gestion d'erreur"""
75
+ return self.analyzer.get_summary_stats()
 
 
 
 
76
 
77
  def _safe_create_culture_analysis(self):
78
  """Crée l'analyse des cultures avec gestion d'erreur"""
79
+ return self.visualizer.create_culture_analysis()
 
 
 
 
80
 
81
  def _safe_create_risk_distribution(self):
82
  """Crée la distribution des risques avec gestion d'erreur"""
83
+ return self.visualizer.create_risk_distribution()
 
 
 
 
84
 
85
  def _safe_create_risk_visualization(self):
86
  """Crée la visualisation des risques avec gestion d'erreur"""
87
+ return self.visualizer.create_risk_visualization()
 
 
 
 
88
 
89
  def _safe_get_recommendations(self):
90
  """Récupère les recommandations avec gestion d'erreur"""
91
+ return self.analyzer.get_low_risk_recommendations()
 
 
 
 
92
 
93
  def create_interface(self):
94
  """Crée l'interface Gradio"""
 
136
  return demo
137
 
138
  def _create_overview_tab(self):
139
+ """Crée l'onglet de vue d'ensemble"""
140
+ gr.Markdown("## Statistiques générales des données agricoles")
141
+
142
+ self.stats_output = gr.Markdown(self._safe_get_summary_stats())
143
+
144
+ with gr.Row():
145
+ self.culture_plot = gr.Plot(self._safe_create_culture_analysis())
146
+ self.risk_dist_plot = gr.Plot(self._safe_create_risk_distribution())
 
 
 
 
147
 
148
  def _create_risk_analysis_tab(self):
149
+ """Crée l'onglet d'analyse des risques"""
150
+ gr.Markdown("## Cartographie des risques adventices par parcelle")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
151
 
152
+ self.risk_plot = gr.Plot(self._safe_create_risk_visualization())
 
 
153
 
154
+ gr.Markdown("""
155
+ **Interprétation du graphique**:
156
+ - **Axe X**: Surface de la parcelle (hectares)
157
+ - **Axe Y**: IFT Herbicide approximatif
158
+ - **Couleur**: Niveau de risque adventice
159
+ - **Taille**: Nombre d'herbicides utilisés
160
 
161
+ Les parcelles vertes (risque faible) sont idéales pour les cultures sensibles.
 
 
 
 
162
  """)
163
+
164
+ def _create_recommendations_tab(self):
165
+ """Crée l'onglet des recommandations"""
166
+ self.reco_output = gr.Markdown(self._safe_get_recommendations())
167
+
168
+ gr.Markdown("""
169
+ ## 💡 Conseils pour la gestion des adventices
170
+
171
+ ### Parcelles à Très Faible Risque (Vertes)
172
+ - ✅ **Idéales pour pois et haricot**
173
+ - ✅ Historique d'usage herbicide minimal
174
+ - ✅ Pression adventice faible attendue
175
+
176
+ ### Parcelles à Faible Risque (Vert clair)
177
+ - ⚠️ Surveillance légère recommandée
178
+ - ✅ Conviennent aux cultures sensibles avec précautions
179
+
180
+ ### Parcelles à Risque Modéré/Élevé (Orange/Rouge)
181
+ - ❌ Éviter pour cultures sensibles
182
+ - 🔍 Rotation nécessaire avant implantation
183
+ - 📈 Surveillance renforcée des adventices
184
+
185
+ ### Stratégies alternatives
186
+ - **Rotation longue**: 3-4 ans avant cultures sensibles
187
+ - **Cultures intermédiaires**: CIPAN pour réduire la pression
188
+ - **Techniques mécaniques**: Hersage, binage
189
+ - **Biostimulants**: Renforcement naturel des cultures
190
+ """)
191
 
192
  def _create_data_viewer_tab(self):
193
  """Crée l'onglet de visualisation des données par année"""
194
+ gr.Markdown("## 📋 Exploration des Données par Année")
195
+
196
+ # Récupérer les années disponibles
197
+ available_years = self.visualizer.get_available_years()
198
+
199
+ if not available_years:
200
+ gr.Markdown("❌ Aucune année disponible dans les données")
201
+ return
202
+
203
+ # Ajouter une option "Toutes années"
204
+ year_choices = ["Toutes les années"] + [str(year) for year in available_years]
205
+
206
+ # Interface de sélection
207
+ with gr.Row():
208
+ with gr.Column(scale=1):
209
+ year_selector = gr.Dropdown(
210
+ choices=year_choices,
211
+ value="Toutes les années",
212
+ label="🗓️ Sélectionnez une année",
213
+ interactive=True
214
+ )
 
 
 
 
 
 
 
 
 
 
215
 
216
+ with gr.Column(scale=1):
217
+ update_btn = gr.Button(
218
+ "🔄 Actualiser la vue",
219
+ variant="primary"
220
+ )
221
+
222
+ # Informations sur la sélection
223
+ self.data_info = gr.Markdown("📊 Sélectionnez une année pour voir les données")
224
+
225
+ # Graphiques de résumé
226
+ with gr.Row():
227
+ with gr.Column():
228
+ self.yearly_summary_plot = gr.Plot(
229
+ self._safe_create_yearly_summary(None)
230
+ )
231
 
232
+ with gr.Column():
233
+ self.monthly_activity_plot = gr.Plot(
234
+ self._safe_create_monthly_activity(None)
235
+ )
236
+
237
+ # Tableau des données
238
+ gr.Markdown("### 📋 Tableau des Données")
239
+ self.data_table = gr.Dataframe(
240
+ value=self._safe_create_data_table(None)[0],
241
+ label="Données de la période sélectionnée",
242
+ interactive=False,
243
+ wrap=True,
244
+ max_rows=100
245
+ )
246
+
247
+ # Fonction de mise à jour
248
+ def update_data_view(selected_year):
249
+ # Convertir la sélection
250
+ year = None if selected_year == "Toutes les années" else int(selected_year)
251
 
252
+ # Générer les nouvelles vues
253
+ data_table, info_msg = self._safe_create_data_table(year)
254
+ summary_plot = self._safe_create_yearly_summary(year)
255
+ monthly_plot = self._safe_create_monthly_activity(year)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
256
 
257
+ return (
258
+ info_msg,
259
+ summary_plot,
260
+ monthly_plot,
261
+ data_table
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
262
  )
263
+
264
+ # Connecter les événements
265
+ year_selector.change(
266
+ update_data_view,
267
+ inputs=[year_selector],
268
+ outputs=[
269
+ self.data_info,
270
+ self.yearly_summary_plot,
271
+ self.monthly_activity_plot,
272
+ self.data_table
273
+ ]
274
+ )
275
+
276
+ update_btn.click(
277
+ update_data_view,
278
+ inputs=[year_selector],
279
+ outputs=[
280
+ self.data_info,
281
+ self.yearly_summary_plot,
282
+ self.monthly_activity_plot,
283
+ self.data_table
284
+ ]
285
+ )
286
+
287
+ gr.Markdown("""
288
+ ### 💡 Utilisation de l'onglet Données
289
+
290
+ - **Sélection d'année** : Filtrez les données par millésime
291
+ - **Graphique des interventions** : Types d'interventions les plus fréquents
292
+ - **Activité mensuelle** : Répartition des interventions par mois
293
+ - **Tableau détaillé** : Données brutes avec colonnes importantes
294
+
295
+ > 📝 **Note** : Le tableau est limité à 1000 lignes pour des raisons de performance
296
+ """)
297
 
298
  def _safe_create_data_table(self, year):
299
+ """Crée le tableau de données"""
300
+ return self.visualizer.create_data_table_by_year(year)
 
 
 
 
301
 
302
  def _safe_create_yearly_summary(self, year):
303
+ """Crée le résumé annuel"""
304
+ return self.visualizer.create_yearly_summary_chart(year)
 
 
 
 
305
 
306
  def _safe_create_monthly_activity(self, year):
307
+ """Crée l'activité mensuelle"""
308
+ return self.visualizer.create_monthly_activity_chart(year)
 
 
 
 
309
 
310
  def _create_about_tab(self):
311
  """Crée l'onglet à propos"""
main.py CHANGED
@@ -1,12 +1,10 @@
1
  """
2
  Point d'entrée principal de l'application d'analyse des adventices agricoles
3
- Avec détection automatique des problèmes et fallback
4
  """
5
  import warnings
6
  import matplotlib.pyplot as plt
7
  import seaborn as sns
8
- import sys
9
- import os
10
 
11
  # Suppression des warnings
12
  warnings.filterwarnings('ignore')
@@ -16,77 +14,13 @@ plt.style.use('default')
16
  sns.set_palette("husl")
17
 
18
 
19
- def try_gradio_interface():
20
- """Essaie de lancer l'interface Gradio"""
21
- try:
22
- print("🔄 Tentative de lancement de l'interface Gradio...")
23
- from interface import AgricultureInterface
24
-
25
- app = AgricultureInterface()
26
- app.launch()
27
- return True
28
-
29
- except ImportError as e:
30
- print(f"❌ Erreur d'import: {e}")
31
- if "pyaudioop" in str(e) or "audioop" in str(e):
32
- print("🔍 Problème détecté: Dépendance audio manquante pour Gradio")
33
- return False
34
-
35
- except Exception as e:
36
- print(f"❌ Erreur lors du lancement de Gradio: {e}")
37
- return False
38
-
39
-
40
- def run_fallback():
41
- """Lance le mode fallback sans Gradio"""
42
- try:
43
- print("🔄 Basculement vers le mode fallback...")
44
- from main_fallback import run_analysis_without_ui
45
-
46
- return run_analysis_without_ui()
47
-
48
- except Exception as e:
49
- print(f"❌ Erreur dans le mode fallback: {e}")
50
- return False
51
-
52
-
53
  def main():
54
- """Fonction principale avec gestion d'erreur et fallback automatique"""
55
- print("🌾 Application d'Analyse des Adventices Agricoles")
56
- print("=" * 60)
57
-
58
- # Tentative 1: Interface Gradio complète
59
- print("\n🎯 Tentative 1: Interface web avec Gradio")
60
-
61
- try:
62
- if try_gradio_interface():
63
- return # Succès, on s'arrête ici
64
- except KeyboardInterrupt:
65
- print("\n⏹️ Arrêt demandé par l'utilisateur")
66
- return
67
- except Exception as e:
68
- print(f"❌ Échec critique de l'interface Gradio: {e}")
69
-
70
- # Tentative 2: Mode fallback console
71
- print("\n🎯 Tentative 2: Mode console (fallback)")
72
 
73
- try:
74
- if run_fallback():
75
- print("\n✅ Mode fallback exécuté avec succès")
76
- print("\n💡 Pour utiliser l'interface web, résolvez les problèmes de dépendances:")
77
- print(" - Installez les dépendances audio manquantes")
78
- print(" - Ou utilisez une version compatible de Gradio")
79
- else:
80
- print("\n❌ Échec du mode fallback")
81
- exit(1)
82
-
83
- except KeyboardInterrupt:
84
- print("\n⏹️ Arrêt demandé par l'utilisateur")
85
- return
86
- except Exception as e:
87
- print(f"\n❌ Erreur critique dans le mode fallback: {e}")
88
- print("🆘 Aucun mode disponible - vérifiez vos dépendances")
89
- exit(1)
90
 
91
 
92
  if __name__ == "__main__":
 
1
  """
2
  Point d'entrée principal de l'application d'analyse des adventices agricoles
 
3
  """
4
  import warnings
5
  import matplotlib.pyplot as plt
6
  import seaborn as sns
7
+ from interface import AgricultureInterface
 
8
 
9
  # Suppression des warnings
10
  warnings.filterwarnings('ignore')
 
14
  sns.set_palette("husl")
15
 
16
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
17
  def main():
18
+ """Fonction principale qui lance l'application"""
19
+ print("🌾 Démarrage de l'application d'analyse des adventices agricoles...")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
20
 
21
+ # Création et lancement de l'interface
22
+ app = AgricultureInterface()
23
+ app.launch()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
24
 
25
 
26
  if __name__ == "__main__":
main_fallback.py DELETED
@@ -1,151 +0,0 @@
1
- """
2
- Version alternative de main.py qui fonctionne sans Gradio
3
- Pour les cas où les dépendances Gradio posent problème
4
- """
5
- import warnings
6
- import matplotlib.pyplot as plt
7
- import seaborn as sns
8
- from data_loader import DataLoader
9
- from analyzer import AgricultureAnalyzer
10
- from visualizations import AgricultureVisualizer
11
-
12
- # Suppression des warnings
13
- warnings.filterwarnings('ignore')
14
-
15
- # Configuration des graphiques
16
- plt.style.use('default')
17
- sns.set_palette("husl")
18
-
19
-
20
- def run_analysis_without_ui():
21
- """Exécute l'analyse sans interface utilisateur"""
22
- print("🌾 Analyse des Adventices Agricoles - Mode Console")
23
- print("=" * 60)
24
-
25
- try:
26
- # Initialisation des composants
27
- print("🔄 Initialisation des composants...")
28
- data_loader = DataLoader()
29
- analyzer = AgricultureAnalyzer()
30
- visualizer = AgricultureVisualizer()
31
-
32
- # Chargement des données
33
- print("\n📊 Chargement des données...")
34
- result = data_loader.load_data()
35
- if isinstance(result, str) and "❌" in result:
36
- print(f"Erreur: {result}")
37
- return False
38
-
39
- if not data_loader.has_data():
40
- print("❌ Aucune donnée disponible")
41
- return False
42
-
43
- data = data_loader.get_data()
44
- print(f"✅ {len(data)} enregistrements chargés")
45
-
46
- # Analyse des données
47
- print("\n🔬 Analyse des données...")
48
- analyzer.set_data(data)
49
- general_stats, herbicide_stats = analyzer.analyze_data()
50
-
51
- if general_stats:
52
- print("✅ Analyse générale terminée")
53
- print(f" - Parcelles: {general_stats['total_parcelles']}")
54
- print(f" - Interventions: {general_stats['total_interventions']}")
55
- print(f" - Surface totale: {general_stats['surface_totale']:.2f} ha")
56
-
57
- if herbicide_stats:
58
- print("✅ Analyse herbicides terminée")
59
- print(f" - Interventions herbicides: {herbicide_stats['nb_interventions_herbicides']}")
60
- print(f" - Pourcentage: {herbicide_stats['pourcentage_herbicides']:.1f}%")
61
-
62
- # Génération des statistiques
63
- print("\n📋 Génération des statistiques...")
64
- stats = analyzer.get_summary_stats()
65
- print("✅ Statistiques générées")
66
-
67
- # Génération des recommandations
68
- print("\n🎯 Génération des recommandations...")
69
- recommendations = analyzer.get_low_risk_recommendations()
70
- print("✅ Recommandations générées")
71
-
72
- # Sauvegarde des résultats
73
- print("\n💾 Sauvegarde des résultats...")
74
- try:
75
- # Créer le dossier results s'il n'existe pas
76
- import os
77
- os.makedirs('results', exist_ok=True)
78
-
79
- # Sauvegarde des statistiques
80
- with open('results/stats_console.md', 'w', encoding='utf-8') as f:
81
- f.write("# Analyse des Adventices Agricoles\n\n")
82
- f.write(stats)
83
- f.write("\n\n")
84
- f.write(recommendations)
85
-
86
- # Sauvegarde de l'analyse des risques si disponible
87
- risk_analysis = analyzer.get_risk_analysis()
88
- if risk_analysis is not None and len(risk_analysis) > 0:
89
- risk_analysis.to_csv('results/risk_analysis_console.csv')
90
- print("✅ Analyse des risques sauvegardée (CSV)")
91
-
92
- print("✅ Résultats sauvegardés dans results/")
93
-
94
- except Exception as e:
95
- print(f"⚠️ Erreur lors de la sauvegarde: {e}")
96
-
97
- # Tentative de génération des graphiques
98
- print("\n📈 Tentative de génération des graphiques...")
99
- try:
100
- visualizer.set_data(data, analyzer.get_risk_analysis())
101
-
102
- # Les graphiques seront créés mais ne pourront pas être affichés en mode console
103
- print("⚠️ Les graphiques sont générés mais ne peuvent pas être affichés en mode console")
104
- print("💡 Utilisez main.py avec Gradio pour voir les visualisations interactives")
105
-
106
- except Exception as e:
107
- print(f"⚠️ Impossible de générer les graphiques: {e}")
108
-
109
- print("\n🎉 Analyse terminée avec succès!")
110
- print("\n📁 Fichiers générés:")
111
- print(" - results/stats_console.md : Statistiques et recommandations")
112
- print(" - results/risk_analysis_console.csv : Analyse détaillée des risques")
113
-
114
- return True
115
-
116
- except Exception as e:
117
- print(f"❌ Erreur critique: {e}")
118
- import traceback
119
- traceback.print_exc()
120
- return False
121
-
122
-
123
- def main():
124
- """Fonction principale en mode fallback"""
125
- print("🔧 Mode Fallback - Analyse sans interface Gradio")
126
-
127
- try:
128
- # Tentative d'import de Gradio pour vérifier la disponibilité
129
- try:
130
- import gradio as gr
131
- print("✅ Gradio disponible - vous pouvez utiliser main.py")
132
- print("⚠️ Utilisation du mode fallback forcé")
133
- except ImportError as e:
134
- print(f"⚠️ Gradio non disponible: {e}")
135
- print("🔄 Utilisation du mode console")
136
- except Exception as e:
137
- print(f"⚠️ Problème avec Gradio: {e}")
138
- print("🔄 Utilisation du mode console")
139
-
140
- # Exécution de l'analyse
141
- success = run_analysis_without_ui()
142
-
143
- if success:
144
- print("\n✅ Mode fallback exécuté avec succès")
145
- else:
146
- print("\n❌ Échec du mode fallback")
147
- exit(1)
148
-
149
-
150
- if __name__ == "__main__":
151
- main()