Update src/streamlit_app_stable.py

#4
by sido1991 - opened
Files changed (1) hide show
  1. src/streamlit_app_stable.py +50 -12
src/streamlit_app_stable.py CHANGED
@@ -3,8 +3,10 @@ import torch
3
  import gc
4
  import time
5
  import psutil
 
6
  from transformers import AutoProcessor, Gemma3nForConditionalGeneration
7
  from PIL import Image
 
8
 
9
  # --- Configuration de la Page ---
10
  st.set_page_config(
@@ -31,6 +33,9 @@ if 'load_attempt_count' not in st.session_state:
31
  st.session_state.load_attempt_count = 0
32
  if 'device' not in st.session_state:
33
  st.session_state.device = "cpu"
 
 
 
34
 
35
  # --- Fonctions d'Aide Système ---
36
 
@@ -47,6 +52,10 @@ def diagnose_loading_issues():
47
  """Diagnostique les problèmes potentiels avant le chargement du modèle."""
48
  issues = []
49
 
 
 
 
 
50
  try:
51
  ram = psutil.virtual_memory()
52
  ram_gb = ram.total / (1024**3)
@@ -164,7 +173,11 @@ def t(key):
164
  "please_enter_description_warning": "⚠️ Veuillez entrer une description des symptômes de votre plante.",
165
  "default_prompt_full_diagnosis": "<image>\nAnalyse cette image de plante et fournis un diagnostic complet :\n1. **État général de la plante :** Décris son apparence globale et sa vitalité.\n2. **Identification des problèmes :** Liste les maladies, parasites ou carences visibles.\n3. **Diagnostic probable :** Indique la maladie ou le problème le plus probable.\n4. **Causes possibles :** Explique ce qui a pu causer ce problème.\n5. **Recommandations de traitement :** Propose des solutions concrètes et adaptées.\n6. **Conseils préventifs :** Donne des astuces pour éviter que le problème ne revienne.\nRéponds de manière structurée et claire en français.",
166
  "default_prompt_disease_id": "<image>\nDiagnostique cette plante en te concentrant sur les maladies et parasites :\n1. Identifie les symptômes visuels spécifiques aux maladies ou parasites.\n2. Détermine la maladie ou le parasite le plus probable.\n3. Explique les conditions favorisant leur développement.\n4. Propose des traitements ciblés et des méthodes de lutte.\nRéponds en français de manière structurée.",
167
- "default_prompt_care_advice": "<image>\nAnalyse cette plante et donne des conseils de soins détaillés :\n1. État général de la plante : Évalue sa santé actuelle.\n2. Besoins spécifiques : Précise ses besoins en eau, lumière, nutriments et substrat.\n3. Conseils d'entretien : Donne des instructions pour l'arrosage, la fertilisation et la taille.\n4. Améliorations recommandées : Suggère des actions pour optimiser sa croissance et sa santé.\nRéponds en français de manière structurée."
 
 
 
 
168
  },
169
  "en": {
170
  "title": "🌱 AgriLens AI - Plant Analysis Assistant",
@@ -230,7 +243,11 @@ def t(key):
230
  "please_enter_description_warning": "⚠️ Please enter a description of your plant's symptoms.",
231
  "default_prompt_full_diagnosis": "<image>\nAnalyze this plant image and provide a comprehensive diagnosis:\n1. **Overall Plant Health:** Describe its general appearance and vitality.\n2. **Problem Identification:** List visible diseases, pests, or deficiencies.\n3. **Probable Diagnosis:** Indicate the most likely disease or problem.\n4. **Possible Causes:** Explain what might have caused this issue.\n5. **Treatment Recommendations:** Propose concrete and appropriate solutions.\n6. **Preventive Advice:** Give tips to avoid the problem from recurring.\nRespond in a structured and clear manner in English.",
232
  "default_prompt_disease_id": "<image>\nDiagnose this plant focusing on diseases and pests:\n1. Identify visual symptoms specific to diseases or pests.\n2. Determine the most likely disease or pest.\n3. Explain the conditions that favor their development.\n4. Propose targeted treatments and control methods.\nRespond in a structured manner in English.",
233
- "default_prompt_care_advice": "<image>\nAnalyze this plant and provide detailed care advice:\n1. Overall plant condition: Assess its current health.\n2. Specific needs: Specify its requirements for water, light, nutrients, and substrate.\n3. Maintenance tips: Give instructions for watering, fertilizing, and pruning.\n4. Recommended improvements: Suggest actions to optimize its growth and health.\nRespond in a structured manner in English."
 
 
 
 
234
  }
