Spaces:
				
			
			
	
			
			
		Sleeping
		
	
	
	
			
			
	
	
	
	
		
		
		Sleeping
		
	| import streamlit as st | |
| import os | |
| import io | |
| from PIL import Image | |
| import random | |
| from transformers import pipeline | |
| import torch | |
| import traceback | |
| # Configuration de la page | |
| st.set_page_config( | |
| page_title="AgriLens AI - Diagnostic des Plantes", | |
| page_icon="🌱", | |
| layout="centered", | |
| initial_sidebar_state="collapsed" | |
| ) | |
| # CSS pour mobile | |
| st.markdown(""" | |
| <style> | |
| @media (max-width: 600px) { | |
| .main { | |
| max-width: 100vw !important; | |
| padding: 0.5rem !important; | |
| } | |
| .stButton button, .stTextInput input, .stTextArea textarea { | |
| width: 100% !important; | |
| font-size: 1.1rem !important; | |
| } | |
| .stSidebar { | |
| width: 100vw !important; | |
| min-width: 100vw !important; | |
| } | |
| .result-box { | |
| font-size: 1.05rem !important; | |
| } | |
| .stMarkdown, .stHeader, .stSubheader { | |
| font-size: 1.1rem !important; | |
| } | |
| .stFileUploader, .stImage { | |
| width: 100% !important; | |
| } | |
| } | |
| </style> | |
| """, unsafe_allow_html=True) | |
| # Initialisation des variables de session | |
| if 'gemma_model' not in st.session_state: | |
| st.session_state.gemma_model = None | |
| if 'gemma_model_status' not in st.session_state: | |
| st.session_state.gemma_model_status = "Non chargé" | |
| def get_hf_gemma_multimodal(): | |
| """Charge le modèle Gemma 3n depuis Hugging Face""" | |
| try: | |
| st.info("Chargement du modèle multimodal Gemma 3n depuis Hugging Face...") | |
| # Utiliser le modèle distant de Hugging Face | |
| model_name = "google/gemma-3n-e2b-it" | |
| pipe = pipeline( | |
| "image-text-to-text", | |
| model=model_name, | |
| device=-1, # Forcer le CPU | |
| torch_dtype=torch.float32, | |
| ) | |
| st.success(f"Modèle Gemma multimodal chargé : {pipe}") | |
| return pipe | |
| except Exception as e: | |
| st.error(f"Erreur lors du chargement du modèle Gemma multimodal : {e}") | |
| st.error(traceback.format_exc()) | |
| return None | |
| def analyze_image_hf(image, prompt=""): | |
| """Analyse une image avec le modèle multimodal Gemma 3n distant""" | |
| if st.session_state.gemma_model is None: | |
| return "❌ Modèle non chargé. Veuillez le charger dans les réglages." | |
| try: | |
| pipe = st.session_state.gemma_model | |
| messages = [ | |
| { | |
| "role": "system", | |
| "content": [ | |
| {"type": "text", "text": "Tu es un assistant agricole expert en diagnostic de maladies de plantes. Donne des réponses claires et structurées."} | |
| ] | |
| }, | |
| { | |
| "role": "user", | |
| "content": [ | |
| {"type": "image", "image": image.convert("RGB")}, | |
| {"type": "text", "text": prompt or "Décris la maladie présente sur cette plante et donne des recommandations pratiques."} | |
| ] | |
| } | |
| ] | |
| # Paramètres de génération améliorés | |
| result = pipe( | |
| text=messages, | |
| max_new_tokens=400, | |
| do_sample=True, | |
| temperature=0.7, | |
| top_p=0.9, | |
| repetition_penalty=1.1, | |
| pad_token_id=pipe.tokenizer.eos_token_id | |
| ) | |
| if isinstance(result, list) and "generated_text" in result[0]: | |
| response = result[0]["generated_text"] | |
| # Nettoyage de la réponse | |
| if response and len(response.strip()) > 0: | |
| # Vérifier si la réponse contient déjà des recommandations | |
| if "recommandation" not in response.lower() and "action" not in response.lower(): | |
| response += "\n\n**Recommandations ou actions urgentes :**\n• Isolez la plante malade si possible\n• Appliquez un traitement adapté\n• Surveillez les autres plantes\n• Consultez un expert si nécessaire" | |
| return response | |
| else: | |
| return "❌ Erreur : Réponse vide du modèle" | |
| return str(result) | |
| except Exception as e: | |
| return f"❌ Erreur lors de l'analyse d'image : {e}" | |
| def analyze_text_hf(text): | |
| """Analyse un texte avec le modèle Gemma 3n distant""" | |
| if st.session_state.gemma_model is None: | |
| return "❌ Modèle non chargé. Veuillez le charger dans les réglages." | |
| try: | |
| pipe = st.session_state.gemma_model | |
| messages = [ | |
| { | |
| "role": "system", | |
| "content": [ | |
| {"type": "text", "text": "Tu es un assistant agricole expert. Donne des conseils pratiques et structurés."} | |
| ] | |
| }, | |
| { | |
| "role": "user", | |
| "content": [ | |
| {"type": "text", "text": text} | |
| ] | |
| } | |
| ] | |
| result = pipe( | |
| text=messages, | |
| max_new_tokens=300, | |
| do_sample=True, | |
| temperature=0.7, | |
| top_p=0.9 | |
| ) | |
| if isinstance(result, list) and "generated_text" in result[0]: | |
| return result[0]["generated_text"] | |
| return str(result) | |
| except Exception as e: | |
| return f"❌ Erreur lors de l'analyse de texte : {e}" | |
| # Interface principale | |
| st.title("🌱 AgriLens AI - Diagnostic des Plantes") | |
| st.markdown("**Application de diagnostic des maladies de plantes avec IA**") | |
| # Sidebar pour le chargement du modèle | |
| with st.sidebar: | |
| st.header("⚙️ Configuration") | |
| if st.button("Charger le modèle Gemma 3n multimodal (Hugging Face)", type="primary"): | |
| with st.spinner("Chargement du modèle..."): | |
| st.session_state.gemma_model = get_hf_gemma_multimodal() | |
| if st.session_state.gemma_model: | |
| st.session_state.gemma_model_status = "✅ Chargé" | |
| st.success("Modèle chargé avec succès !") | |
| else: | |
| st.session_state.gemma_model_status = "❌ Erreur" | |
| st.error("Échec du chargement du modèle") | |
| st.info(f"**Statut du modèle :** {st.session_state.gemma_model_status}") | |
| # Onglets principaux | |
| tab1, tab2, tab3 = st.tabs(["📸 Analyse d'Image", "💬 Analyse de Texte", "ℹ️ À propos"]) | |
| with tab1: | |
| st.header("🔍 Diagnostic par Image") | |
| st.markdown("Téléchargez une photo de plante malade pour obtenir un diagnostic") | |
| uploaded_file = st.file_uploader( | |
| "Choisissez une image...", | |
| type=['png', 'jpg', 'jpeg'], | |
| help="Formats acceptés : PNG, JPG, JPEG" | |
| ) | |
| if uploaded_file is not None: | |
| image = Image.open(uploaded_file) | |
| # Affichage de l'image | |
| col1, col2 = st.columns([1, 1]) | |
| with col1: | |
| st.image(image, caption="Image uploadée", use_container_width=True) | |
| with col2: | |
| st.markdown("**Informations de l'image :**") | |
| st.write(f"• Format : {image.format}") | |
| st.write(f"• Taille : {image.size[0]}x{image.size[1]} pixels") | |
| st.write(f"• Mode : {image.mode}") | |
| # Question spécifique | |
| question = st.text_area( | |
| "Question spécifique (optionnel) :", | |
| placeholder="Ex: Quelle est cette maladie ? Que faire pour la traiter ?", | |
| height=100 | |
| ) | |
| # Bouton d'analyse | |
| if st.button("🔬 Analyser avec l'IA Hugging Face", disabled=st.session_state.gemma_model is None, type="primary"): | |
| if st.session_state.gemma_model is None: | |
| st.error("❌ Veuillez d'abord charger le modèle dans les réglages") | |
| else: | |
| with st.spinner("🔍 Analyse en cours..."): | |
| result = analyze_image_hf(image, question) | |
| st.markdown("## 📊 Résultats de l'Analyse") | |
| st.markdown("---") | |
| st.markdown(result) | |
| with tab2: | |
| st.header("💬 Diagnostic par Texte") | |
| st.markdown("Décrivez les symptômes de votre plante pour obtenir des conseils") | |
| text_input = st.text_area( | |
| "Description des symptômes :", | |
| placeholder="Ex: Mes tomates ont des taches brunes sur les feuilles et les fruits...", | |
| height=150 | |
| ) | |
| if st.button("🧠 Analyser avec l'IA Hugging Face", disabled=st.session_state.gemma_model is None, type="primary"): | |
| if st.session_state.gemma_model is None: | |
| st.error("❌ Veuillez d'abord charger le modèle dans les réglages") | |
| elif not text_input.strip(): | |
| st.error("❌ Veuillez saisir une description") | |
| else: | |
| with st.spinner("🔍 Analyse en cours..."): | |
| result = analyze_text_hf(text_input) | |
| st.markdown("## 📊 Résultats de l'Analyse") | |
| st.markdown("---") | |
| st.markdown(result) | |
| with tab3: | |
| st.header("ℹ️ À propos d'AgriLens AI") | |
| st.markdown(""" | |
| ### 🌱 Notre Mission | |
| AgriLens AI est une application de diagnostic des maladies de plantes utilisant l'intelligence artificielle | |
| pour aider les agriculteurs à identifier et traiter les problèmes de leurs cultures. | |
| ### 🚀 Fonctionnalités | |
| - **Analyse d'images** : Diagnostic visuel des maladies | |
| - **Analyse de texte** : Conseils basés sur les descriptions | |
| - **Recommandations pratiques** : Actions concrètes à entreprendre | |
| - **Interface mobile** : Optimisée pour smartphones et tablettes | |
| ### 🔧 Technologie | |
| - **Modèle** : Gemma 3n multimodal (Google) | |
| - **Framework** : Streamlit | |
| - **Déploiement** : Streamlit Cloud | |
| ### ⚠️ Avertissement | |
| Les résultats fournis sont à titre indicatif uniquement. | |
| Pour un diagnostic professionnel, consultez un expert qualifié. | |
| ### 📞 Support | |
| Pour toute question ou problème, consultez la documentation ou contactez l'équipe de développement. | |
| """) | |
| # Footer | |
| st.markdown("---") | |
| st.markdown("*AgriLens AI - Diagnostic intelligent des plantes avec IA*") |