Spaces:
Sleeping
Sleeping
| title: Fruit Classifier | |
| emoji: 🍏 | |
| colorFrom: green | |
| colorTo: gray | |
| sdk: gradio | |
| sdk_version: 5.28.0 | |
| app_file: app.py | |
| pinned: false | |
| # Fruit Classifier | |
| Este es un clasificador de frutas entrenado desde cero con un modelo CNN utilizando TensorFlow. | |
| ### Descripción | |
| Este modelo es capaz de clasificar imágenes de frutas en tres categorías: Manzana, Banana y Naranja. | |
| ### Uso | |
| 1. Carga una imagen de una fruta (manzana, banana, naranja). | |
| 2. El modelo predecirá qué fruta es. | |
| 3. La salida será el nombre de la fruta. | |
| ### Modelo | |
| El modelo se entrenó utilizando un conjunto de imágenes de frutas y se guardó como un modelo `.keras` en Hugging Face. | |
| ### Tecnologías | |
| - TensorFlow | |
| - Gradio | |
| # Clasificador de Frutas con CNN (Keras/TensorFlow) | |
| Este repositorio contiene un clasificador de frutas basado en una red neuronal convolucional (CNN) entrenada desde cero utilizando Keras/TensorFlow. El modelo ha sido entrenado con un conjunto de datos de imágenes de frutas (manzanas, naranjas, plátanos, etc.) y está disponible públicamente en Hugging Face Model Hub. | |
| ## Descripción del Proyecto | |
| El objetivo de este proyecto es crear un modelo de aprendizaje automático capaz de clasificar imágenes de frutas en diferentes categorías, utilizando técnicas de procesamiento de imágenes y redes neuronales convolucionales (CNN). El modelo fue entrenado con un conjunto de imágenes de frutas y se almacenó en Hugging Face para su acceso y uso posterior. | |
| ## Pasos del Proyecto | |
| ### 1. Recolección y Preparación del Dataset | |
| #### **Dataset:** | |
| El conjunto de datos utilizado en este proyecto fue generado manualmente. El dataset consiste en imágenes de frutas (manzanas, naranjas y plátanos), con una cantidad limitada de imágenes (aproximadamente 8-9 imágenes por fruta para entrenamiento y 3 imágenes por fruta para validación). Las imágenes fueron recortadas y redimensionadas para ser de tamaño 150x150 píxeles. | |
| #### **Estructura del Dataset:** | |
| Las imágenes se organizaron en dos carpetas principales: | |
| - **training**: Contiene las imágenes de entrenamiento organizadas por categorías (manzanas, naranjas, plátanos). | |
| - **validation**: Contiene las imágenes de validación organizadas de manera similar. | |
| El dataset fue subido a Hugging Face Datasets para facilitar su acceso y compartirlo públicamente. | |
| ### 2. Creación del Modelo | |
| Se utilizó una red neuronal convolucional (CNN) para la clasificación de las imágenes. La arquitectura del modelo es simple, pero eficiente, y está diseñada para tareas de clasificación de imágenes. | |
| #### **Arquitectura del Modelo:** | |
| El modelo consta de varias capas convolucionales y de agrupamiento (pooling) para extraer características de las imágenes. A continuación se muestra la arquitectura: | |
| - **Capa 1:** Convolución 2D (32 filtros, tamaño 3x3), seguida de MaxPooling 2D. | |
| - **Capa 2:** Convolución 2D (64 filtros, tamaño 3x3), seguida de MaxPooling 2D. | |
| - **Capa 3:** Convolución 2D (128 filtros, tamaño 3x3), seguida de MaxPooling 2D. | |
| - **Capa 4:** Convolución 2D (256 filtros, tamaño 3x3), seguida de MaxPooling 2D. | |
| - **Capa de Aplanado (Flatten):** Convierte las salidas 2D en un vector 1D. | |
| - **Capa Densa:** Capa densa de 256 neuronas con activación ReLU. | |
| - **Capa de Salida:** Capa densa con tantas neuronas como clases de frutas (3 clases en este caso: manzana, naranja, plátano), usando activación softmax. | |
| #### **Compilación del Modelo:** | |
| El modelo fue compilado utilizando el optimizador **SGD** (Stochastic Gradient Descent) con una tasa de aprendizaje de 0.003 y momentum de 0.9. La función de pérdida utilizada es **categorical_crossentropy**, adecuada para tareas de clasificación multiclase. | |
| #### **Regularización:** | |
| Se utilizó **Dropout** en la capa densa para reducir el riesgo de sobreajuste (overfitting) durante el entrenamiento. | |
| ### 3. Entrenamiento del Modelo | |
| El modelo fue entrenado durante 100 épocas con un tamaño de batch de 8 imágenes. Se aplicó un proceso de **data augmentation** (aumento de datos) durante el entrenamiento, lo cual permite mejorar la generalización del modelo al generar variaciones en las imágenes de entrenamiento (rotaciones, cambios de brillo, desplazamientos, etc.). | |
| Durante el proceso de entrenamiento, se utilizó la técnica de **early stopping** para evitar el sobreajuste, deteniendo el entrenamiento si la pérdida de validación no mejoraba durante 7 épocas consecutivas. | |
| ### 4. Guardado y Carga del Modelo | |
| Una vez entrenado, el modelo se guardó como un archivo `.h5` para ser utilizado posteriormente. Además, el modelo fue cargado a Hugging Face Model Hub para compartirlo con la comunidad. | |
| #### **Archivo Guardado:** | |
| El modelo se guardó como `modelo_frutas_transfer.keras` en el repositorio de Hugging Face. | |
| ### 5. Creación de la Demo en Hugging Face Spaces | |
| Para crear una interfaz pública para interactuar con el modelo, se utilizó **Gradio**. Gradio es una biblioteca de Python que permite crear interfaces de usuario interactivas con facilidad. | |
| #### **Interfaz Gradio:** | |
| La demo permite cargar una imagen de fruta y el modelo devuelve la clasificación de la fruta (manzana, naranja o plátano). La interfaz se implementó de la siguiente manera: | |
| ```python | |
| import gradio as gr | |
| import tensorflow as tf | |
| from tensorflow.keras.models import load_model | |
| from tensorflow.keras.preprocessing import image | |
| import numpy as np | |
| # Cargar el modelo | |
| model = load_model('https://huggingface.co/imanolcb/basicFruitClassifier/resolve/main/modelo_frutas_transfer.keras') | |
| # Función para la predicción | |
| def predict(img): | |
| img = image.load_img(img, target_size=(150, 150)) | |
| img_array = image.img_to_array(img) / 255.0 # Normalización | |
| img_array = np.expand_dims(img_array, axis=0) # Cambiar la forma para predicción | |
| prediction = model.predict(img_array) | |
| class_names = ['manzana', 'naranja', 'platano'] # Modificar con tus clases | |
| predicted_class = class_names[np.argmax(prediction)] | |
| return predicted_class | |
| # Interfaz de Gradio | |
| iface = gr.Interface(fn=predict, | |
| inputs=gr.Image(type="filepath"), | |
| outputs=gr.Text(), | |
| live=True, | |
| title="Clasificador de Frutas", | |
| description="Cargar una imagen de fruta para clasificarla.") | |
| # Iniciar la interfaz | |
| iface.launch() |