Sistema de Inspección y Clasificación Automatizada de Plátanos en el Sector Agrícola mediante Visión Artificial
Integrantes:
- Alex Durán de Huerta Jiménez - Código de estudiante: 23310378
- Luis Arturo Curiel Rodriguez - Código de estudiante: 23310320
- Descripción del Proyecto
- Caso de Estudio: Optimización en el Campo Agrícola
- Requisitos del Sistema
- Instrucciones de Instalación y Uso
Este proyecto implementa un sistema inteligente de visión artificial basado en la arquitectura YOLOv8 para la automatización del control de calidad del plátano directamente en las fases de postcosecha y empaque. A diferencia de los sistemas de clasificación convencionales que solo detectan la presencia del fruto, este modelo realiza un análisis multiclase avanzado para inspeccionar la superficie, estructura y madurez de cada unidad, integrando un módulo de conteo estadístico para auditar los defectos en tiempo real.
En el sector agrícola, la clasificación del plátano posterior a la corta se realiza mayoritariamente de forma manual por operadores humanos. Este método tradicional presenta serias desventajas:
- Alta variabilidad y subjetividad: Fatiga visual y criterios inconsistentes entre operarios al evaluar defectos.
- Daños mecánicos inadvertidos: Raspones leves o microfisuras en el tallo pasan desapercibidos, pudriendo lotes enteros durante el transporte marítimo.
- Falta de métricas en tiempo real: Imposibilidad de cuantificar con precisión matemática cuántos defectos presenta cada pieza para asignarle una categoría de calidad exacta (Premium, Primera, Segunda o Desecho), lo que genera pérdidas por penalizaciones comerciales o devoluciones.
Para desplegar el modelo entrenado en un entorno real de empacadora agrícola, se plantea la integración de la siguiente arquitectura de hardware:
- Sistema de Captura de Imagen (Cámaras): Se proponen 3 cámaras industriales de visión artificial de grado IP67 (resistentes a humedad y polvo del campo), equipadas con sensores Sony IMX y lentes de longitud focal fija para evitar distorsiones. Están dispuestas en un túnel de inspección a 120° una de otra para obtener una reconstrucción visual de 360° del plátano.
- Unidad de Procesamiento Analítico: Computadora embebida industrial dotada de una GPU NVIDIA Jetson Orion Nano (de 8 GB de RAM). Este hardware permite ejecutar la red neuronal YOLOv8 de manera local (Edge Computing) con una latencia mínima, procesando el flujo de video a más de 30 fotogramas por segundo sin requerir conexión a internet.
- Iluminación Controlada: Difusores de luz LED tipo Dome Light de alta intensidad para eliminar sombras complejas, destellos por la humedad natural de la cáscara y garantizar que el color de la madurez se evalúe bajo un estándar constante.
- Actuadores y Maquinaria Automática: Un controlador lógico programable (PLC) conectado a la Jetson mediante el protocolo Modbus TCP. El PLC recibe las señales de clasificación y activa pistones neumáticos eyectores o compuertas mecánicas al final de la banda transportadora para desviar físicamente el producto a su respectivo contenedor de calidad.
El proceso de inspección automatizada se rige bajo la siguiente secuencia lógica:
- Transporte y Detección de Proximidad: Los plátanos avanzan colgados de un polipasto o sobre una banda transportadora de velocidad regulada. Un sensor fotoeléctrico detecta la entrada del fruto al túnel de iluminación.
-
Captura y Preprocesamiento: Las cámaras capturan imágenes simultáneas de alta resolución al recibir el disparo del sensor. El frame se escala a
$640 \times 640$ píxeles para coincidir con la entrada nativa del modelo. -
Inferencia de la Red Neuronal (YOLOv8): El modelo evalúa los vectores visuales e identifica las cajas delimitadoras de las siguientes clases:
- Madurez: Clasifica el fondo cromático en Dulce (apto para anaquel inmediato) o No Dulce (verde/maduración en transporte).
- Defectos de Superficie: Localiza y segmenta zonas con Raspado o Manchas.
- Defectos Críticos: Identifica áreas con Daño en el tallo, Manchas de daño o estructura Abierta.
- Conteo Estadístico y Clasificación: El script analiza el arreglo de salida. Si la clase Abierto o Daño en el tallo es mayor o igual a 1, se etiqueta instantáneamente como Desecho. Si los contadores de Raspado o Manchas superan un umbral tolerable establecido por la norma agrícola, se clasifica como Segunda. Si el fruto está limpio y en estado óptimo, se etiqueta como Premium.
- Acción Física: La Jetson envía la palabra de estado al PLC indicando la categoría asignada. El PLC calcula el tiempo de retraso basado en la velocidad de la banda y activa el pistón neumático correspondiente, depositando de forma automatizada el plátano en su contenedor final de destino.
- Python 3.8 o superior
- Cuenta gratuita en Roboflow (para descargar el dataset del proyecto
comvis-banana/comvis-banana-2) - Entorno con soporte CUDA (opcional — acelera el entrenamiento; el proyecto también corre en CPU, solo que más lento)
- Clonar el repositorio
git clone https://github.com/tu_usuario/PROYECTO_23310320_23310378_6F
cd PROYECTO_23310320_23310378_6F- Crear e inicializar un entorno virtual
python -m venv env
# En Windows:
env\Scripts\activate
# En Linux/macOS:
source env/bin/activate- Instalar las dependencias
pip install -r requirements.txtEsto instala roboflow (descarga del dataset) y ultralytics (entrenamiento e inferencia con YOLOv8).
-
Configurar tu clave de API de Roboflow
Por seguridad, la API key no debe quedar escrita en el código que subes a GitHub. Defínela como variable de entorno:
# Linux/macOS
export ROBOFLOW_API_KEY="tu_api_key_aqui"
# Windows (PowerShell)
$env:ROBOFLOW_API_KEY="tu_api_key_aqui"Tu clave personal se obtiene gratis en: https://app.roboflow.com/settings/api
- Descargar el dataset y entrenar el modelo
from roboflow import Roboflow
import os
rf = Roboflow(api_key=os.environ["ROBOFLOW_API_KEY"])
project = rf.workspace("comvis-banana").project("comvis-banana-2")
version = project.version(1)
dataset = version.download("yolov8") # ver nota abajo
import ultralytics
ultralytics.checks() # verifica si hay GPU disponible o se usará CPU
from ultralytics import YOLO
model = YOLO('yolov8n.pt')
results = model.train(
data=f"{dataset.location}/data.yaml",
epochs=30,
imgsz=640,
plots=True
)- Probar el modelo con una imagen de ejemplo
!wget -nc <URL_de_una_imagen_de_platanos> -O imagen_prueba.jpg
from PIL import Image
results = model('imagen_prueba.jpg')
for r in results:
im_array = r.plot()
im = Image.fromarray(im_array[..., ::-1])
display(im)Las imágenes resultantes (con bounding boxes y nivel de maduración) se guardan automáticamente en runs/detect/.