Lorenzo Vainigli

Android developer

Registrazioni vocali per la diagnosi di COVID-19 con Deep Convolutional Neural Networks

11 Aprile 2021
Progetti
8 min.
93

This post is available in English

In questo articolo descrivo quello che è stato il mio progetto per la tesi di laurea magistrale in Informatica all’Università di Bologna, nel quale mi sono occupato di utilizzare le tecnologie delle Deep Convolutional Neural Networks per riuscire a creare modelli di machine learning che fossero in grado di rilevare casi di COVID-19 analizzando delle registrazioni vocali.

In ambito medico l’intelligenza artificiale è ormai largamente utilizzata, in particolare come strumento di ausilio alla rilevazione di malattie, quali la malattia di Parkinson e il disturbo da stress post traumatico. Malattie come quelle appena citate hanno, tra le loro conseguenze, l’alterazione della voce delle persone che ne sono affette. In questo modo la voce diventa un cosiddetto biomarcatore della malattia e quindi, ciò che si può fare è registrare proprio la voce delle persone delle quali si vuole effettuare la diagnosi per ottenere dei sorgenti audio che contengono le informazioni utili. Nel caso delle nuove malattie di cui si sa poco, come il COVID-19, queste informazioni sono difficili da trovare proprio perché non si sa bene quali esse siano. Lo strumento adatto alla risoluzione di questo problema, per il quale abbiamo i dati (combinazioni input-output), ma non le “regole”, è il machine learning.

Lo studio che ho effettuato è partito dall’analisi dell’articolo: “Exploring Automatic Diagnosis of COVID-19 from Crowdsourced Respiratory Sound Data”, pubblicato da un team di ricercatori dell’Università di Cambridge. Lo scopo della loro ricerca è la costruzione di un dataset contenente registrazioni di colpi di tosse e respiri che possa essere utilizzato per addestrare modelli di apprendimento automatico a discriminare casi di COVID-19. Per raccogliere i dati è stata lanciata una campagna in modalità crowdsourcing con adesione volontaria aperta a tutti tramite app mobili e un form web (www.covid-19-sounds.org) per favorirne la scalabilità. Gli utenti, oltre a registrare la loro voce, inseriscono alcuni dati sul loro stato clinico e, in particolare, se sono risultati positivi al COVID-19.
I campioni audio raccolti sono stati utilizzati per addestrare modelli quali Logistic Regression, Gradient Boosting Trees e Support Vector Machines.

I ricercatori hanno diviso il lavoro in tre diversi task e per ognuno è stata utilizzata una diversa combinazione di input.

  • Nel primo task il modello deve distinguere pazienti affetti da COVID-19 da pazienti sani. Per questo task sono state utilizzate sia registrazioni di colpi di tosse sia di respiri.
  • Nel secondo task il modello deve distinguere pazienti affetti da COVID-19 che hanno riportato la tosse tra i loro sintomi da pazienti che non hanno il COVID-19 ma che hanno indicato di avere la tosse. Per questo task sono stati utilizzati solo gli audio con colpi di tosse.
  • Nel terzo task la distinzione da fare è la stessa del secondo task, con la differenza che i pazienti negativi al COVID-19 non hanno semplicemente la tosse ma la tosse asmatica. Per questo task sono stati utilizzati solo i sorgenti dei respiri.

Il dataset contiene dati sensibili e non è pubblicato, ma grazie ad un accordo di condivisione tra Università di Cambridge e Università di Bologna ho avuto la possibilità di accedere a questi dati.

Replicando il loro esperimento ho notato come la parte di feature extraction fosse molto complessa: i modelli utilizzati (come LR o SVM) non supportano l’elaborazione di file grezzi ed è pertanto necessario estrarre le feature in modo manuale. L’approccio utilizzato dai ricercatori di Cambridge è il seguente.

  • Handcrafted features: 477 feature sono state generate estraendo da ogni sorgente le seguenti proprietà: duration, onsets, tempo, period, RMS energy, spectral centroid, roll-off frequency, zero crossing rate, MFCC, δ-MFCC, δ²-MFCC. Questo metodo richiede una conoscenza molto specifica delle tecniche di audio processing e, quindi, richiederebbe la presenza di un esperto in questo campo.
  • VGGish features: 256 feature sono state estratte in modo automatico utilizzando VGGish, ossia una rete neurale specializzata in audio processing e addestrata su un dataset campionato da YouTube. VGGish divide ogni file audio in sotto-campioni da 0.96 secondi e per ognuno di essi estrae 128 features. Il vettore finale di 256 valori è stato ottenuto calcolando il vettore delle medie (128 valori) e quello delle deviazioni standard (altri 128 valori) ottenuti dai vettori generati da VGGish per ogni singolo file (figura 1).
Figura 1: schema di estrazione delle feature con VGGish per un singolo file. M è il vettore delle medie e S il vettore delle deviazioni standard.

Il metodo appena descritto consente di ottenere un vettore finale di 733 feature da utilizzare come input per i modelli di machine learning, tuttavia la grande complessità di questa operazione mi ha portato a cercare un’alternativa.

Tra le varie soluzioni a disposizione vi sono le Deep Convolutional Neural Networks, reti neurali dotate di “convoluzioni”, ovvero filtri in grado di trasformare i pixel di un’immagine tramite moltiplicazioni di matrici. L’immagine viene decomposta in sotto-immagini via via più piccole da cui vengono estrapolati delle feature che poi saranno mandate in input ad una serie di dense layers responsabili della vera e propria classificazione (figura 2).

