Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
3486486
feat: extract and build biolit_ml_dataset for inference
mandresyandri Feb 24, 2026
66202d3
fix: load requirementt with UV for previous commit
mandresyandri Feb 24, 2026
4be106f
feat: base crop pipeline with grounding dino, unfinished code
mandresyandri Feb 24, 2026
b99ab44
Update routing instructions in README.md
Hpoinseaux Feb 27, 2026
a2b73ed
chore: sync features/ML-CROPS with main
Hpoinseaux Feb 27, 2026
39d2042
docs: remove trailing whitespace in yolov8 README
Hpoinseaux Feb 27, 2026
4dfc0c8
docs: clean whitespace in yolov8 README
Hpoinseaux Feb 27, 2026
f091a08
feat: benchmark prompts Grounding DINO + analyse des résultats
ggovernatori Mar 11, 2026
d12fb7b
fix: rename ambiguous variable l -> label (E741)
ggovernatori Mar 18, 2026
113d26b
fix: apply pre-commit corrections (ruff + trailing whitespace)
ggovernatori Mar 18, 2026
09c9a5b
Merge pull request #16 from dataforgoodfr/feature/gdino-prompt-benchmark
Hpoinseaux Mar 18, 2026
9e976ee
feature: téléchargement des fichiers et structuration du code.
mandresyandri Mar 29, 2026
42d1380
Code for autodistilling Dino
mandresyandri Mar 30, 2026
a7d70bb
fix autodistill code
mandresyandri Mar 30, 2026
d002ef7
fix1 code
mandresyandri Mar 30, 2026
e97da34
feat: code autodistill pour le modèle bootstrap
mandresyandri Mar 31, 2026
9777b54
feat: code autodistill pour le modèle bootstrap clean
mandresyandri Mar 31, 2026
18e655e
fix: ml/yolov8 precommit test
mandresyandri Mar 31, 2026
e987952
Merge branch 'features/ML-CROPS' into features/boostrap-yolov8-autodi…
Hpoinseaux Apr 3, 2026
921d246
Merge pull request #21 from dataforgoodfr/features/boostrap-yolov8-au…
Hpoinseaux Apr 3, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 8 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -175,4 +175,11 @@ data.yaml

# orchestrateur - tests Timothée
orchestrateur/
flows/
flows/
images/
labeled-images/
_non_images_tmp/
yolov8n.pt
images_test/
labeled_test/
runs/
174 changes: 174 additions & 0 deletions ml/prompt_textuel_yolo/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,174 @@
# ML — Détection et crop d'espèces marines (BioLit)

## C'est quoi l'objectif ?

On veut automatiser la détection des espèces marines (animaux et végétaux) dans les photos BioLit.
Concrètement : le programme regarde une photo, trouve où se trouve l'espèce, et **découpe cette zone** (= le crop).

Ce crop servira ensuite à :
- classifier automatiquement l'espèce si la détection est fiable
- envoyer l'image dans Label Studio pour annotation manuelle si la détection est douteuse
- ignorer l'image si aucune espèce n'est trouvée

---

## Ce que fait chaque fichier

### `build_dataset.py` — Construire la base d'images