235
  }
236
  return translations[st.session_state.language].get(key, key)
@@ -253,12 +270,14 @@ def load_model_and_processor_cached():
253
  Charge le modèle Gemma 3n et son processeur associé depuis Hugging Face Hub.
254
  Cette fonction est mise en cache par Streamlit pour des chargements plus rapides.
255
  """
 
 
256
  st.info("🔍 Diagnostic de l'environnement avant chargement...")
257
  issues = diagnose_loading_issues()
258
  if issues:
259
  with st.expander("📊 Diagnostic système", expanded=False):
260
  for issue in issues:
261
- st.write(issue)
262
 
263
  gc.collect() # Nettoyage de la mémoire
264
  if torch.cuda.is_available():
@@ -272,13 +291,19 @@ def load_model_and_processor_cached():
272
  # Configuration du torch_dtype pour une meilleure efficacité sur GPU
273
  torch_dtype = torch.bfloat16 if st.session_state.device == "cuda" else torch.float32
274
 
275
- processor = AutoProcessor.from_pretrained(MODEL_ID_HF, trust_remote_code=True)
 
 
 
 
 
276
  model = Gemma3nForConditionalGeneration.from_pretrained(
277
  MODEL_ID_HF,
278
  torch_dtype=torch_dtype,
279
  trust_remote_code=True,
280
  low_cpu_mem_usage=True, # Tente de réduire l'utilisation CPU pendant le chargement
281
- device_map=device_map
 
282
  )
283
  return model, processor
284
 
@@ -420,6 +445,16 @@ with st.sidebar:
420
 
421
  st.divider()
422
 
 
 
 
 
 
 
 
 
 
 
423
  # Statut du Modèle IA et Bouton de chargement
424
  st.header(t("model_status"))
425
  if st.session_state.model_loaded and check_model_health():
@@ -505,16 +540,16 @@ with tab1:
505
  )
506
  if uploaded_file is not None:
507
  # Validation manuelle de la taille du fichier après upload
508
- MAX_FILE_SIZE_MB = 10
509
- if uploaded_file.size > MAX_FILE_SIZE_MB * 1024 * 1024:
510
  st.error(t("file_too_large_error"))
511
  uploaded_file = None # Invalide le fichier s'il est trop grand
512
  elif uploaded_file.size == 0:
513
  st.error(t("empty_file_error"))
514
  uploaded_file = None # Invalide le fichier s'il est vide
515
  # L'avertissement original pour les fichiers "très volumineux" reste
516
- # if uploaded_file is not None and uploaded_file.size > 10 * 1024 * 1024:
517
- # st.warning(t("file_size_warning")) # Ceci est plus un conseil
518
 
519
  else: # Webcam Capture
520
  st.markdown(f"**{t('webcam_capture_label')}**")
@@ -527,11 +562,13 @@ with tab1:
527
  image_to_analyze = Image.open(uploaded_file)
528
  except Exception as e:
529
  st.error(f"{t('image_processing_error')} {e}")
 
530
  elif captured_image is not None:
531
  try:
532
  image_to_analyze = Image.open(captured_image)
533
  except Exception as e:
534
  st.error(f"{t('image_capture_processing_error')} {e}")
 
535
 
536
  if image_to_analyze is not None:
537
  original_size = image_to_analyze.size
@@ -668,11 +705,12 @@ with tab4:
668
  - **Modèle IA :** Google Gemma 3n E4B IT, un modèle multimodal performant pour l'analyse de plantes. ([Voir sur Hugging Face](https://huggingface.co/google/gemma-3n-E4B-it))
669
  - **Bibliothèques :** `transformers`, `torch`, `streamlit`, `Pillow`, `psutil`, `requests`, `huggingface-hub`.
670
  ### 📝 Comment Utiliser AgriLens AI :
671
- 1. **Chargez le Modèle IA :** Dans la barre latérale, cliquez sur "Charger le Modèle IA". Attendez que le statut passe à "Chargé et fonctionnel". Cela peut prendre quelques minutes.
672
- 2. **Analysez votre Plante :**
 
673
  - **Via Image :** Allez à l'onglet "📸 Analyse d'Image". Uploadez une photo de votre plante ou utilisez votre webcam. Choisissez le type d'analyse et cliquez sur "Analyser l'image".
674
  - **Via Texte :** Allez à l'onglet "📝 Analyse de Texte". Décrivez les symptômes de votre plante dans la zone de texte et cliquez sur "Analyser la description".
675
- 3. **Interprétez les Résultats :** Lisez attentivement le diagnostic, les causes probables, et les recommandations fournies par l'IA.
676
  ### 🔧 Support et Optimisation :
677
  - **Gestion des Ressources :** Le modèle nécessite une quantité significative de RAM et idéalement un GPU pour des performances optimales. L'application s'adapte à votre environnement (CPU/GPU).
678
  - **Performance :** Les temps de réponse dépendent de votre matériel. Un GPU est fortement recommandé pour une expérience fluide.
 
3
  import gc
4
  import time
5
  import psutil
6
+ import os # Pour accéder aux variables d'environnement
7
  from transformers import AutoProcessor, Gemma3nForConditionalGeneration
8
  from PIL import Image
9
+ from huggingface_hub import HfFolder # Pour vérifier si un token est déjà configuré
10
 
11
  # --- Configuration de la Page ---
12
  st.set_page_config(
 
33
  st.session_state.load_attempt_count = 0
34
  if 'device' not in st.session_state:
35
  st.session_state.device = "cpu"
36
+ if 'hf_token_configured' not in st.session_state:
37
+ st.session_state.hf_token_configured = False
38
+
39
 
40
  # --- Fonctions d'Aide Système ---
41
 
 
52
  """Diagnostique les problèmes potentiels avant le chargement du modèle."""
53
  issues = []
54
 
55
+ # Vérification du token Hugging Face
56
+ if not st.session_state.hf_token_configured:
57
+ issues.append("⚠️ **Jeton Hugging Face (HF_TOKEN) non configuré.** Le chargement de certains modèles pourrait échouer ou être ralenti à cause des limites de débit. Voir la section Configuration.")
58
+
59
  try:
60
  ram = psutil.virtual_memory()
61
  ram_gb = ram.total / (1024**3)
 
173
  "please_enter_description_warning": "⚠️ Veuillez entrer une description des symptômes de votre plante.",
174
  "default_prompt_full_diagnosis": "<image>\nAnalyse cette image de plante et fournis un diagnostic complet :\n1. **État général de la plante :** Décris son apparence globale et sa vitalité.\n2. **Identification des problèmes :** Liste les maladies, parasites ou carences visibles.\n3. **Diagnostic probable :** Indique la maladie ou le problème le plus probable.\n4. **Causes possibles :** Explique ce qui a pu causer ce problème.\n5. **Recommandations de traitement :** Propose des solutions concrètes et adaptées.\n6. **Conseils préventifs :** Donne des astuces pour éviter que le problème ne revienne.\nRéponds de manière structurée et claire en français.",
175
  "default_prompt_disease_id": "<image>\nDiagnostique cette plante en te concentrant sur les maladies et parasites :\n1. Identifie les symptômes visuels spécifiques aux maladies ou parasites.\n2. Détermine la maladie ou le parasite le plus probable.\n3. Explique les conditions favorisant leur développement.\n4. Propose des traitements ciblés et des méthodes de lutte.\nRéponds en français de manière structurée.",
176
+ "default_prompt_care_advice": "<image>\nAnalyse cette plante et donne des conseils de soins détaillés :\n1. État général de la plante : Évalue sa santé actuelle.\n2. Besoins spécifiques : Précise ses besoins en eau, lumière, nutriments et substrat.\n3. Conseils d'entretien : Donne des instructions pour l'arrosage, la fertilisation et la taille.\n4. Améliorations recommandées : Suggère des actions pour optimiser sa croissance et sa santé.\nRéponds en français de manière structurée.",
177
+ "hf_token_status": "Statut du jeton Hugging Face :",
178
+ "hf_token_found": "✅ Jeton trouvé (HF_TOKEN configuré)",
179
+ "hf_token_not_found": "❌ Aucun jeton (HF_TOKEN) trouvé",
180
+ "hf_token_info": "Pour un accès fiable aux modèles Hugging Face, il est recommandé de configurer un jeton d'accès personnel (avec droits de lecture) dans la variable d'environnement `HF_TOKEN`. Vous pouvez le créer dans vos paramètres Hugging Face > Access Tokens."
181
  },
182
  "en": {
183
  "title": "🌱 AgriLens AI - Plant Analysis Assistant",
 
243
  "please_enter_description_warning": "⚠️ Please enter a description of your plant's symptoms.",
244
  "default_prompt_full_diagnosis": "<image>\nAnalyze this plant image and provide a comprehensive diagnosis:\n1. **Overall Plant Health:** Describe its general appearance and vitality.\n2. **Problem Identification:** List visible diseases, pests, or deficiencies.\n3. **Probable Diagnosis:** Indicate the most likely disease or problem.\n4. **Possible Causes:** Explain what might have caused this issue.\n5. **Treatment Recommendations:** Propose concrete and appropriate solutions.\n6. **Preventive Advice:** Give tips to avoid the problem from recurring.\nRespond in a structured and clear manner in English.",
245
  "default_prompt_disease_id": "<image>\nDiagnose this plant focusing on diseases and pests:\n1. Identify visual symptoms specific to diseases or pests.\n2. Determine the most likely disease or pest.\n3. Explain the conditions that favor their development.\n4. Propose targeted treatments and control methods.\nRespond in a structured manner in English.",
246
+ "default_prompt_care_advice": "<image>\nAnalyze this plant and provide detailed care advice:\n1. Overall plant condition: Assess its current health.\n2. Specific needs: Specify its requirements for water, light, nutrients, and substrate.\n3. Maintenance tips: Give instructions for watering, fertilizing, and pruning.\n4. Recommended improvements: Suggest actions to optimize its growth and health.\nRespond in a structured manner in English.",
247
+ "hf_token_status": "Hugging Face Token Status:",
248
+ "hf_token_found": "✅ Token found (HF_TOKEN configured)",
249
+ "hf_token_not_found": "❌ No token (HF_TOKEN) found",
250
+ "hf_token_info": "For reliable access to Hugging Face models, it is recommended to configure a personal access token (with read rights) in the `HF_TOKEN` environment variable. You can create it in your Hugging Face settings > Access Tokens."
251
  }
252
  }
253
  return translations[st.session_state.language].get(key, key)
 
270
  Charge le modèle Gemma 3n et son processeur associé depuis Hugging Face Hub.
271
  Cette fonction est mise en cache par Streamlit pour des chargements plus rapides.
272
  """
