Panoramica del Progetto
Ho recentemente completato il corso "Machine Learning and Data Science Bootcamp" di Zero To Mastery Academy e ho sviluppato un'estensione del progetto finale - un classificatore di razze canine chiamato "Dog Vision". Mentre il corso richiedeva la creazione di un modello di deep learning con TensorFlow 2.0 capace di classificare oltre 100 razze di cani utilizzando Google Colab, mi sono spinta oltre sviluppando un'applicazione web interattiva completa con Streamlit che rende questa tecnologia accessibile a tutti.
Implementazione Tecnica
Panoramica dell'Architettura
Il progetto è composto da due componenti principali:
- Un modello di deep learning costruito con TensorFlow che classifica le razze di cani
- Un'applicazione web Streamlit che fornisce un'interfaccia intuitiva per il modello
Modello di Deep Learning
Il modello è stato costruito utilizzando il seguente approccio tecnico:
Preprocessing dei Dati
L'applicazione preelabora le immagini caricate per adattarle all'input richiesto dal modello:
- Ridimensionamento delle immagini a 224x224 pixel (dimensione standard per molti modelli di computer vision)
- Normalizzazione dei valori dei pixel dividendo per 255 per portarli nell'intervallo [0,1]
- Conversione al tipo di dati float32 per compatibilità con TensorFlow
def prepare_image(image, img_size=224):
"""
Prepara un'immagine per il modello:
1. Ridimensiona a img_size x img_size
2. Normalizza
"""
image = tf.image.resize(image, [img_size, img_size])
return tf.cast(image, tf.float32) / 255.0
Code language: PHP (php)
Rilevamento e Classificazione in Due Fasi
Un miglioramento tecnico chiave che ho apportato è stata l'implementazione di una pipeline di modelli a due fasi:
- Fase di Rilevamento del Cane: Prima di procedere con la classificazione della razza, l'app verifica che l'immagine contenga effettivamente un cane utilizzando un modello MobileNetV2 pre-addestrato su ImageNet. Questo sfrutta il fatto che le classi da 151 a 268 in ImageNet corrispondono a razze di cani.
- Fase di Classificazione della Razza: Una volta confermata la presenza di un cane, l'app procede con la previsione della razza utilizzando un modello personalizzato fine-tuned.
def is_dog(image, model):
img_array = tf.keras.preprocessing.image.img_to_array(image)
img_resized = tf.image.resize(img_array, (224, 224))
img_expanded = tf.expand_dims(img_resized, 0)
img_preprocessed = tf.keras.applications.mobilenet_v2.preprocess_input(img_expanded)
predictions = model.predict(img_preprocessed)
dog_class_indices = range(150, 268)
dog_probability = np.sum(predictions[0][dog_class_indices])
return dog_probability > 0.5, dog_probability
Code language: PHP (php)
Architettura del Modello
Il modello di classificazione delle razze è stato costruito utilizzando il transfer learning con MobileNetV2:
- Modello Base: MobileNetV2 pre-addestrato con pesi da ImageNet
- Layer di Output: Layer denso con 120 unità (una per ogni razza di cane) con attivazione softmax
- Funzione di Loss: Categorical Crossentropy
- Ottimizzatore: Adam
Implementazione dell'App Streamlit
L'applicazione Streamlit fornisce un'interfaccia pulita e intuitiva con diverse funzionalità chiave:
- Interfaccia Utente: Un design responsive con istruzioni chiare per gli utenti su come ottenere le migliori previsioni (utilizzando foto chiare, mostrando un solo cane, ecc.)
- Supporto per Immagini Multiple: L'app gestisce più caricamenti di immagini contemporaneamente, elaborando ciascuna in modo indipendente e visualizzando i risultati in modo organizzato.
- Visualizzazione dei Risultati: Per ogni immagine caricata, l'app:
- Mostra l'immagine originale
- Visualizza il punteggio di confidenza del rilevamento del cane
- Presenta la razza prevista con percentuale di confidenza
- Genera un grafico a barre interattivo delle 10 razze più probabili
- Offre l'opzione di visualizzare l'immagine preelaborata
La visualizzazione utilizza Altair per creare grafici interattivi con tooltip ed evidenzia la razza con la confidenza più alta in verde per una migliore esperienza utente.
Caricamento e Caching del Modello
Per ottimizzare le prestazioni dell'applicazione, ho implementato:
- Caching del Modello: Utilizzo del decoratore
@st.cache_resource
di Streamlit per caricare i modelli di deep learning solo una volta
- Caching dei Dati: Utilizzo del decoratore
@st.cache_data
per caricare le etichette delle razze e altri dati statici
- Definizione di Oggetti Personalizzati: Gestione corretta del KerasLayer di TensorFlow Hub durante il caricamento del modello
@st.cache_resource
def load_dog_breed_model():
"""
Carica il modello salvato con supporto per KerasLayer.
"""
import tensorflow_hub as hub
from tensorflow.keras.models import load_model
custom_objects = {'KerasLayer': hub.KerasLayer}
model = load_model('modello.h5', custom_objects=custom_objects)
return model
Code language: PHP (php)
Pipeline di Previsione
Il flusso di lavoro completo della previsione segue questi passaggi:
- L'utente carica un'immagine
- L'immagine viene convertita in un tensore
- Il modello di rilevamento del cane valuta se è presente un cane
- Se viene rilevato un cane, l'immagine viene preparata (ridimensionata e normalizzata)
- Il modello di classificazione della razza effettua le previsioni
- I risultati vengono elaborati per estrarre:
- La razza prevista (classe con probabilità più alta)
- Punteggio di confidenza
- Le 10 razze più probabili
- I risultati vengono visualizzati attraverso l'UI
Sfide Tecniche e Soluzioni
- Integrazione del Modello a Due Fasi: L'implementazione del modello di rilevamento del cane prima della classificazione della razza ha migliorato l'accuratezza filtrando le immagini che non contengono cani. Questo ha richiesto un'attenta integrazione di due modelli separati con requisiti di preprocessing diversi.
- Deployment del Modello su Streamlit: Convertire un modello addestrato in Google Colab in uno che funziona in un ambiente Streamlit ha richiesto la corretta gestione dei layer personalizzati di TensorFlow Hub e la garanzia che tutte le dipendenze corrispondessero.
- Elaborazione di Immagini Multiple: L'implementazione del supporto per l'elaborazione batch di più immagini mantenendo un'interfaccia utente pulita ha richiesto un'attenta gestione dello stato in Streamlit.
- Ottimizzazione delle Prestazioni: L'utilizzo di decoratori di caching per evitare di ricaricare i modelli per ogni interazione dell'utente ha migliorato drasticamente il tempo di risposta dell'applicazione.
Conclusione
Questo progetto dimostra l'applicazione pratica dei concetti di deep learning, tra cui transfer learning, classificazione delle immagini e deployment del modello. Estendendo il progetto del corso in un'applicazione web completamente funzionale, ho mostrato non solo il processo di costruzione del modello, ma anche le competenze di ingegneria necessarie per rendere l'IA accessibile agli utenti finali.
Il progetto completo include:
- Implementazione del transfer learning con MobileNetV2
- Architettura del modello a due fasi per una maggiore accuratezza
- Applicazione web interattiva con componenti di visualizzazione
- Prestazioni ottimizzate attraverso il caching strategico
Questo "progetto del weekend" mi ha permesso di applicare ed estendere le conoscenze teoriche del corso in un'applicazione pratica e user-friendly che dimostra sia la competenza tecnica che l'attenzione per l'esperienza dell'utente finale.
L'applicazione è disponibile all'indirizzo: https://dog-breed-classifier-app.streamlit.app