Grapevine_Disease_Detection/PROJECT_SUMMARY.md
Yanis f247748adc chore(android): propagate CMake fix to native subprojects
The withCmakeFix plugin now also modifies the root android/build.gradle
via withProjectBuildGradle, iterating over subprojects with
plugins.withId('com.android.library') / plugins.withId('com.android.application').
Using plugins.withId (vs subprojects { afterEvaluate {} }) avoids the
"Cannot run Project.afterEvaluate when the project is already evaluated"
error caused by gradle-plugins (kotlin, expo-gradle-plugin, ...) being
evaluated before the closure runs.

This unblocks the native CMake build of react-native-fast-tflite,
react-native-nitro-modules, react-native-screens, expo-modules-core, etc.
on Windows where the path-too-long issue affected subproject .o files.

Build verified: BUILD SUCCESSFUL in 15m 17s, 842 tasks, 0 errors.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-01 11:30:55 +02:00

288 lines
15 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# VinEye - Project Summary
> Plateforme de detection de maladies de la vigne par IA
> Derniere mise a jour : 2026-04-09
---
## Vue d'ensemble
VinEye est une plateforme complete de detection de maladies de la vigne composee de :
- **Application mobile** (VinEye) : React Native / Expo, scan camera avec inference IA embarquee
- **Dashboard admin** (vineye-admin) : Next.js, gestion du contenu et suivi des utilisateurs
- **Pipeline ML** : CNN TensorFlow entraine sur 9 027 images de feuilles de vigne
Public cible : amateurs de vin, viticulteurs, jardiniers.
---
## Stack technique
| Couche | Mobile (VinEye) | Admin (vineye-admin) | ML |
|--------|----------------|---------------------|-----|
| Framework | React Native 0.81 + Expo SDK 54 | Next.js 16.2 | TensorFlow / Keras |
| Langage | TypeScript strict | TypeScript strict | Python 3 |
| Styling | NativeWind (Tailwind 3.4) + StyleSheet | Tailwind 4 + shadcn/ui | — |
| Navigation | React Navigation v7 | App Router | — |
| Images | expo-image | next/image | — |
| Gradients | expo-linear-gradient | — | — |
| Animations | react-native-reanimated 4.1 | — | — |
| Gestures | react-native-gesture-handler 2.28 | — | — |
| Edge-to-edge | expo-navigation-bar + expo-status-bar | — | — |
| Icones | lucide-react-native | lucide-react | — |
| Cache | AsyncStorage + cacheManager (TTL) | — | — |
| Reseau | expo-network (connectivite) | — | — |
| Toast | sonner-native | Sonner | — |
| Base de donnees | AsyncStorage (local) | PostgreSQL via Prisma 7.6 | — |
| Auth | — (local only) | Better Auth (JWT + sessions) | — |
| Forms | — | Zod validation | — |
| IA | Mock JS (intégration TFLite native échouée — build CMake Windows) | — | CNN MobileNetV2, 256×256 |
---
## Avancement global
### Application mobile — 95% complete
| Feature | Status | Detail |
|---------|--------|--------|
| Navigation (14 ecrans) | Done | Bottom tabs + FAB scanner + stack screens + 4 ecrans detail |
| HomeScreen | Done | Header, search, CTA, carousel maladies, alertes, guides |
| Scanner (camera) | Done | Capture photo, overlay detection, confidence meter |
| Resultats scan | Done | Affichage cepage, confiance, tags, grille infos |
| MyPlants (ex-Library) | Done | Liste scans groupes par date (today/yesterday/week/month/older), swipe-to-action (favori+suppr), recherche, pull-to-refresh, empty state CTA |
| ScanDetailScreen | Done | Hero immersif 380px, carte resultat + barre confiance animee, carte cepage conditionnelle, meta card (date+XP), location card (stub), share/delete actions |
| Profil utilisateur | Done | Avatar, stats Bento 2x2, XP, niveau |
| Parametres | Done | Theme, langue, notifications, referral |
| Guides maladies | Done | Connecte a l'API backend, SmallDiseaseCard en grille sur l'ecran Guides, icones Lucide par maladie, dot severite, degrade bordure |
| Guides pratiques | Done | 3 guides avec contenu structure, GuideListItem iOS-style avec icones par categorie, stagger animations |
| Pages de detail | Done | DiseaseDetailScreen, GuideDetailScreen — hero immersif, edge-to-edge, animation d'entree |
| Edge-to-edge | Done | Contenu defile derriere status bar, navigation bar transparente (Android), useSafeAreaInsets |
| Transitions navigation | Done | Fade 250ms par defaut, slide_from_bottom pour modal Result, gesture back active |
| API mobile | Done | Service API centralise (apiGet), cache AsyncStorage avec TTL, detection IP automatique Expo |
| Connectivite reseau | Done | Hook useNetworkStatus (expo-network), NetworkContext, detection online/offline temps reel |
| Toast | Done | sonner-native, toasts auto offline/online, variantes success/error/warning/info |
| Sync maladies | Done | useDiseases/useDiseaseDetail : API → cache → fallback local, pull-to-refresh |
| Sync guides | Done | useGuides/useGuideDetail : meme strategie 3 niveaux |
| Cards maladies | Done | SmallDiseaseCard reutilisable, icones Lucide (Droplets, Snowflake, Skull...), dot severite anime, degrade bordure |
| List items guides | Done | GuideListItem iOS-style, icones par categorie (Leaf, Calendar, Grape), stagger animations |
| Skeleton loading | Done | Composants shimmer pour cards maladies, list items guides, carousel |
| Gamification | Done | 7 niveaux, 7 badges, XP, streaks, decouvertes |
| i18n (FR + EN) | Done | Toutes les cles traduites (maladies enrichies + guides sections + tips) |
| Notifications | Partiel | UI uniquement, pas de push notifs |
| Carte/Map | Partiel | Placeholder, geoloc non implementee |
| Inference IA reelle | Bloque | Code mobile pret + libs installees, mais build CMake echoue sur Windows (path-too-long sur node_modules/react-native-fast-tflite). Voir Points critiques. |
### Dashboard admin — 95% complete
| Feature | Status | Detail |
|---------|--------|--------|
| Authentification | Done | Login email/password, sessions 7j, middleware |
| Dashboard stats | Done | Compteurs, scans recents, top maladies (Recharts) |
| CRUD Maladies enrichi | Done | Formulaire 7 sections : infos, symptomes, timeline visuelle, details techniques (accordeon), images par URL, apparence, publication |
| CRUD Guides enrichi | Done | Formulaire 5 sections : infos, contenu ancien (deprecie), editeur sections structurees (reorder, delete, tip, image), apparence, publication |
| Gestion alertes | Done | Alertes saisonnieres, region, dates, toggle actif |
| Gestion utilisateurs | Done | Liste paginee, stats, ban/unban, roles |
| API REST admin | Done | Endpoints complets pour diseases, guides, alerts, scans, users |
| API mobile publique | Done | 4 endpoints GET sans auth (/api/mobile/diseases, guides + detail par slug), CORS, pagination, cache headers |
| Schema DB enrichi | Done | Disease : +timeline, +conditions[], +actions[], +impactedParts[], +DiseaseImage[]. Guide : +readTime, +coverImage, +GuideSection[] |
### Pipeline ML — 60% complete
| Feature | Status | Detail |
|---------|--------|--------|
| Architecture CNN | Done | 4 blocs conv + classification, 3.8M params |
| Dataset | Done | 9 027 images, 4 classes (Black Rot, ESCA, Healthy, Leaf Blight) |
| Entrainement | Done | 100 epochs, Adam lr=0.001, augmentation |
| Precision modele | A ameliorer | ~30% (surapprentissage probable vers ESCA) |
| Export TFLite | Done | grapevine_v1.tflite (9 MB) embarque dans assets mobile |
| Integration mobile | Bloque | Code mobile pret + libs installees, mais build CMake natif echoue (Windows path-too-long sur le sous-projet react-native-fast-tflite) |
---
## Points critiques
### 1. Inference IA — Modele branche, qualite a ameliorer
**Status** : modele branche et fonctionnel via `react-native-fast-tflite`. MAIS le
modele actuel a ~25% de validation accuracy (overfitting massif diagnostique).
Les predictions sont donc souvent erronees en conditions reelles.
**Stack mobile** :
- `react-native-fast-tflite ^3.0.1` + `react-native-nitro-modules ^0.35.6`
- Modele : `VinEye/src/assets/models/grapevine_v1.tflite` (9 MB, MobileNetV2 256x256, 4 classes)
- Plugin Expo `withCmakeFix` pour les flags CMake (response files + ninja path)
qui evitent le bug "path too long" sur Windows lors du build C++ Nitro
- Fallback gracieux : si chargement modele echoue, le service tombe sur
`mockDetection()` (random pondere) + log error console
**Prochaines actions** :
- Retrainer le modele (data augmentation, regularization, fix data leakage,
fine-tuning progressif de MobileNetV2)
- Voir `docs/audit_report.md` (a produire) pour le diagnostic complet
- Quand un nouveau .tflite sera pret, juste remplacer le fichier dans
`assets/models/grapevine_v1.tflite` (interface du service inchangee)
- Eventuellement : quantization int8 post-training pour passer de 9 MB a ~2.5 MB
### 2. Stockage images — PARTIELLEMENT RESOLU
Les DiseaseImage et GuideSection.image existent en DB avec des URLs. Il manque un systeme d'upload reel (S3/Cloudinary). Les images sont ajoutees par URL manuelle dans les formulaires admin.
### 3. Synchronisation mobile <-> serveur — PARTIELLEMENT RESOLU
Les maladies et guides se synchronisent via l'API mobile publique avec cache local et fallback offline. Il reste a implementer : auth mobile, sync des scans, sync des alertes.
### 4. Precision du modele ML
~30% de precision est insuffisant pour un usage reel. Le modele semble surfit vers la classe ESCA.
**Pistes :**
- Augmenter et equilibrer le dataset
- Experimenter d'autres architectures (ResNet, EfficientNet transfer learning)
- Cross-validation + early stopping
- Analyser la matrice de confusion par classe
### 5. Absence de tests
Aucun test unitaire ou d'integration dans aucune partie du projet (mobile, admin, ML).
### 6. Images placeholder
Les images des maladies et cepages utilisent des URLs Unsplash generiques (vignobles, raisins, feuilles). A remplacer par de vraies photos agronomiques specifiques a chaque maladie (stockage local ou distant).
### 7. Formulaires admin enrichis — DONE
Les formulaires CRUD pour maladies et guides reflètent tous les champs du schema enrichi (timeline, conditions, actions, sections structurees, images). Validation Zod côte serveur.
---
## Features detaillees
### Gamification (mobile)
| Element | Detail |
|---------|--------|
| Niveaux | 7 : Bourgeon → Vendangeur → Amateur → Sommelier → Expert → Maitre → Maitre de Chai |
| XP | +10 scan, +25 nouveau cepage, +5 streak, +5 confiance >90% |
| Badges | 7 : Premier Scan, Connaisseur, En Feu, Oeil Affute, Explorateur, Perfectionniste, Maitre |
| Streaks | Scans quotidiens consecutifs |
### Base de maladies (7)
| Maladie | Type | Severite |
|---------|------|----------|
| Mildiou | Fongique | Haute |
| Oidium | Fongique | Haute |
| Black Rot | Fongique | Haute |
| ESCA | Fongique | Moyenne |
| Botrytis | Fongique | Moyenne |
| Flavescence Doree | Bacterien | Haute |
| Chlorose | Abiotique | Basse |
### Base de cepages (~15)
Varietes francaises avec : nom FR/EN, couleur, regions, caracteristiques. Utilises pour l'affichage post-scan (mock actuel attribue un cepage aleatoire quand result=vine).
### Schema base de donnees (admin)
```
User (better-auth + role, xp, level, banned)
├── Session
├── Account
└── Scan* ──→ Disease?
Disease (slug, name FR/EN, type, severity, symptoms, treatment, published)
Guide (slug, title FR/EN, content, category, order, published)
SeasonAlert (title FR/EN, type, region, active, dateRange)
```
### API REST (admin)
| Methode | Endpoint | Description |
|---------|----------|-------------|
| GET/POST | `/api/diseases` | Liste / creation |
| GET/PUT/DELETE | `/api/diseases/[id]` | Detail / edition / suppression |
| GET/POST | `/api/guides` | Liste / creation |
| GET/PUT/DELETE | `/api/guides/[id]` | Detail / edition / suppression |
| GET/POST | `/api/alerts` | Liste / creation |
| GET/PUT/DELETE | `/api/alerts/[id]` | Detail / edition / suppression |
| GET/POST | `/api/scans` | Liste / creation |
| GET/PUT/DELETE | `/api/scans/[id]` | Detail / edition / suppression |
| GET | `/api/users` | Liste utilisateurs |
| GET | `/api/users/[id]` | Detail utilisateur |
---
## Design System (mobile)
| Token | Valeur |
|-------|--------|
| Fond app | `#F8F9FB` |
| Cards | `#FFFFFF`, radius 24-32, border `#F0F0F0` |
| Primary (vert vigne) | `#2D6A4F` (800), `#1B4332` (900) |
| Accent (violet raisin) | `#8E24AA` (700), `#6A0572` (800) |
| Texte principal | `#1A1A1A` |
| Texte secondaire | `#8E8E93` |
| Style | Bento Box minimaliste, espaces genereux |
---
## Arborescence du projet
```
Grapevine_Disease_Detection/
├── VinEye/ # App mobile React Native + Expo
│ ├── App.tsx # Point d'entree
│ ├── src/
│ │ ├── screens/ # 14 ecrans (+ DiseaseDetail, GuideDetail, ScanDetail, MyPlants)
│ │ ├── components/ # UI (ui/, home/, scanner/, gamification/, history/, guides/, my-plants/, disease/)
│ │ ├── config/ # api.ts (base URL dynamique Expo)
│ │ ├── contexts/ # NetworkContext, ToastContext
│ │ ├── services/ # tflite, storage, haptics
│ │ ├── services/api/ # client.ts, diseases.ts, guides.ts, mappers.ts
│ │ ├── services/cache/ # cacheManager.ts (AsyncStorage TTL)
│ │ ├── hooks/ # useDetection, useGameProgress, useHistory, useScanDetail, useDiseases, useGuides, useNetworkStatus
│ │ ├── navigation/ # RootNavigator, BottomTabNavigator
│ │ ├── i18n/ # fr.json, en.json
│ │ ├── theme/ # colors, typography, spacing
│ │ ├── data/ # diseases.ts, guides.ts
│ │ ├── types/ # detection, gamification, navigation
│ │ └── utils/ # cepages, achievements, dateGrouping, diseaseIcons, guideIcons
│ ├── app.json # Config Expo
│ └── package.json
├── vineye-admin/ # Dashboard admin Next.js
│ ├── app/
│ │ ├── (admin)/ # Routes protegees (dashboard, diseases, guides, alerts, users)
│ │ ├── (auth)/login/ # Page de connexion
│ │ └── api/ # Routes API REST
│ ├── components/ # UI admin (shadcn/ui)
│ ├── components/admin/ # disease-form.tsx, guide-form.tsx (formulaires enrichis)
│ ├── app/api/mobile/ # Endpoints publics pour l'app mobile
│ │ ├── diseases/ # route.ts, [slug]/route.ts
│ │ └── guides/ # route.ts, [slug]/route.ts
│ ├── lib/ # auth.ts, prisma.ts, utils.ts, validations.ts
│ ├── prisma/schema.prisma # Schema DB enrichi (Disease, Guide, DiseaseImage, GuideSection)
│ └── package.json
├── docs/images/ # Documentation dataset
├── venv/ # Environnement Python (training ML)
└── PROJECT_SUMMARY.md # Ce fichier
```
---
## Prochaines etapes prioritaires
1. **Ameliorer le modele ML** — Passer de ~30% a >80% de precision (transfer learning, dataset equilibre)
2. **Integrer TFLite dans l'app** — Remplacer le mock par le vrai modele
3. **Stockage images** — S3 ou Cloudinary pour les photos (remplacer les URLs manuelles)
4. **Auth mobile + sync scans** — Connecter les scans a l'API (auth mobile, queue offline)
5. **Sync alertes** — Connecter les alertes saisonnieres au backend
6. **Push notifications** — Firebase Cloud Messaging
7. **Tests** — Ajouter des tests unitaires et d'integration
8. **Carte des maladies** — Implementer la feature Map avec donnees geoloc reelles