新冠肺炎
COVID-19(2019 年冠状病毒病)是一种会导致人类呼吸系统问题、体温超过 38°C 的发烧、呼吸急促和咳嗽的疾病。即使是这种疾病也会导致肺炎死亡。
在 COVID-19 之前被认为是正常的症状之一是咳嗽。现在听到周围的人咳嗽,不禁让人怀疑咳嗽是正常的还是感染了 COVID-19 的人的咳嗽。
什么是梅尔谱图?
梅尔谱图是转换为梅尔标度的谱图。那么,什么是频谱图和梅尔音阶?频谱图是信号频谱的可视化,其中信号的频谱是信号包含的频率范围。梅尔音阶模仿人耳的工作方式,研究表明人类不会在线性音阶上感知频率。与较高频率相比,人类更擅长检测较低频率的差异。
深度学习
深度学习是人工智能的一部分,它使计算机从数据中学习。深度学习中使用的方法之一是人工神经网络,它是一种模拟人类神经网络工作的计算模型。
卷积神经网络
卷积神经网络是深度学习中的一种技术,用于解决图像处理和识别问题。有关卷积神经网络理论的更多详细信息,请参阅博客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 [====&