FlavioRubensOttaviani's picture
Update README.md
ad45e1a verified
---
library_name: keras
tags:
- image-classification
- vision
- autonomous-driving
- deep-learning
- tensorflow
datasets:
- cifar10
language:
- it
license: mit
pipeline_tag: image-classification
framework: tensorflow
---
# 🚗 Autonomous Driving Object Detection (Vehicle & Animal)
Questo repository contiene un modello di **Deep Learning** basato su **Reti Neurali Convoluzionali (CNN)**, addestrato per riconoscere e distinguere **veicoli** da **animali** in immagini a bassa risoluzione. Il progetto simula un modulo di percezione visiva per sistemi di guida autonoma, utilizzando il dataset **CIFAR-10**.
## 📝 Descrizione del Progetto
Nei sistemi di guida autonoma, la capacità di identificare rapidamente gli ostacoli è fondamentale. Questo modello è stato progettato per classificare gli oggetti in due macro-categorie critiche per la sicurezza stradale:
* **Veicoli** (Automobili, Camion, Aerei, Navi) - Oggetti da seguire o evitare secondo le regole del traffico.
* **Animali** (Uccelli, Gatti, Cervi, Cani, Rane, Cavalli) - Ostacoli imprevedibili che richiedono cautela immediata.
Il modello è stato sviluppato utilizzando **TensorFlow/Keras** e addestrato su un sottoinsieme ri-etichettato del dataset CIFAR-10.
## 📊 Dataset & Preprocessing
Il modello utilizza il dataset **CIFAR-10**, composto da 60.000 immagini a colori 32x32 pixel.
Le 10 classi originali sono state raggruppate in due classi binarie per questo task:
- **Classe 0 (Veicoli):** Automobile, Camion, Aereo, Nave.
- **Classe 1 (Animali):** Uccello, Gatto, Cervo, Cane, Rana, Cavallo.
**Preprocessing applicato:**
1. **Normalizzazione:** I valori dei pixel sono stati scalati nel range [0, 1] (dividendo per 255.0) per facilitare la convergenza del modello.
2. **Flattening delle Label:** Le etichette sono state convertite in vettori 1D per compatibilità con la loss function.
## 🧠 Architettura del Modello
La rete neurale è una **CNN (Convolutional Neural Network)** sequenziale ottimizzata per immagini di piccole dimensioni:
* **Input Layer:** Immagini 32x32x3 (RGB).
* **Blocchi Convoluzionali:**
* 3 strati `Conv2D` (con 32, 64, 128 filtri) per l'estrazione delle feature.
* Attivazione `ReLU` per introdurre non-linearità.
* `MaxPooling2D` per ridurre la dimensionalità e mantenere le feature più rilevanti.
* **Classificatore (Fully Connected):**
* Strato `Flatten` per vettorizzare l'output delle convoluzioni.
* 3 strati `Dense` (128, 64, 32 unità) con attivazione `ReLU`.
* **Output Layer:** Strato `Dense` con 2 unità e attivazione `Softmax` per la classificazione finale.
![image](https://cdn-uploads.huggingface.co/production/uploads/653e5d737ef643534b40783e/wBK3OlsrzES6yIWMTg_CD.png)
## 🚀 Performance
Il modello è stato addestrato per **20 epoche** con i seguenti risultati (basati sull'ultima epoca di training):
- **Accuracy (Train):** ~99%
- **Accuracy (Validation):** ~94%
- **Loss:** Molto bassa sul training set, indicando un ottimo apprendimento, con una buona generalizzazione sul validation set.
![image](https://cdn-uploads.huggingface.co/production/uploads/653e5d737ef643534b40783e/43GaPzUyW5Koy5v8tsURD.png)
![image](https://cdn-uploads.huggingface.co/production/uploads/653e5d737ef643534b40783e/EVWWjkXhzDcxZY5db00Wh.png)
## 💻 Come Usare il Modello
1)Potete scaricare l'intero codice dal file Notebook (si consiglia di applicare la denormalizzazione).
2)Per testare il modello direttamente in Python, utilizzate lo script di inferenza seguente:
```python
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
from PIL import Image
import requests
from io import BytesIO
import os
URL_MODELLO = "[https://huggingface.co/FlavioRubensOttaviani/autonomous-driving-object-detection-deepLearning/resolve/main/modello_guida_autonoma_cifar10.h5](https://huggingface.co/FlavioRubensOttaviani/autonomous-driving-object-detection-deepLearning/resolve/main/modello_guida_autonoma_cifar10.h5)"
NOME_FILE_LOCALE = "modello_scaricato.h5"
if not os.path.exists(NOME_FILE_LOCALE):
r = requests.get(URL_MODELLO, timeout=15)
with open(NOME_FILE_LOCALE, 'wb') as f:
f.write(r.content)
model = tf.keras.models.load_model(NOME_FILE_LOCALE, compile=False)
def esegui_inferenza(url_immagine):
headers = {'User-Agent': 'Mozilla/5.0'}
response = requests.get(url_immagine, headers=headers, timeout=10)
img = Image.open(BytesIO(response.content)).convert('RGB')
img_resized = img.resize((32, 32))
img_array = np.array(img_resized).astype('float32') / 255.0
img_input = np.expand_dims(img_array, axis=0)
preds = model.predict(img_input, verbose=0)[0]
label = "VEICOLO 🚗" if preds[0] > preds[1] else "ANIMALE 🐕"
conf = max(preds) * 100
plt.imshow(img)
plt.title(f"{label} ({conf:.2f}%)")
plt.axis('off')
plt.show()
URL_TEST = "[https://raw.githubusercontent.com/YoongiKim/CIFAR-10-images/master/test/automobile/0001.jpg](https://raw.githubusercontent.com/YoongiKim/CIFAR-10-images/master/test/automobile/0001.jpg)"
esegui_inferenza(URL_TEST)
## 👨‍💻 Autore
**Flavio Rubens Ottaviani**
Progetto sviluppato per il corso di Deep Learning e Reti Neurali Artificiali.