FruitClassifier / README.md
imanolcb's picture
Update README.md
e63801c verified

A newer version of the Gradio SDK is available: 6.3.0

Upgrade
metadata
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:

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()