|
|
--- |
|
|
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. |
|
|
|
|
|
|
|
|
 |
|
|
|
|
|
## 🚀 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. |
|
|
|
|
|
|
|
|
 |
|
|
|
|
|
 |
|
|
|
|
|
## 💻 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. |