Figura 2: architettura di una Deep Convolutional Neural Network. Immagine da becominghuman.ai.

Questa soluzione ci permetterebbe di automatizzare la parte di feature extraction, ma come combinare registrazioni audio con dei modelli che elaborano immagini? Possiamo ricorrere al concetto di spettrogramma.
Lo spettrogramma è può essere considerato “l’impronta visiva di un suono”: si tratta di un grafico che sull’asse delle y ha le frequenze (spesso espresse in scala logaritmica) e sull’asse delle x riporta il tempo. Ogni punto sul grafico è colorato in base all’intensità che il suono ha a quella frequenza in quell’istante di tempo (figura 3).

Figura 3: esempio di spettrogramma.

Con questo metodo la parte di feature extraction si riduce unicamente alla generazione degli spettrogrammi.

Purtroppo c’è un trade-off intrinsecamente legato alle reti neurali: le innumerevoli possibili scelte per quanto riguarda gli iperparametri e le configurazioni della rete. Di seguito sono riportate solo alcune variabili da impostare.

  • Numero di epoche
  • Batch size
  • Learning rate
  • Dimensione dell’input
  • Ampiezza degli hidden layers
  • Numero di hidden layers
  • Dropout rate
  • Topologia
  • Online data augmentation
  • Offline data augmentation
  • Class weights
  • Fine tuning

Le innumerevoli combinazioni possibili, unite a tempi di training elevati (che in questo caso possono richiedere minuti o addirittura ore), hanno reso infattibile effettuare una ricerca esaustiva. Ho optato quindi per un approccio di ricerca locale: partendo dai valori di iperparametri e configurazioni comunemente utilizzati in letteratura ho provato a variare questi valori, osservando come cambiasse il comportamento del modello.

Alla fine ho utilizzato un modello come quello mostrato in figura 4. Il “cuore” dell’architettura incapsula una delle quattro reti usate per gli esperimenti (MobileNetV2, ResNet50, VGG16 o Xception) con i pesi già inizializzati e a cui sono stati aggiunti due dense layers: uno di 256 neuroni e un altro di 128 neuroni, entrambi con un 20% di dropout per scopi di regolarizzazione.

Figura 4: architettura del modello utilizzato per gli esperimenti.

Risultati

Figura 5: curva ROC ottenuta per il task 1.
Figura 6: comparazione risultati per il task 1.

Per quanto riguarda il primo task, come si evince dalla figura 5 le quattro diverse reti ottengono pressoché lo stesso punteggio in ROC-AUC, ovvero circa l’80%. ResNet50 ed Xception fanno leggermente meglio e la prima riesce ad ottenere una deviazione standard appena minore. In figura 6, il risultato di ResNet50 è confrontato con i risultati pubblicati dai ricercatori di Cambridge, che in questo caso hanno utilizzato Logistic Regression. Dalla comparazione si può constatare che, sebbene vi sia un piccolo miglioramento in ROC-AUC, il metodo basato su CNN perde molto in precision e recall.

Figura 7: comparazione risultati per il task 2.
Figura 8: comparazione risultati per il task 3.

Nell’articolo dell’università inglese sono stati pubblicati, a proposito del secondo e terzo task, i risultati ottenuti con Support Vector Machine. Un confronto tra SVM e MobileNetV2 è illustrato in figura 7 e 8. In questi due task, MobileNetV2 è stata la CNN che ha performato meglio. Tenendo conto che per lo scopo dell’esperimento la ROC-AUC è la metrica più importante, si può notare come SVM ottenga risultati migliori rispetto alle CNN, anche se queste ultime riescono a superare SVM di molto in precision e recall nel task 3.

Conclusioni

Dopo aver visto una comparazione tra l’approccio shallow learning con Logistic Regression e SVM e l’approccio deep learning con Deep Convolutional Neural Networks possiamo concludere che, tutto sommato, le due soluzioni si equivalgono, anche se il primo approccio sembra ottenere risultati leggermente migliori.

In letteratura però sono tutti concordi nell’affermare che i modelli di deep learning vanno in difficoltà se addestrati su dataset limitati, dove i modelli di shallow learning funzionano meglio. La release del dataset (datata maggio 2020) fornita dall’Università di Cambridge è effettivamente una prima versione con pochi dati. È da considerare però, come accennato all’inizio, che l’obiettivo della campagna di raccolta dati è creare un dataset scalabile ed è quindi plausibile aspettarsi che le CNN ottengano risultati via via migliori rispetto a LR e SVM man mano che sono disponibili più campioni.

Recentemente è stato pubblicato, dallo stesso team di ricercatori, un nuovo articolo: Exploring Automatic COVID-19 Diagnosis via Voice and Symptoms from Crowdsourced Data, in cui ripete l’esperimento con una versione aggiornata del dataset. Sarebbe interessante riproporre l’approccio con Deep Convolutional Neural Network su questa nuova release di dati.

La tesi completa è disponibile a questo link.

Immagine di copertina: Bagad, Piyush & Dalmia, Aman & Doshi, Jigar & Nagrani, Arsha & Bhamare, Parag & Mahale, Amrita & Rane, Saurabh & Agarwal, Neeraj & Panicker, Rahul. (2020). Cough Against COVID: Evidence of COVID-19 Signature in Cough Sounds. https://arxiv.org/abs/2009.08790

Lorenzo Vainigli

Sviluppatore Android e appassionato fin da piccolo di computer e tecnologia.
Ho una laurea magistrale in Informatica conseguita all'Università di Bologna.
Mi piacciono l'astronomia 🌌 e la cultura giapponese ⛩️.
Qui racconto di più su di me.