Spaces:
Sleeping
Sleeping
File size: 6,372 Bytes
00d1906 e63801c 00d1906 e63801c 00d1906 e63801c 00d1906 955474c e63801c |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 |
---
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() |