273
+ st.session_state.hf_token_configured = HfFolder.get_token() is not None or "HF_TOKEN" in os.environ
274
+
275
  st.info("🔍 Diagnostic de l'environnement avant chargement...")
276
  issues = diagnose_loading_issues()
277
  if issues:
278
  with st.expander("📊 Diagnostic système", expanded=False):
279
  for issue in issues:
280
+ st.markdown(issue) # Utiliser markdown pour les icônes
281
 
282
  gc.collect() # Nettoyage de la mémoire
283
  if torch.cuda.is_available():
 
291
  # Configuration du torch_dtype pour une meilleure efficacité sur GPU
292
  torch_dtype = torch.bfloat16 if st.session_state.device == "cuda" else torch.float32
293
 
294
+ # Utilisez le token si configuré
295
+ hf_token = os.environ.get("HF_TOKEN") # Récupère le token de l'environnement
296
+ if hf_token:
297
+ st.info("Authentification avec HF_TOKEN...")
298
+
299
+ processor = AutoProcessor.from_pretrained(MODEL_ID_HF, trust_remote_code=True, token=hf_token)
300
  model = Gemma3nForConditionalGeneration.from_pretrained(
301
  MODEL_ID_HF,
302
  torch_dtype=torch_dtype,
303
  trust_remote_code=True,
304
  low_cpu_mem_usage=True, # Tente de réduire l'utilisation CPU pendant le chargement
305
+ device_map=device_map,
306
+ token=hf_token # Passe le token au modèle
307
  )
