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

15 KiB
Raw Permalink Blame History

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