Aplicación móvil con deep learning para la clasificación de frutos de cacao con pudrición negra, daño por pod borer y estado saludable
- José Luis La Torre Romero (AdminLTR)
- Asthri Joanne Pardave Jara (AsthriPardave)
- Bruno Pumapillo Sarmiento (Brun0West)
- Diego Alonso Calderon Mathias (DiegoKeiO)
- Kiltom Adolfo Paucar (Awholf)
CacaoLens/
├── frontend/ # Aplicación Flutter
├── backend/
│ ├── backend/ # API REST con ExpressJS + Prisma + MySQL
│ └── ML-service/ # Servicio ML Flask para predicciones
├── ML/ # Código de entrenamiento del modelo
├── docker-compose.yml
└── start.bat/start.sh # Scripts de inicio rápido
- ExpressJS: Framework web para Node.js
- Prisma ORM: ORM moderno para TypeScript/JavaScript
- MySQL: Base de datos relacional
- Arquitectura MVC: Separación de responsabilidades
- Flask: API ligera para Python
- TensorFlow/Keras: Framework de Deep Learning
- OpenCV: Procesamiento de imágenes
- InceptionV3: Modelo CNN pre-entrenado
- Flutter: Framework multiplataforma
- Provider: Gestión de estado
- Material Design 3: Diseño moderno
Windows:
start.batLinux/Mac:
chmod +x start.sh
./start.sh- Docker & Docker Compose
- Git
- Clonar el repositorio
git clone https://github.com/adminLTR/CacaoLens.git
cd CacaoLens- Configurar variables de entorno
# Copiar archivos de ejemplo
cp .env.example .env
cp backend/backend/.env.example backend/backend/.env
cp backend/ML-service/.env.example backend/ML-service/.env
cp ML/.env.example ML/.env
cp frontend/.env.example frontend/.env
# Editar los archivos .env con tus configuraciones- Construir y ejecutar con Docker
# Construir las imágenes
docker-compose build
# Iniciar los servicios
docker-compose up -d
# Ver los logs
docker-compose logs -f- Inicializar la base de datos
El backend se encarga automáticamente de:
- ✅ Generar el cliente de Prisma
- ✅ Sincronizar el esquema con
prisma db push - ✅ Ejecutar seeders con datos iniciales (upsert)
Esto ocurre en cada inicio del backend gracias al entrypoint.sh.
Para agregar datos de prueba, edita backend/prisma/seed.js:
# Ver logs del proceso de seeding
docker-compose logs backendUna vez iniciados los contenedores:
- Backend API: http://localhost:3000
- ML Service: http://localhost:8000
- MySQL: localhost:3306
El frontend de Flutter es una aplicación móvil nativa (APK) que se compila con Docker pero no se ejecuta como servicio web. Para usarla, debes compilar e instalar el APK en un dispositivo Android o emulador.
Compilación rápida del APK:
# Windows
.\build-apk.ps1# Linux/Mac (crear script similar o usar comandos manuales)
docker-compose build frontendEl APK compilado estará en: apk-output/cacaolens.apk
Instalación:
# Con ADB (dispositivo conectado por USB)
adb install apk-output/cacaolens.apk
# O transfiere el archivo APK manualmente a tu dispositivo📖 Documentación completa: Ver BUILD-APK.md para instrucciones detalladas
Para desarrollo de la app móvil sin Docker:
cd frontend
# Instalar dependencias
flutter pub get
# Ejecutar en desarrollo
flutter run
# Para Android
flutter run -d android
# Para iOS
flutter run -d ios# Instalar dependencias
npm install
# Desarrollo
npm run dev
# Producción
npm start
# Prisma
npm run prisma:generate
npm run prisma:push # Sincronizar esquema
npm run seed # Ejecutar seeders# Instalar dependencias
pip install -r requirements.txt
# Ejecutar API
python app.py
# Modelo local
# El servicio intenta cargar primero un .tflite y luego un .keras:
# models/Cacao_InceptionV3_best.tflite
# models/Cacao_InceptionV3_best.keras
# Recargar el modelo
curl -X POST http://localhost:8000/reload-model- Preparar el dataset
ML/data/
├── train/
│ ├── saludable/
│ ├── pudricion_negra/
│ └── pod_borer/
└── validation/
├── saludable/
├── pudricion_negra/
└── pod_borer/
- Entrenar el modelo
# Usa el notebook/código de entrenamiento dentro de ML/src- Recargar el modelo en la API
curl -X POST http://localhost:8000/reload-model# Iniciar servicios
docker-compose up -d
# Detener servicios
docker-compose down
# Reconstruir servicios
docker-compose up -d --build
# Ver logs de un servicio específico
docker-compose logs -f backend
docker-compose logs -f ml-service
docker-compose logs -f frontend
# Acceder al contenedor
docker-compose exec backend sh
docker-compose exec ml-service bashPOST /api/auth/register- Registrar usuarioPOST /api/auth/login- Iniciar sesiónPOST /api/auth/logout- Cerrar sesiónGET /api/auth/profile- Obtener perfil autenticadoPUT /api/auth/profile- Actualizar perfil autenticadoPUT /api/auth/change-password- Cambiar contraseñaDELETE /api/auth/account- Desactivar cuenta
POST /api/analysis/image- Analizar imagenGET /api/analysis- Obtener historial de análisisGET /api/analysis/:id- Obtener análisis específico
GET /- Estado del servicioGET /health- Health checkPOST /predict- Predecir desde imagenPOST /reload-model- Recargar modelo
┌─────────────┐
│ Flutter │
│ Frontend │
└──────┬──────┘
│
▼
┌─────────────┐ ┌──────────────┐
│ Express │────▶│ MySQL │
│ Backend │ │ Database │
└──────┬──────┘ └──────────────┘
│
▼
┌─────────────┐
│ Flask │
│ ML Service │
└─────────────┘
- Cambiar todas las credenciales por defecto en producción
- Usar variables de entorno para datos sensibles
- Implementar autenticación JWT para el backend
- Configurar CORS apropiadamente
- Usar HTTPS en producción
- Las migraciones de Prisma se aplican automáticamente al iniciar
- El schema se encuentra en
backend/prisma/schema.prisma
- El modelo base usa una arquitectura CNN simple
- El modelo entrenado se guarda en
ML/models/
- Usa Provider para gestión de estado
- Arquitectura en capas: screens, providers, services, widgets
- Responsive design con Material Design 3
- Fork el proyecto
- Crea tu rama de feature (
git checkout -b feature/AmazingFeature) - Commit tus cambios (
git commit -m 'Add some AmazingFeature') - Push a la rama (
git push origin feature/AmazingFeature) - Abre un Pull Request
Este proyecto está bajo la licencia MIT.