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.mdIl 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
librosaPuoi installarli con:
pip install -r requirements.txtOppure puoi configurare un ambiente conda con:
conda env create -f environment.yml
conda activate classification_instrumentsQuesto 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: