如何使用卷积神经网络从梅尔谱图检测 COVID-19 咳嗽

本文介绍了利用深度学习中的卷积神经网络(CNN)从梅尔谱图中检测COVID-19咳嗽的方法。首先,解释了梅尔谱图的概念,接着阐述了深度学习和CNN的基础。数据集包含COVID-19阳性和阴性的咳嗽声音,通过Audacity和librosa库将音频转换为梅尔谱图。构建的CNN模型在训练和验证集上的准确率分别为98.98%和95.65%,显示出良好的识别性能。
摘要由CSDN通过智能技术生成

新冠肺炎

COVID-19(2019 年冠状病毒病)是一种会导致人类呼吸系统问题、体温超过 38°C 的发烧、呼吸急促和咳嗽的疾病。即使是这种疾病也会导致肺炎死亡。

在 COVID-19 之前被认为是正常的症状之一是咳嗽。现在听到周围的人咳嗽,不禁让人怀疑咳嗽是正常的还是感染了 COVID-19 的人的咳嗽。

什么是梅尔谱图?

梅尔谱图是转换为梅尔标度的谱图。那么,什么是频谱图和梅尔音阶?频谱图是信号频谱的可视化,其中信号的频谱是信号包含的频率范围。梅尔音阶模仿人耳的工作方式,研究表明人类不会在线性音阶上感知频率。与较高频率相比,人类更擅长检测较低频率的差异。

c864166c1342825345afb20004046c1c.png

深度学习

深度学习是人工智能的一部分,它使计算机从数据中学习。深度学习中使用的方法之一是人工神经网络,它是一种模拟人类神经网络工作的计算模型。

卷积神经网络

卷积神经网络是深度学习中的一种技术,用于解决图像处理和识别问题。有关卷积神经网络理论的更多详细信息,请参阅博客https://www.analyticsvidhya.com/blog/category/deep-learning/

数据集条件

使用的语音数据可以在https://github.com/virufy/virufy-data下载。

使用的声音数据是 COVID-19 阳性和 COVID-19 阴性的咳嗽声音记录。此数据为 mp3 格式,具有采样率为 48000 Hz 的单声道,并已进行分段以使其具有相同的时间。

但是,系统可以使用这些数据来识别感染 COVID-19 的人的咳嗽声吗?mp3音频格式需要转换成wav格式。为什么?因为语音识别中处理的是频率波和幅度波,而wav是波(waveform)形式的音频格式。因此,需要对音频进行预处理以将格式从mp3 更改为wav 格式。完成这一步后,就可以得到光谱图mel。

从音频中获取图像梅尔频谱图

软件 Audacity 可用于将 mp3 音频格式转换为 wav 格式。然后使用python编程语言中的librosa包读取wav格式的音频。通过使用python自带的librosa包来分析音频,下采样得到的音频数据48000Hz的采样率遵循librosa包的默认采样率,这样音频的采样率就变成了22050Hz。

可以在librosa 文档中查看有关如何获取 Mel 频谱图的文档

  • 获取文档:http://librosa.org/doc/main/generated/librosa.feature.melspectrogram.html#librosa.feature.melspectrogram

构建模型

让我们使用 Python 和 Google Colab 制作一个系统,该系统可以使用卷积神经网络从 Mel Spectrogram 中识别来自 COVID-19 的感染者和非感染者的咳嗽声。

第 1 步   导入库

Python 提供了使编码更容易的包。使用的包:

  • 用于数值分析的 Numpy

  • 用于可视化的 Matplotlib 和 Seaborn

  • 用于深度学习的 Tensorflow 和 Keras

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
from tensorflow.keras.preprocessing.image import ImageDataGenerator
import tensorflow as tf
from sklearn.metrics import confusion_matrix
import seaborn as sns
from keras.preprocessing import image
from tensorflow.keras.models import load_model

第 2 步  从谷歌驱动器加载梅尔谱图图像数据集

path_dir = './drive/My Drive/Audiodata/Cough_Covid19/mel_spectrogram/'

注意:必须安装谷歌驱动器才能从谷歌驱动器加载数据

第 3 步 使用图像数据生成器

图像数据生成器用于对图像数据进行预处理。Rescale根据给定的缩放因子调整图像大小,并将数据拆分为训练和验证数据,其中验证数据取自总频谱图图像数据的 20%。梅尔谱图图像的总数据集为 121,即验证数据为 23 个数据。

datagen = ImageDataGenerator(
                    rescale=1./255,
                    validation_split = 0.2)
train_generator = datagen.flow_from_directory(
    path_dir,
    target_size=(150,150),
    shuffle=True,
    subset='training'
)
validation_generator = datagen.flow_from_directory(
    path_dir,
    target_size=(150,150),
    subset='validation'
)

第 4 步 构建 CNN 模型

这个CNN模型的架构:

  • Conv2D层——添加4个卷积(16个过滤器,32个过滤器,64个过滤器,大小为3*3,ReLU作为激活函数)

  • 最大池化 – MaxPool2D 具有 2*2 层

  • 扁平层以将层挤压成一维

  • dropout(0.5)

  • 密集的前馈神经网络(256 个节点,以 ReLU 作为激活函数)

  • 2 个输出层,以 Softmax 作为激活函数

model = tf.keras.models.Sequential([
    #first_convolution
    tf.keras.layers.Conv2D(16, (3,3), activation='relu', input_shape=(150, 150, 3)),
    tf.keras.layers.MaxPooling2D(2, 2),
    #second_convolution
    tf.keras.layers.Conv2D(32, (3,3), activation='relu'),
    tf.keras.layers.MaxPooling2D(2,2),
    #third_convolution
    tf.keras.layers.Conv2D(64, (3,3), activation='relu'),
    tf.keras.layers.MaxPooling2D(2,2),
    #fourth_convolution
    tf.keras.layers.Conv2D(64, (3,3), activation='relu'),
    tf.keras.layers.MaxPooling2D(2,2),
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dropout(0.5),
    tf.keras.layers.Dense(256, activation='relu'),
    tf.keras.layers.Dense(2, activation='softmax') 
])

第 5 步 编译和拟合模型

  • 损失函数 = categorical_crossentropy

  • Adam作为优化器

  • 批量大小为 32,有 100 个 epoch

model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(train_generator, batch_size=32,epochs=100)
Epoch 1/100
4/4 [==============================] - 3s 481ms/step - loss: 0.6802 - accuracy: 0.5408
Epoch 2/100
4/4 [==============================] - 2s 472ms/step - loss: 0.6630 - accuracy: 0.6633
Epoch 3/100
4/4 [==============================] - 2s 720ms/step - loss: 0.6271 - accuracy: 0.6429
Epoch 4/100
4/4 [====&
  • 0
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值