Ce script part du fichier `export_biolit.csv` (l'export brut de la plateforme BioLit) et prépare toutes les images pour le travail suivant.

Il fait 4 choses dans l'ordre :
1. Lit le CSV et garde seulement les observations **validées**
2. Télécharge les photos depuis internet
3. Les range dans des dossiers selon qu'elles sont **identifiables ou non**
4. Sauvegarde un fichier de métadonnées (`metadata.csv`) et un fichier de config pour YOLO (`data.yaml`)

Structure créée automatiquement :

```
dataset_biolit/
├── images/
│ ├── identifiable/ ← photos d'espèces qu'on peut identifier
│ └── non_identifiable/ ← photos floues ou ambiguës (à valider)
├── labels/
│ ├── identifiable/ ← réservé aux annotations YOLO
│ └── non_identifiable/
├── metadata.csv ← tableau avec toutes les infos par image
└── data.yaml ← config pour entraîner un modèle YOLO
```

> ⚠️ Ce script doit être exécuté **en premier**, avant tout le reste.

---

### `crop_pipeline.py` — Premier test de détection

Ce script est le **prototype** : il teste Grounding DINO sur une seule image pour vérifier que le modèle fonctionne et que les crops sont corrects.

Il utilise le prompt `"animal, plant"` sur une image de test et sauvegarde le crop découpé.

C'est le point de départ qui a servi de base pour construire le benchmark.

---

### `benchmark_gdino_simplifie.py` — Trouver le meilleur prompt ← **nouveau**

C'est le script principal de cette étape.

#### Pourquoi un benchmark de prompts ?

Grounding DINO est un modèle **zéro-shot** : on lui dit en texte ce qu'on cherche, et il détecte.
Par exemple : `"crab, starfish, sea urchin"`.

Le problème : on ne sait pas quel texte donne les **meilleures détections** sur nos photos BioLit.
Ce benchmark teste automatiquement **19 variantes de prompts** sur 100 images et compare les résultats.

#### Ce qu'il fait, étape par étape

1. **Charge 100 images** au hasard depuis `dataset_biolit/images/identifiable/`
2. **Charge le modèle** Grounding DINO (téléchargé automatiquement la première fois, ~700 MB)
3. **Pour chaque prompt**, applique la détection sur toutes les images et enregistre :
- combien de détections ont été trouvées
- le score de confiance de chaque détection
- les coordonnées de chaque boîte (bbox)
- les crops découpés (sauvegardés en `.webp`)
4. **Calcule des statistiques** par prompt : nombre de détections, confiance moyenne, % d'images avec confiance ≥ 60%
5. **Génère 5 graphiques** pour comparer visuellement les prompts
6. **Sauvegarde tout** : CSV brut, CSV de stats, et les graphiques

#### Les 19 prompts testés

| Nom du prompt | Texte envoyé au modèle |
|---|---|
| `simple` | `animal, plant` |
| `marin` | `marine animal, marine plant` |
| `sous_marin` | `underwater animal, underwater plant, marine organism` |
| `animaux_biolit` | `crab, starfish, sea urchin, anemone, shellfish...` |
| `plantes_biolit` | `seaweed, algae, brown algae, red algae...` |
| `equilibre` | `crab, starfish, sea urchin, anemone, seaweed...` |
| `morphologique` | `animal with shell, animal with tentacles...` |
| `ultra_detaille` | liste complète des espèces BioLit connues |
| `generique` | `animal, plant, marine organism, shellfish...` |
| `taxonomique` | `crustacean, mollusk, echinoderm, cnidarian...` |
| `crustaces` | `crab, lobster, shrimp, barnacle, mussel...` |
| `echinodermes` | `starfish, sea star, sea urchin, brittle star...` |
| `cnidaires` | `sea anemone, anemone, jellyfish...` |
| `algues_couleur` | `brown seaweed, red seaweed, green seaweed...` |
| `intertidal` | `intertidal animal, intertidal plant, tide pool creature...` |
| `visuel` | `spiny animal, shelled animal, tentacled creature...` |
| `top_combo` | `crab, starfish, sea urchin, mussel, barnacle, brown algae...` |
| `sessiles` | `barnacle, mussel, oyster, sea anemone...` |
| `mobiles` | `crab, starfish, sea urchin, snail, whelk...` |

#### Les graphiques produits

| Fichier | Ce qu'il montre |
|---|---|
| `01_detections.png` | Nombre total de détections par prompt |
| `02_confiance.png` | Score de confiance moyen par prompt |
| `03_haute_confiance.png` | % d'images avec confiance ≥ 60% |
| `04_heatmap.png` | Vue d'ensemble des 3 métriques normalisées |
| `05_violon_confiance.png` | Distribution des scores pour les 5 meilleurs prompts |

#### Utilisation

```bash
# Test rapide (10 images)
python benchmark_gdino_prompts.py --n-images 10 --output results/gdino_benchmark

# Benchmark complet (100 images)
python benchmark_gdino_prompts.py --n-images 100 --output results/gdino_benchmark
```

#### Sorties

```
results/gdino_benchmark/
├── crops/
│ ├── simple/ ← crops découpés par prompt
│ ├── marin/
│ └── ...
├── visualisations/
│ ├── 01_detections.png
│ ├── 02_confiance.png
│ ├── 03_haute_confiance.png
│ ├── 04_heatmap.png
│ └── 05_violon_confiance.png
├── resultats_bruts_YYYYMMDD.csv ← une ligne par détection
└── stats_par_prompt_YYYYMMDD.csv ← une ligne par prompt
```

---

## Schéma du pipeline complet

```
export_biolit.csv
build_dataset.py → télécharge et range les images
dataset_biolit/images/identifiable/
benchmark_gdino_prompts.py → teste 19 prompts, trouve le meilleur
résultats + graphiques
├── confiance forte → Classification automatique
├── confiance faible → Label Studio (annotation manuelle)
└── aucune détection → stop
```

---

## Dépendances Python

```bash
pip install torch transformers pandas matplotlib Pillow tqdm
```

> Le modèle Grounding DINO est téléchargé automatiquement par Hugging Face lors du premier lancement (~700 MB).
Loading
Loading