This is the **Italian version by default**. Switch to: π¬π§ English
Questo progetto si occupa della classificazione automatica di strumenti musicali a partire da dati audio trasformati in immagini (spettrogrammi). Il problema Γ¨ affrontato come una classificazione multilabel, confrontando le prestazioni di una CNN (modello di deep learning) con modelli tradizionali di machine learning: XGBoost e Random Forest.
Il dataset Γ¨ stato raccolto manualmente e comprende registrazioni audio di 5 strumenti musicali:
- Chitarra
- Pianoforte
- Violino
- Viola
- Flauto
I file .wav sono stati convertiti in spettrogrammi grigi con la libreria librosa.
Ogni spettrogramma Γ¨ poi salvato come immagine .png e suddiviso in:
train(70%)val(15%)test(15%)
Organizzati nella seguente struttura:
data/ βββ train/ β βββ <strumento>/immagini/*.png βββ val/ β βββ <strumento>/immagini/*.png βββ test/ β βββ <strumento>/immagini/*.png β βββ models/ β βββ model_immagini.py β βββ pre data/ β βββ audio.py β βββ clone.ipynb β βββ segmentaion.py β βββ utils/ β βββ dataset_immagini.py β βββ evaluate_immagini.py β βββ train_immagini.py β βββ test_immagini.py β βββ main_immagini.ipynb βββ main.ipynb β βββ extract_features.ipynb βββ ispezione.ipynb β βββ requirement.txt βββ environment.yml β βββ Readme.md
Il preprocessing converte i file .wav in spettrogrammi tramite:
librosa.feature.melspectrogram() librosa.power_to_db()
I file risultanti vengono salvati come immagini monocromatiche.
Nel nostro progetto di classificazione multilabel degli strumenti musicali a partire da immagini spettrogrammi, abbiamo adottato e confrontato tre approcci differenti per valutare lβefficacia di modelli basati su deep learning rispetto a metodi tradizionali di machine learning.
Abbiamo sviluppato un modello CNN personalizzato utilizzando PyTorch. Il modello Γ¨ composto da tre blocchi convoluzionali con Batch Normalization, MaxPooling e Dropout per prevenire l'overfitting. La rete termina con due layer fully connected.
- Input: spettrogrammi in scala di grigi (1 x 224 x 224)
- Output: probabilitΓ per ciascuna delle 5 classi (strumenti)
- Funzione di perdita:
CrossEntropyLoss - Ottimizzatore: Adam con learning rate di 0.001
- Early Stopping: monitorato sulla validation accuracy con
patience = 5
Durante l'addestramento, salviamo il modello con la migliore accuracy sulla validation e generiamo:
- Curva di loss e accuracy per training e validation
- Matrice di confusione finale
- Classificazione dettagliata per classe
Come approccio alternativo, abbiamo estratto feature statistiche dagli spettrogrammi (es. media, deviazione standard, skewness) e le abbiamo utilizzate per addestrare un classificatore XGBClassifier.
- Modello: Gradient Boosting (XGBoost)
- Vantaggi: veloce da addestrare, interpretabilitΓ delle feature
- Limiti: richiede estrazione manuale delle caratteristiche e non sfrutta pienamente la struttura spaziale dellβimmagine
Abbiamo infine testato un classificatore Random Forest, anchβesso basato su feature estratte manualmente dagli spettrogrammi. Γ stato utilizzato come baseline classico:
- Modello: ensemble di alberi decisionali
- Punti di forza: robustezza a overfitting e facilitΓ di interpretazione
- Limiti: prestazioni inferiori rispetto alla CNN
Tabella comparativa delle prestazioni dei modelli
| Modello | Dataset | Accuracy | Precision (macro) | Recall (macro) | F1-score (macro) |
|---|---|---|---|---|---|
| CNN (immagini) | Val | 86.71% | 0.9050 | 0.8777 | 0.8696 |
| Test | 98.33% | 0.9830 | 0.9852 | 0.9840 | |
| Random Forest (ViT β immagini) | Val | 71.68% | β | β | β |
| Test | 82.22% | 0.83 | 0.84 | 0.82 | |
| XGBoost (ViT β immagini) | Val | 77.46% | β | β | β |
| Test | 82.78% | 0.83 | 0.84 | 0.83 | |
| Random Forest (ViT β audio) | Test | 92% | 0.96 | 0.93 | 0.94 |
| XGBoost (ViT β audio) | Test | 67% | 0.57 | 0.57 | 0.52 |
torch torchvision matplotlib seaborn pandas scikit-learn librosa
Puoi installarli con:
pip install -r requirements.txt
Oppure puoi configurare un ambiente conda con:
conda env create -f environment.yml conda activate classification_instruments
Questo progetto Γ¨ distribuito con licenza Apache License 2.0.
Puoi utilizzarlo liberamente, a patto di citare gli autori originali.
Per qualsiasi domanda o richiesta di chiarimento, non esitare a contattarci: