Este proyecto se centra en la clasificación de imágenes en diferentes categorías utilizando enfoques de aprendizaje profundo. Incluye el uso de:
- Clasificadores lineales para tareas iniciales de clasificación.
- Redes Neuronales Convolucionales (CNNs) diseñadas desde cero.
- Modelos preentrenados como EfficientNet, ajustados para el conjunto de datos utilizado.
El sistema fue entrenado y evaluado con el conjunto de datos SUN20, que incluye 20 categorías de imágenes balanceadas.
- Implementación de un clasificador lineal simple.
- Entrenamiento utilizando Stochastic Gradient Descent (SGD).
- Visualización de resultados iniciales.
- Definición de arquitecturas convolucionales personalizadas.
- Entrenamiento y evaluación en PyTorch.
- Ajuste de modelos preentrenados, como EfficientNet.
- Optimizaciones para mejorar la precisión en el conjunto de datos SUN20.
- Uso de transformaciones en las imágenes.
- Visualización de categorías y resultados en cuadrículas.
- Python 3.8 o superior.
- Instalar las dependencias del proyecto:
pip install torch torchvision matplotlib livelossplot
El proyecto utiliza el conjunto de datos SUN20, que contiene 20 categorías balanceadas. Para preparar el conjunto de datos:
- Descarga los archivos del conjunto de datos:
wget http://www.cs.rice.edu/~vo9/deep-vislang/SUN20-train-sm.tar.gz
wget http://www.cs.rice.edu/~vo9/deep-vislang/SUN20-val.tar.gz
- Extrae los archivos:
tar -xzf SUN20-train-sm.tar.gz
tar -xzf SUN20-val.tar.gz
- Organiza las carpetas siguiendo la estructura
SUN20/<split>/<categoría>/
.
- Configura el dataset y las transformaciones necesarias.
- Define el modelo lineal en PyTorch:
class LinearClassifier(nn.Module):
def __init__(self, input_size, num_classes):
super(LinearClassifier, self).__init__()
self.linear = nn.Linear(input_size, num_classes)
def forward(self, x):
return self.linear(x)
- Entrena el modelo utilizando SGD y analiza las curvas de aprendizaje.
- Diseña una arquitectura CNN personalizada:
class ConvnetClassifier(torch.nn.Module):
def __init__(self):
super(ConvnetClassifier, self).__init__()
self.conv1 = torch.nn.Conv2d(3, 128, (5, 5))
self.conv2 = torch.nn.Conv2d(128, 128, (3, 3))
self.linear1 = torch.nn.Linear(128 * 10 * 10, 256)
self.linear2 = torch.nn.Linear(256, 20)
def forward(self, x):
x = F.relu(F.max_pool2d(self.conv1(x), (2, 2)))
x = F.relu(F.max_pool2d(self.conv2(x), (2, 2)))
x = x.view(x.size(0), -1)
x = F.relu(self.linear1(x))
return self.linear2(x)
- Entrena el modelo con funciones de pérdida y optimizadores adecuados.
- Carga un modelo preentrenado y ajusta la última capa para adaptarlo al dataset:
from torchvision import models
model = models.efficientnet_v2_m(pretrained=True)
num_ftrs = model.classifier[1].in_features
model.classifier[1] = torch.nn.Linear(num_ftrs, 20)
- Entrena el modelo ajustado y evalúa su rendimiento.
- Clasificadores Lineales: Precisión inicial aproximada del 25%.
- Redes Neuronales Convolucionales: Mejoras en la precisión con arquitecturas personalizadas.
- Transfer Learning con EfficientNet: Precisión final de hasta el 91.5% después de 7 épocas.
- 📈 Gráficos de pérdida y precisión durante el entrenamiento.
- 📸 Visualización de predicciones con imágenes correctamente clasificadas (en verde) y mal clasificadas (en rojo).
Joanna Alexandra Carrión Pérez
- 🎓 Bachiller de Ingeniería Electrónica
- 💡 Apasionada por la Ciencia de Datos y la Inteligencia Artificial
- 🔗
LinkedIn
Para cualquier duda o sugerencia, contáctame a través de joannacarrion14@gmail.com.
¡Contribuciones son bienvenidas! Si tienes ideas o mejoras, no dudes en hacer un fork del repositorio y enviar un pull request. 🚀