Spaces:
Sleeping
Sleeping
feat: Ajout de la version Streamlit Cloud avec modèle Hugging Face distant
Browse files- .streamlit/config.toml +13 -3
- README.md +113 -54
- requirements.txt +12 -6
- streamlit_app.py +278 -0
.streamlit/config.toml
CHANGED
|
@@ -1,7 +1,17 @@
|
|
|
|
|
|
|
|
|
|
|
| 1 |
[server]
|
| 2 |
headless = true
|
| 3 |
-
|
| 4 |
-
|
|
|
|
| 5 |
|
| 6 |
[browser]
|
| 7 |
-
gatherUsageStats = false
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
[global]
|
| 2 |
+
developmentMode = false
|
| 3 |
+
|
| 4 |
[server]
|
| 5 |
headless = true
|
| 6 |
+
enableCORS = true
|
| 7 |
+
enableXsrfProtection = true
|
| 8 |
+
port = 8501
|
| 9 |
|
| 10 |
[browser]
|
| 11 |
+
gatherUsageStats = false
|
| 12 |
+
|
| 13 |
+
[theme]
|
| 14 |
+
primaryColor = "#00FF00"
|
| 15 |
+
backgroundColor = "#FFFFFF"
|
| 16 |
+
secondaryBackgroundColor = "#F0F2F6"
|
| 17 |
+
textColor = "#262730"
|
README.md
CHANGED
|
@@ -5,54 +5,63 @@ colorFrom: green
|
|
| 5 |
colorTo: yellow
|
| 6 |
sdk: docker
|
| 7 |
sdk_version: "1.0.0"
|
| 8 |
-
app_file: src/
|
| 9 |
pinned: false
|
| 10 |
---
|
| 11 |
|
| 12 |
# AgriLens AI 🌱
|
| 13 |
|
| 14 |
-
Application de diagnostic des maladies des plantes utilisant le modèle Gemma 3n de Google.
|
| 15 |
-
|
| 16 |
-
## Fonctionnalités
|
| 17 |
-
- Analyse d'images de plantes
|
| 18 |
-
-
|
| 19 |
-
- Recommandations
|
| 20 |
-
|
| 21 |
-
|
| 22 |
-
|
| 23 |
-
|
| 24 |
-
|
| 25 |
-
|
| 26 |
-
|
| 27 |
-
|
| 28 |
-
|
| 29 |
-
|
| 30 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 31 |
Les résultats fournis sont à titre indicatif uniquement. Pour un diagnostic médical ou agricole professionnel, veuillez consulter un expert qualifié.
|
| 32 |
|
| 33 |
-
## Développement
|
| 34 |
-
- Framework: Streamlit
|
| 35 |
-
- Modèle:
|
| 36 |
-
-
|
|
|
|
|
|
|
| 37 |
|
| 38 |
---
|
| 39 |
|
| 40 |
## 🇫🇷 Installation rapide
|
| 41 |
1. **Téléchargez ou clonez ce dépôt**
|
| 42 |
-
2. **Placez le
|
| 43 |
3. **Ouvrez un terminal dans le dossier du projet**
|
| 44 |
-
4. **Exécutez le script d
|
| 45 |
```powershell
|
| 46 |
python install_agrilens.py
|
| 47 |
```
|
| 48 |
-
5. **Lancez l
|
| 49 |
```powershell
|
| 50 |
-
streamlit run src/
|
| 51 |
```
|
| 52 |
|
| 53 |
## 🇬🇧 Quick install
|
| 54 |
1. **Download or clone this repo**
|
| 55 |
-
2. **Place the Gemma 3n model
|
| 56 |
3. **Open a terminal in the project folder**
|
| 57 |
4. **Run the auto-install script**:
|
| 58 |
```powershell
|
|
@@ -60,63 +69,113 @@ Les résultats fournis sont à titre indicatif uniquement. Pour un diagnostic m
|
|
| 60 |
```
|
| 61 |
5. **Launch the app**:
|
| 62 |
```powershell
|
| 63 |
-
streamlit run src/
|
| 64 |
```
|
| 65 |
|
| 66 |
---
|
| 67 |
|
| 68 |
-
## 🇫🇷
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 69 |
Le script `install_agrilens.py` :
|
| 70 |
-
- Crée l
|
| 71 |
- Installe toutes les dépendances (`requirements.txt`)
|
| 72 |
-
- Vérifie la présence du modèle
|
| 73 |
- Affiche les instructions de lancement
|
| 74 |
|
| 75 |
## 🇬🇧 Auto-install script
|
| 76 |
The `install_agrilens.py` script:
|
| 77 |
- Creates the virtual environment if needed
|
| 78 |
- Installs all dependencies (`requirements.txt`)
|
| 79 |
-
- Checks for the model
|
| 80 |
- Shows launch instructions
|
| 81 |
|
| 82 |
---
|
| 83 |
|
| 84 |
-
## 🇫🇷 Modes de fonctionnement
|
| 85 |
|
| 86 |
-
|
|
| 87 |
|-------------------|---------------------------------------|------------------|---------------------|-----------|
|
| 88 |
-
| Local (offline)
|
| 89 |
-
| Hugging Face (token HF) | google/gemma-3n-E2B-it (API HF) | Oui
|
| 90 |
-
| Hugging Face (public) | Aucun (mode démo) | Non
|
| 91 |
|
| 92 |
### Instructions
|
| 93 |
-
- **Local (offline)** :
|
| 94 |
-
- Placez le modèle
|
| 95 |
-
- Lancez
|
| 96 |
- Aucun accès Internet requis
|
|
|
|
| 97 |
- **Hugging Face (inférence réelle)** :
|
| 98 |
-
- Ajoutez la variable d
|
| 99 |
-
- Acceptez les conditions d
|
| 100 |
- Utilisez un Space GPU pour de meilleures performances
|
| 101 |
- **Hugging Face (mode démo)** :
|
| 102 |
-
- Si aucun token n
|
| 103 |
|
| 104 |
-
## 🇬🇧
|
| 105 |
|
| 106 |
-
|
|
| 107 |
|-------------------|---------------------------------------|------------------|---------------------|-----------|
|
| 108 |
-
| Local (offline)
|
| 109 |
-
| Hugging Face (HF token) | google/gemma-3n-E2B-it (HF API) | Yes
|
| 110 |
-
| Hugging Face (public) | None (demo mode) | No
|
| 111 |
|
| 112 |
### Instructions
|
| 113 |
-
- **Local (offline)** :
|
| 114 |
-
- Put the
|
| 115 |
-
- Launch
|
| 116 |
- No Internet required
|
|
|
|
| 117 |
- **Hugging Face (real inference)** :
|
| 118 |
-
- Add the `HF_TOKEN` environment variable
|
| 119 |
-
- Accept the model terms
|
| 120 |
- Use a GPU Space for best performance
|
| 121 |
- **Hugging Face (demo mode)** :
|
| 122 |
-
- If no token is present,
|
|
|
|
| 5 |
colorTo: yellow
|
| 6 |
sdk: docker
|
| 7 |
sdk_version: "1.0.0"
|
| 8 |
+
app_file: src/streamlit_app_local_models.py
|
| 9 |
pinned: false
|
| 10 |
---
|
| 11 |
|
| 12 |
# AgriLens AI 🌱
|
| 13 |
|
| 14 |
+
Application de diagnostic des maladies des plantes utilisant le modèle Gemma 3n multimodal de Google en mode local.
|
| 15 |
+
|
| 16 |
+
## ✨ Fonctionnalités principales
|
| 17 |
+
- **Analyse d'images de plantes** avec IA locale
|
| 18 |
+
- **Diagnostic automatique** des maladies et problèmes
|
| 19 |
+
- **Recommandations pratiques** avec section "Actions urgentes"
|
| 20 |
+
- **Interface mobile** optimisée pour les agriculteurs
|
| 21 |
+
- **Modèle multimodal** : analyse image + texte simultanément
|
| 22 |
+
- **Mode 100% offline** - aucune connexion Internet requise
|
| 23 |
+
|
| 24 |
+
## 🚀 Comment utiliser
|
| 25 |
+
1. **Chargez le modèle** : Cliquez sur "Charger le modèle Gemma 3n multimodal" dans la sidebar
|
| 26 |
+
2. **Téléchargez une photo** de plante malade
|
| 27 |
+
3. **Posez une question** spécifique (optionnel)
|
| 28 |
+
4. **Cliquez sur "Analyser avec l'IA Locale"**
|
| 29 |
+
5. **Consultez le diagnostic** et les recommandations
|
| 30 |
+
|
| 31 |
+
## 💻 Configuration requise
|
| 32 |
+
- **Hardware** : CPU (GPU optionnel)
|
| 33 |
+
- **Espace disque** : 20GB+ (pour le modèle Gemma 3n)
|
| 34 |
+
- **Mémoire RAM** : 8GB minimum recommandé
|
| 35 |
+
- **Système** : Windows 10/11, Linux, macOS
|
| 36 |
+
|
| 37 |
+
## ⚠️ Avertissement
|
| 38 |
Les résultats fournis sont à titre indicatif uniquement. Pour un diagnostic médical ou agricole professionnel, veuillez consulter un expert qualifié.
|
| 39 |
|
| 40 |
+
## 🔧 Développement
|
| 41 |
+
- **Framework** : Streamlit
|
| 42 |
+
- **Modèle** : Gemma 3n multimodal (local)
|
| 43 |
+
- **Génération** : Paramètres optimisés (temperature=0.7, top_p=0.9)
|
| 44 |
+
- **Interface** : Responsive design mobile-first
|
| 45 |
+
- **Dernière mise à jour** : Juillet 2025
|
| 46 |
|
| 47 |
---
|
| 48 |
|
| 49 |
## 🇫🇷 Installation rapide
|
| 50 |
1. **Téléchargez ou clonez ce dépôt**
|
| 51 |
+
2. **Placez le modèle Gemma 3n dans `D:/Dev/model_gemma`** (ou modifiez le chemin dans le code)
|
| 52 |
3. **Ouvrez un terminal dans le dossier du projet**
|
| 53 |
+
4. **Exécutez le script d'installation automatique** :
|
| 54 |
```powershell
|
| 55 |
python install_agrilens.py
|
| 56 |
```
|
| 57 |
+
5. **Lancez l'application** :
|
| 58 |
```powershell
|
| 59 |
+
streamlit run src/streamlit_app_local_models.py
|
| 60 |
```
|
| 61 |
|
| 62 |
## 🇬🇧 Quick install
|
| 63 |
1. **Download or clone this repo**
|
| 64 |
+
2. **Place the Gemma 3n model in `D:/Dev/model_gemma`** (or modify the path in the code)
|
| 65 |
3. **Open a terminal in the project folder**
|
| 66 |
4. **Run the auto-install script**:
|
| 67 |
```powershell
|
|
|
|
| 69 |
```
|
| 70 |
5. **Launch the app**:
|
| 71 |
```powershell
|
| 72 |
+
streamlit run src/streamlit_app_local_models.py
|
| 73 |
```
|
| 74 |
|
| 75 |
---
|
| 76 |
|
| 77 |
+
## 🇫🇷 Nouvelles fonctionnalités (v2.0)
|
| 78 |
+
|
| 79 |
+
### 🎯 Modèle multimodal local
|
| 80 |
+
- **Gemma 3n multimodal** : Analyse simultanée image + texte
|
| 81 |
+
- **Paramètres optimisés** : Génération fluide sans caractères isolés
|
| 82 |
+
- **400 tokens** : Réponses détaillées et complètes
|
| 83 |
+
|
| 84 |
+
### 📱 Interface mobile
|
| 85 |
+
- **Design responsive** : Optimisé pour smartphones et tablettes
|
| 86 |
+
- **Sidebar collapsible** : Plus d'espace sur mobile
|
| 87 |
+
- **Boutons adaptés** : Taille et espacement optimisés
|
| 88 |
+
- **Feedback visuel** : Spinners et messages de statut
|
| 89 |
+
|
| 90 |
+
### 🔍 Diagnostic amélioré
|
| 91 |
+
- **Section automatique** : "Recommandations ou actions urgentes"
|
| 92 |
+
- **Analyse contextuelle** : Prise en compte de la question utilisateur
|
| 93 |
+
- **Conseils pratiques** : Actions prioritaires pour l'agriculteur
|
| 94 |
+
|
| 95 |
+
### ⚡ Performance
|
| 96 |
+
- **Chargement unique** : Modèle chargé une seule fois avec cache
|
| 97 |
+
- **CPU optimisé** : Fonctionne sans GPU
|
| 98 |
+
- **Feedback temps réel** : Indicateurs de progression
|
| 99 |
+
|
| 100 |
+
## 🇬🇧 New features (v2.0)
|
| 101 |
+
|
| 102 |
+
### 🎯 Local multimodal model
|
| 103 |
+
- **Gemma 3n multimodal** : Simultaneous image + text analysis
|
| 104 |
+
- **Optimized parameters** : Smooth generation without isolated characters
|
| 105 |
+
- **400 tokens** : Detailed and complete responses
|
| 106 |
+
|
| 107 |
+
### 📱 Mobile interface
|
| 108 |
+
- **Responsive design** : Optimized for smartphones and tablets
|
| 109 |
+
- **Collapsible sidebar** : More space on mobile
|
| 110 |
+
- **Adapted buttons** : Optimized size and spacing
|
| 111 |
+
- **Visual feedback** : Spinners and status messages
|
| 112 |
+
|
| 113 |
+
### 🔍 Enhanced diagnosis
|
| 114 |
+
- **Automatic section** : "Recommendations or urgent actions"
|
| 115 |
+
- **Contextual analysis** : User question consideration
|
| 116 |
+
- **Practical advice** : Priority actions for farmers
|
| 117 |
+
|
| 118 |
+
### ⚡ Performance
|
| 119 |
+
- **Single loading** : Model loaded once with cache
|
| 120 |
+
- **CPU optimized** : Works without GPU
|
| 121 |
+
- **Real-time feedback** : Progress indicators
|
| 122 |
+
|
| 123 |
+
---
|
| 124 |
+
|
| 125 |
+
## 🇫🇷 Script d'installation automatique
|
| 126 |
Le script `install_agrilens.py` :
|
| 127 |
+
- Crée l'environnement virtuel si besoin
|
| 128 |
- Installe toutes les dépendances (`requirements.txt`)
|
| 129 |
+
- Vérifie la présence du modèle
|
| 130 |
- Affiche les instructions de lancement
|
| 131 |
|
| 132 |
## 🇬🇧 Auto-install script
|
| 133 |
The `install_agrilens.py` script:
|
| 134 |
- Creates the virtual environment if needed
|
| 135 |
- Installs all dependencies (`requirements.txt`)
|
| 136 |
+
- Checks for the model presence
|
| 137 |
- Shows launch instructions
|
| 138 |
|
| 139 |
---
|
| 140 |
|
| 141 |
+
## 🇫🇷 Modes de fonctionnement
|
| 142 |
|
| 143 |
+
| Mode | Modèle utilisé | Inférence réelle | Dépendance Internet | Remarques |
|
| 144 |
|-------------------|---------------------------------------|------------------|---------------------|-----------|
|
| 145 |
+
| **Local (offline)** | Gemma 3n multimodal (dossier local) | ✅ Oui | ❌ Non | Rapide, 100% offline, recommandé |
|
| 146 |
+
| Hugging Face (token HF) | google/gemma-3n-E2B-it (API HF) | ✅ Oui | ✅ Oui | Espace GPU recommandé, token requis |
|
| 147 |
+
| Hugging Face (public) | Aucun (mode démo) | ❌ Non | ✅ Oui | Réponse factice, test UI uniquement |
|
| 148 |
|
| 149 |
### Instructions
|
| 150 |
+
- **Local (offline)** - **RECOMMANDÉ** :
|
| 151 |
+
- Placez le modèle Gemma 3n dans `D:/Dev/model_gemma`
|
| 152 |
+
- Lancez `streamlit run src/streamlit_app_local_models.py`
|
| 153 |
- Aucun accès Internet requis
|
| 154 |
+
- Interface mobile optimisée
|
| 155 |
- **Hugging Face (inférence réelle)** :
|
| 156 |
+
- Ajoutez la variable d'environnement `HF_TOKEN`
|
| 157 |
+
- Acceptez les conditions d'utilisation du modèle
|
| 158 |
- Utilisez un Space GPU pour de meilleures performances
|
| 159 |
- **Hugging Face (mode démo)** :
|
| 160 |
+
- Si aucun token n'est présent, mode démo uniquement
|
| 161 |
|
| 162 |
+
## 🇬🇧 Operating modes
|
| 163 |
|
| 164 |
+
| Mode | Model used | Real inference | Internet required | Notes |
|
| 165 |
|-------------------|---------------------------------------|------------------|---------------------|-----------|
|
| 166 |
+
| **Local (offline)** | Gemma 3n multimodal (local folder) | ✅ Yes | ❌ No | Fast, 100% offline, recommended |
|
| 167 |
+
| Hugging Face (HF token) | google/gemma-3n-E2B-it (HF API) | ✅ Yes | ✅ Yes | GPU Space recommended, token required |
|
| 168 |
+
| Hugging Face (public) | None (demo mode) | ❌ No | ✅ Yes | Fictive answer, UI test only |
|
| 169 |
|
| 170 |
### Instructions
|
| 171 |
+
- **Local (offline)** - **RECOMMENDED** :
|
| 172 |
+
- Put the Gemma 3n model in `D:/Dev/model_gemma`
|
| 173 |
+
- Launch `streamlit run src/streamlit_app_local_models.py`
|
| 174 |
- No Internet required
|
| 175 |
+
- Mobile-optimized interface
|
| 176 |
- **Hugging Face (real inference)** :
|
| 177 |
+
- Add the `HF_TOKEN` environment variable
|
| 178 |
+
- Accept the model terms of use
|
| 179 |
- Use a GPU Space for best performance
|
| 180 |
- **Hugging Face (demo mode)** :
|
| 181 |
+
- If no token is present, demo mode only
|
requirements.txt
CHANGED
|
@@ -1,7 +1,13 @@
|
|
| 1 |
-
|
| 2 |
-
|
|
|
|
|
|
|
| 3 |
numpy<2
|
| 4 |
-
Pillow
|
| 5 |
-
requests
|
| 6 |
-
fpdf
|
| 7 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
streamlit>=1.28.0
|
| 2 |
+
transformers==4.53.0
|
| 3 |
+
torch>=2.0.1
|
| 4 |
+
torchvision>=0.15.2
|
| 5 |
numpy<2
|
| 6 |
+
Pillow>=10.0.0
|
| 7 |
+
requests>=2.32.0
|
| 8 |
+
fpdf>=1.7.2
|
| 9 |
+
python-dotenv>=1.0.0
|
| 10 |
+
huggingface-hub>=0.30.0
|
| 11 |
+
safetensors>=0.4.3
|
| 12 |
+
accelerate>=0.20.0
|
| 13 |
+
tokenizers<0.22,>=0.21
|
streamlit_app.py
ADDED
|
@@ -0,0 +1,278 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import streamlit as st
|
| 2 |
+
import os
|
| 3 |
+
import io
|
| 4 |
+
from PIL import Image
|
| 5 |
+
import random
|
| 6 |
+
from transformers import pipeline
|
| 7 |
+
import torch
|
| 8 |
+
import traceback
|
| 9 |
+
|
| 10 |
+
# Configuration de la page
|
| 11 |
+
st.set_page_config(
|
| 12 |
+
page_title="AgriLens AI - Diagnostic des Plantes",
|
| 13 |
+
page_icon="🌱",
|
| 14 |
+
layout="centered",
|
| 15 |
+
initial_sidebar_state="collapsed"
|
| 16 |
+
)
|
| 17 |
+
|
| 18 |
+
# CSS pour mobile
|
| 19 |
+
st.markdown("""
|
| 20 |
+
<style>
|
| 21 |
+
@media (max-width: 600px) {
|
| 22 |
+
.main {
|
| 23 |
+
max-width: 100vw !important;
|
| 24 |
+
padding: 0.5rem !important;
|
| 25 |
+
}
|
| 26 |
+
.stButton button, .stTextInput input, .stTextArea textarea {
|
| 27 |
+
width: 100% !important;
|
| 28 |
+
font-size: 1.1rem !important;
|
| 29 |
+
}
|
| 30 |
+
.stSidebar {
|
| 31 |
+
width: 100vw !important;
|
| 32 |
+
min-width: 100vw !important;
|
| 33 |
+
}
|
| 34 |
+
.result-box {
|
| 35 |
+
font-size: 1.05rem !important;
|
| 36 |
+
}
|
| 37 |
+
.stMarkdown, .stHeader, .stSubheader {
|
| 38 |
+
font-size: 1.1rem !important;
|
| 39 |
+
}
|
| 40 |
+
.stFileUploader, .stImage {
|
| 41 |
+
width: 100% !important;
|
| 42 |
+
}
|
| 43 |
+
}
|
| 44 |
+
</style>
|
| 45 |
+
""", unsafe_allow_html=True)
|
| 46 |
+
|
| 47 |
+
# Initialisation des variables de session
|
| 48 |
+
if 'gemma_model' not in st.session_state:
|
| 49 |
+
st.session_state.gemma_model = None
|
| 50 |
+
if 'gemma_model_status' not in st.session_state:
|
| 51 |
+
st.session_state.gemma_model_status = "Non chargé"
|
| 52 |
+
|
| 53 |
+
@st.cache_resource(show_spinner=False)
|
| 54 |
+
def get_hf_gemma_multimodal():
|
| 55 |
+
"""Charge le modèle Gemma 3n depuis Hugging Face"""
|
| 56 |
+
try:
|
| 57 |
+
st.info("Chargement du modèle multimodal Gemma 3n depuis Hugging Face...")
|
| 58 |
+
|
| 59 |
+
# Utiliser le modèle distant de Hugging Face
|
| 60 |
+
model_name = "google/gemma-3n-e2b-it"
|
| 61 |
+
|
| 62 |
+
pipe = pipeline(
|
| 63 |
+
"image-text-to-text",
|
| 64 |
+
model=model_name,
|
| 65 |
+
device=-1, # Forcer le CPU
|
| 66 |
+
torch_dtype=torch.float32,
|
| 67 |
+
)
|
| 68 |
+
|
| 69 |
+
st.success(f"Modèle Gemma multimodal chargé : {pipe}")
|
| 70 |
+
return pipe
|
| 71 |
+
except Exception as e:
|
| 72 |
+
st.error(f"Erreur lors du chargement du modèle Gemma multimodal : {e}")
|
| 73 |
+
st.error(traceback.format_exc())
|
| 74 |
+
return None
|
| 75 |
+
|
| 76 |
+
def analyze_image_hf(image, prompt=""):
|
| 77 |
+
"""Analyse une image avec le modèle multimodal Gemma 3n distant"""
|
| 78 |
+
if st.session_state.gemma_model is None:
|
| 79 |
+
return "❌ Modèle non chargé. Veuillez le charger dans les réglages."
|
| 80 |
+
try:
|
| 81 |
+
pipe = st.session_state.gemma_model
|
| 82 |
+
messages = [
|
| 83 |
+
{
|
| 84 |
+
"role": "system",
|
| 85 |
+
"content": [
|
| 86 |
+
{"type": "text", "text": "Tu es un assistant agricole expert en diagnostic de maladies de plantes. Donne des réponses claires et structurées."}
|
| 87 |
+
]
|
| 88 |
+
},
|
| 89 |
+
{
|
| 90 |
+
"role": "user",
|
| 91 |
+
"content": [
|
| 92 |
+
{"type": "image", "image": image.convert("RGB")},
|
| 93 |
+
{"type": "text", "text": prompt or "Décris la maladie présente sur cette plante et donne des recommandations pratiques."}
|
| 94 |
+
]
|
| 95 |
+
}
|
| 96 |
+
]
|
| 97 |
+
|
| 98 |
+
# Paramètres de génération améliorés
|
| 99 |
+
result = pipe(
|
| 100 |
+
text=messages,
|
| 101 |
+
max_new_tokens=400,
|
| 102 |
+
do_sample=True,
|
| 103 |
+
temperature=0.7,
|
| 104 |
+
top_p=0.9,
|
| 105 |
+
repetition_penalty=1.1,
|
| 106 |
+
pad_token_id=pipe.tokenizer.eos_token_id
|
| 107 |
+
)
|
| 108 |
+
|
| 109 |
+
if isinstance(result, list) and "generated_text" in result[0]:
|
| 110 |
+
response = result[0]["generated_text"]
|
| 111 |
+
|
| 112 |
+
# Nettoyage de la réponse
|
| 113 |
+
if response and len(response.strip()) > 0:
|
| 114 |
+
# Vérifier si la réponse contient déjà des recommandations
|
| 115 |
+
if "recommandation" not in response.lower() and "action" not in response.lower():
|
| 116 |
+
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"
|
| 117 |
+
|
| 118 |
+
return response
|
| 119 |
+
else:
|
| 120 |
+
return "❌ Erreur : Réponse vide du modèle"
|
| 121 |
+
|
| 122 |
+
return str(result)
|
| 123 |
+
except Exception as e:
|
| 124 |
+
return f"❌ Erreur lors de l'analyse d'image : {e}"
|
| 125 |
+
|
| 126 |
+
def analyze_text_hf(text):
|
| 127 |
+
"""Analyse un texte avec le modèle Gemma 3n distant"""
|
| 128 |
+
if st.session_state.gemma_model is None:
|
| 129 |
+
return "❌ Modèle non chargé. Veuillez le charger dans les réglages."
|
| 130 |
+
try:
|
| 131 |
+
pipe = st.session_state.gemma_model
|
| 132 |
+
messages = [
|
| 133 |
+
{
|
| 134 |
+
"role": "system",
|
| 135 |
+
"content": [
|
| 136 |
+
{"type": "text", "text": "Tu es un assistant agricole expert. Donne des conseils pratiques et structurés."}
|
| 137 |
+
]
|
| 138 |
+
},
|
| 139 |
+
{
|
| 140 |
+
"role": "user",
|
| 141 |
+
"content": [
|
| 142 |
+
{"type": "text", "text": text}
|
| 143 |
+
]
|
| 144 |
+
}
|
| 145 |
+
]
|
| 146 |
+
|
| 147 |
+
result = pipe(
|
| 148 |
+
text=messages,
|
| 149 |
+
max_new_tokens=300,
|
| 150 |
+
do_sample=True,
|
| 151 |
+
temperature=0.7,
|
| 152 |
+
top_p=0.9
|
| 153 |
+
)
|
| 154 |
+
|
| 155 |
+
if isinstance(result, list) and "generated_text" in result[0]:
|
| 156 |
+
return result[0]["generated_text"]
|
| 157 |
+
return str(result)
|
| 158 |
+
except Exception as e:
|
| 159 |
+
return f"❌ Erreur lors de l'analyse de texte : {e}"
|
| 160 |
+
|
| 161 |
+
# Interface principale
|
| 162 |
+
st.title("🌱 AgriLens AI - Diagnostic des Plantes")
|
| 163 |
+
st.markdown("**Application de diagnostic des maladies de plantes avec IA**")
|
| 164 |
+
|
| 165 |
+
# Sidebar pour le chargement du modèle
|
| 166 |
+
with st.sidebar:
|
| 167 |
+
st.header("⚙️ Configuration")
|
| 168 |
+
|
| 169 |
+
if st.button("Charger le modèle Gemma 3n multimodal (Hugging Face)", type="primary"):
|
| 170 |
+
with st.spinner("Chargement du modèle..."):
|
| 171 |
+
st.session_state.gemma_model = get_hf_gemma_multimodal()
|
| 172 |
+
if st.session_state.gemma_model:
|
| 173 |
+
st.session_state.gemma_model_status = "✅ Chargé"
|
| 174 |
+
st.success("Modèle chargé avec succès !")
|
| 175 |
+
else:
|
| 176 |
+
st.session_state.gemma_model_status = "❌ Erreur"
|
| 177 |
+
st.error("Échec du chargement du modèle")
|
| 178 |
+
|
| 179 |
+
st.info(f"**Statut du modèle :** {st.session_state.gemma_model_status}")
|
| 180 |
+
|
| 181 |
+
# Onglets principaux
|
| 182 |
+
tab1, tab2, tab3 = st.tabs(["📸 Analyse d'Image", "💬 Analyse de Texte", "ℹ️ À propos"])
|
| 183 |
+
|
| 184 |
+
with tab1:
|
| 185 |
+
st.header("🔍 Diagnostic par Image")
|
| 186 |
+
st.markdown("Téléchargez une photo de plante malade pour obtenir un diagnostic")
|
| 187 |
+
|
| 188 |
+
uploaded_file = st.file_uploader(
|
| 189 |
+
"Choisissez une image...",
|
| 190 |
+
type=['png', 'jpg', 'jpeg'],
|
| 191 |
+
help="Formats acceptés : PNG, JPG, JPEG"
|
| 192 |
+
)
|
| 193 |
+
|
| 194 |
+
if uploaded_file is not None:
|
| 195 |
+
image = Image.open(uploaded_file)
|
| 196 |
+
|
| 197 |
+
# Affichage de l'image
|
| 198 |
+
col1, col2 = st.columns([1, 1])
|
| 199 |
+
with col1:
|
| 200 |
+
st.image(image, caption="Image uploadée", use_container_width=True)
|
| 201 |
+
|
| 202 |
+
with col2:
|
| 203 |
+
st.markdown("**Informations de l'image :**")
|
| 204 |
+
st.write(f"• Format : {image.format}")
|
| 205 |
+
st.write(f"• Taille : {image.size[0]}x{image.size[1]} pixels")
|
| 206 |
+
st.write(f"• Mode : {image.mode}")
|
| 207 |
+
|
| 208 |
+
# Question spécifique
|
| 209 |
+
question = st.text_area(
|
| 210 |
+
"Question spécifique (optionnel) :",
|
| 211 |
+
placeholder="Ex: Quelle est cette maladie ? Que faire pour la traiter ?",
|
| 212 |
+
height=100
|
| 213 |
+
)
|
| 214 |
+
|
| 215 |
+
# Bouton d'analyse
|
| 216 |
+
if st.button("🔬 Analyser avec l'IA Hugging Face", disabled=st.session_state.gemma_model is None, type="primary"):
|
| 217 |
+
if st.session_state.gemma_model is None:
|
| 218 |
+
st.error("❌ Veuillez d'abord charger le modèle dans les réglages")
|
| 219 |
+
else:
|
| 220 |
+
with st.spinner("🔍 Analyse en cours..."):
|
| 221 |
+
result = analyze_image_hf(image, question)
|
| 222 |
+
|
| 223 |
+
st.markdown("## 📊 Résultats de l'Analyse")
|
| 224 |
+
st.markdown("---")
|
| 225 |
+
st.markdown(result)
|
| 226 |
+
|
| 227 |
+
with tab2:
|
| 228 |
+
st.header("💬 Diagnostic par Texte")
|
| 229 |
+
st.markdown("Décrivez les symptômes de votre plante pour obtenir des conseils")
|
| 230 |
+
|
| 231 |
+
text_input = st.text_area(
|
| 232 |
+
"Description des symptômes :",
|
| 233 |
+
placeholder="Ex: Mes tomates ont des taches brunes sur les feuilles et les fruits...",
|
| 234 |
+
height=150
|
| 235 |
+
)
|
| 236 |
+
|
| 237 |
+
if st.button("🧠 Analyser avec l'IA Hugging Face", disabled=st.session_state.gemma_model is None, type="primary"):
|
| 238 |
+
if st.session_state.gemma_model is None:
|
| 239 |
+
st.error("❌ Veuillez d'abord charger le modèle dans les réglages")
|
| 240 |
+
elif not text_input.strip():
|
| 241 |
+
st.error("❌ Veuillez saisir une description")
|
| 242 |
+
else:
|
| 243 |
+
with st.spinner("🔍 Analyse en cours..."):
|
| 244 |
+
result = analyze_text_hf(text_input)
|
| 245 |
+
|
| 246 |
+
st.markdown("## 📊 Résultats de l'Analyse")
|
| 247 |
+
st.markdown("---")
|
| 248 |
+
st.markdown(result)
|
| 249 |
+
|
| 250 |
+
with tab3:
|
| 251 |
+
st.header("ℹ️ À propos d'AgriLens AI")
|
| 252 |
+
st.markdown("""
|
| 253 |
+
### 🌱 Notre Mission
|
| 254 |
+
AgriLens AI est une application de diagnostic des maladies de plantes utilisant l'intelligence artificielle
|
| 255 |
+
pour aider les agriculteurs à identifier et traiter les problèmes de leurs cultures.
|
| 256 |
+
|
| 257 |
+
### 🚀 Fonctionnalités
|
| 258 |
+
- **Analyse d'images** : Diagnostic visuel des maladies
|
| 259 |
+
- **Analyse de texte** : Conseils basés sur les descriptions
|
| 260 |
+
- **Recommandations pratiques** : Actions concrètes à entreprendre
|
| 261 |
+
- **Interface mobile** : Optimisée pour smartphones et tablettes
|
| 262 |
+
|
| 263 |
+
### 🔧 Technologie
|
| 264 |
+
- **Modèle** : Gemma 3n multimodal (Google)
|
| 265 |
+
- **Framework** : Streamlit
|
| 266 |
+
- **Déploiement** : Streamlit Cloud
|
| 267 |
+
|
| 268 |
+
### ⚠️ Avertissement
|
| 269 |
+
Les résultats fournis sont à titre indicatif uniquement.
|
| 270 |
+
Pour un diagnostic professionnel, consultez un expert qualifié.
|
| 271 |
+
|
| 272 |
+
### 📞 Support
|
| 273 |
+
Pour toute question ou problème, consultez la documentation ou contactez l'équipe de développement.
|
| 274 |
+
""")
|
| 275 |
+
|
| 276 |
+
# Footer
|
| 277 |
+
st.markdown("---")
|
| 278 |
+
st.markdown("*AgriLens AI - Diagnostic intelligent des plantes avec IA*")
|