FlavioRubensOttaviani's picture
Update README.md
ad45e1a verified
metadata
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

🚀 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

image

💻 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:

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.