308
  return model, processor
309
 
 
445
 
446
  st.divider()
447
 
448
+ # Statut du Jeton Hugging Face
449
+ st.subheader(t("hf_token_status"))
450
+ if st.session_state.hf_token_configured:
451
+ st.success(t("hf_token_found"))
452
+ else:
453
+ st.warning(t("hf_token_not_found"))
454
+ st.info(t("hf_token_info"))
455
+
456
+ st.divider()
457
+
458
  # Statut du Modèle IA et Bouton de chargement
459
  st.header(t("model_status"))
460
  if st.session_state.model_loaded and check_model_health():
 
540
  )
541
  if uploaded_file is not None:
542
  # Validation manuelle de la taille du fichier après upload
543
+ MAX_FILE_SIZE_BYTES = 10 * 1024 * 1024 # 10 MB
544
+ if uploaded_file.size > MAX_FILE_SIZE_BYTES:
545
  st.error(t("file_too_large_error"))
546
  uploaded_file = None # Invalide le fichier s'il est trop grand
547
  elif uploaded_file.size == 0:
548
  st.error(t("empty_file_error"))
549
  uploaded_file = None # Invalide le fichier s'il est vide
550
  # L'avertissement original pour les fichiers "très volumineux" reste
551
+ elif uploaded_file.size > (MAX_FILE_SIZE_BYTES * 0.8): # Warn if > 8MB for example
552
+ st.warning(t("file_size_warning"))
553
 
