Spaces:
Running
Running
Update src/streamlit_app_stable.py
#4
by
sido1991
- opened
- 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.
|
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 |
-
|
|
|
|
|
|
|
|
|
|
|
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 |
-
|
509 |
-
if uploaded_file.size >
|
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 |
-
|
517 |
-
|
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. **
|
672 |
-
2. **
|
|
|
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 |
-
|
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.
|