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