Update README.md
Browse files
README.md
CHANGED
|
@@ -1,3 +1,97 @@
|
|
| 1 |
-
---
|
| 2 |
-
license: cc-by-nc-4.0
|
| 3 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
---
|
| 2 |
+
license: cc-by-nc-4.0
|
| 3 |
+
language:
|
| 4 |
+
- fr
|
| 5 |
+
- en
|
| 6 |
+
tags:
|
| 7 |
+
- earth-observation
|
| 8 |
+
- sentinel-2
|
| 9 |
+
- land-cover
|
| 10 |
+
- remote-sensing
|
| 11 |
+
- random-forest
|
| 12 |
+
- deforestation
|
| 13 |
+
- togo
|
| 14 |
+
---
|
| 15 |
+
|
| 16 |
+
# ForestWatch Togo : Land Cover AI Monitor 🌍🛰️
|
| 17 |
+
|
| 18 |
+
Ce dépôt contient les artefacts de production (modèle d'Intelligence Artificielle et scaler) du projet **ForestWatch Togo**.<br>
|
| 19 |
+
Ce système permet de classifier l'occupation des sols à partir de l'imagerie satellite Sentinel-2 (*résolution 10m*).
|
| 20 |
+
|
| 21 |
+
## 🧠 Détails du Modèle
|
| 22 |
+
|
| 23 |
+
* **Algorithme :** `RandomForestClassifier` (Scikit-Learn).
|
| 24 |
+
* **Entraînement :** Entraîné sur un jeu de données extrait via Google Earth Engine, ciblant spécifiquement la région du Togo.
|
| 25 |
+
* **Variables d'entrée (Features) :** Le modèle s'attend à recevoir un tableau (`pandas.DataFrame`) contenant très exactement ces **18 colonnes**, et dans cet ordre strict :
|
| 26 |
+
```python
|
| 27 |
+
features_attendues = [
|
| 28 |
+
'B12', 'B12_contrast', 'B12_diss',
|
| 29 |
+
'B4', 'B4_var',
|
| 30 |
+
'B8', 'B8_asm', 'B8_contrast', 'B8_diss',
|
| 31 |
+
'NDBI', 'NDBI_contrast', 'NDBI_diss',
|
| 32 |
+
'NDVI', 'NDVI_contrast', 'NDVI_diss',
|
| 33 |
+
'NDWI', 'NDWI_contrast', 'NDWI_diss'
|
| 34 |
+
]
|
| 35 |
+
```
|
| 36 |
+
* **Sorties (6 Classes) :**
|
| 37 |
+
1: Eau | 2: Arbres/Forêt | 3: Végétation inondée | 4: Cultures | 5: Urbain | 6: Savane & Buissons / Sol Nu
|
| 38 |
+
|
| 39 |
+
## 📦 Architecture des fichiers
|
| 40 |
+
|
| 41 |
+
* `rfc_production_v1.joblib` : Le modèle prédictif final.
|
| 42 |
+
* `scaler_production.joblib` : Le StandardScaler (indispensable pour conformer les données avant l'inférence).
|
| 43 |
+
|
| 44 |
+
## 💻 Exemple d'utilisation (Python)
|
| 45 |
+
|
| 46 |
+
Voici comment télécharger dynamiquement les artefacts depuis ce repository et effectuer une prédiction en Python :
|
| 47 |
+
|
| 48 |
+
```python
|
| 49 |
+
import pandas as pd
|
| 50 |
+
import joblib
|
| 51 |
+
from huggingface_hub import hf_hub_download
|
| 52 |
+
|
| 53 |
+
REPO_ID = "kjd-dktech/forestwatch-tg"
|
| 54 |
+
|
| 55 |
+
# 1. Télécharger et charger les poids de production depuis Hugging Face
|
| 56 |
+
scaler_path = hf_hub_download(repo_id=REPO_ID, filename="scaler_production.joblib")
|
| 57 |
+
model_path = hf_hub_download(repo_id=REPO_ID, filename="rfc_production_v1.joblib")
|
| 58 |
+
|
| 59 |
+
scaler = joblib.load(scaler_path)
|
| 60 |
+
model = joblib.load(model_path)
|
| 61 |
+
|
| 62 |
+
# 2. Préparer vos nouvelles données
|
| 63 |
+
# Le tableau doit contenir exactement les 18 features attendues
|
| 64 |
+
features_attendues = [
|
| 65 |
+
'B12', 'B12_contrast', 'B12_diss',
|
| 66 |
+
'B4', 'B4_var',
|
| 67 |
+
'B8', 'B8_asm', 'B8_contrast', 'B8_diss',
|
| 68 |
+
'NDBI', 'NDBI_contrast', 'NDBI_diss',
|
| 69 |
+
'NDVI', 'NDVI_contrast', 'NDVI_diss',
|
| 70 |
+
'NDWI', 'NDWI_contrast', 'NDWI_diss'
|
| 71 |
+
]
|
| 72 |
+
|
| 73 |
+
donnees_entree = pd.DataFrame([
|
| 74 |
+
# Simulation d'un pixel (18 valeurs fictives)
|
| 75 |
+
[0.10, 1.2, 0.5, 0.06, 0.05, 0.25, 0.15, 0.8, 0.4, -0.2, 0.3, 0.2, 0.6, 0.9, 0.3, -0.4, 0.5, 0.1]
|
| 76 |
+
], columns=features_attendues)
|
| 77 |
+
|
| 78 |
+
# 3. Appliquer la normalisation
|
| 79 |
+
X_scaled = scaler.transform(donnees_entree)
|
| 80 |
+
|
| 81 |
+
# 4. Prédire la classe d'occupation du sol
|
| 82 |
+
predictions = model.predict(X_scaled)
|
| 83 |
+
|
| 84 |
+
print("Classe prédite :", predictions[0])
|
| 85 |
+
# Ex: Sortie 2 (Forêt)
|
| 86 |
+
```
|
| 87 |
+
|
| 88 |
+
## 🚀 Utilisation en Production
|
| 89 |
+
|
| 90 |
+
Ce modèle est conçu pour fonctionner dynamiquement avec l'API Stateless développée pour le projet. <br>
|
| 91 |
+
L'API télécharge automatiquement ces poids lors de son démarrage grâce à `huggingface_hub`.
|
| 92 |
+
|
| 93 |
+
Pour utiliser le code complet, l'API et l'infrastructure Docker, veuillez consulter le repository GitHub officiel :
|
| 94 |
+
🔗 **[GitHub - ForestWatch Togo](https://github.com/kjd-dktech/forestwatch-tg)**
|
| 95 |
+
|
| 96 |
+
---
|
| 97 |
+
*Développé par [Kodjo Jean DEGBEVI (@kjd-dktech)] - Licence CC-BY-NC-4.0*
|