554
  else: # Webcam Capture
555
  st.markdown(f"**{t('webcam_capture_label')}**")
 
562
  image_to_analyze = Image.open(uploaded_file)
563
  except Exception as e:
564
  st.error(f"{t('image_processing_error')} {e}")
565
+ image_to_analyze = None # Assurez-vous que l'image est None en cas d'erreur
566
  elif captured_image is not None:
567
  try:
568
  image_to_analyze = Image.open(captured_image)
569
  except Exception as e:
570
  st.error(f"{t('image_capture_processing_error')} {e}")
571
+ image_to_analyze = None # Assurez-vous que l'image est None en cas d'erreur
572
 
573
  if image_to_analyze is not None:
574
  original_size = image_to_analyze.size
 
705
  - **Modèle IA :** Google Gemma 3n E4B IT, un modèle multimodal performant pour l'analyse de plantes. ([Voir sur Hugging Face](https://huggingface.co/google/gemma-3n-E4B-it))
706
  - **Bibliothèques :** `transformers`, `torch`, `streamlit`, `Pillow`, `psutil`, `requests`, `huggingface-hub`.
707
  ### 📝 Comment Utiliser AgriLens AI :
708
+ 1. **Configurez votre Jeton Hugging Face (Recommandé) :** Avant de démarrer l'application, définissez la variable d'environnement `HF_TOKEN` avec un jeton d'accès personnel de Hugging Face. Cela permet un accès plus fiable aux modèles.
709
+ 2. **Chargez le Modèle IA :** Dans la barre latérale, cliquez sur "Charger le Modèle IA". Attendez que le statut passe à "Chargé et fonctionnel". Cela peut prendre quelques minutes.
710
+ 3. **Analysez votre Plante :**
711
  - **Via Image :** Allez à l'onglet "📸 Analyse d'Image". Uploadez une photo de votre plante ou utilisez votre webcam. Choisissez le type d'analyse et cliquez sur "Analyser l'image".
712
  - **Via Texte :** Allez à l'onglet "📝 Analyse de Texte". Décrivez les symptômes de votre plante dans la zone de texte et cliquez sur "Analyser la description".
713
+ 4. **Interprétez les Résultats :** Lisez attentivement le diagnostic, les causes probables, et les recommandations fournies par l'IA.
714
  ### 🔧 Support et Optimisation :
715
  - **Gestion des Ressources :** Le modèle nécessite une quantité significative de RAM et idéalement un GPU pour des performances optimales. L'application s'adapte à votre environnement (CPU/GPU).
716
  - **Performance :** Les temps de réponse dépendent de votre matériel. Un GPU est fortement recommandé pour une expérience fluide.