@LJ1120142576
说明
本人初步接触深度学习相关的知识,如果发布的内容有错误的地方,还请大家指正。
正文内容
以下将介绍本人如何使用迁移学习实现鼾声和非鼾声的二分类识别任务。
数据库说明
本研究中一共使用了2个数据库:Snoring Dataset 和 ESC-50 数据库,前者作为训练集数据集,后者的部分数据作为测试集数据。
1.Snoring Dataset
数据来源:https://www.kaggle.com/tareqkhanemu/snoring
数据介绍:该数据库一共包含三个文件,文件“0”代表非鼾声数据(.wav格式),文件“1”代表鼾声数据(.wav格式),而Snoring_dataset.txt文件详细介绍了文件夹“0”和“1”中的数据组成以及音频时长(1s)。
2.ESC-50
数据来源:一时间忘了在哪下载的了,我已经上传到百度云盘,需要的可以由以下链接获取。
【链接:https://pan.baidu.com/s/1ISrLlZlZju6GwzRmdBPC6w
提取码:0klg】
数据介绍:该数据库一共包含6个文件,其中文件夹“ESC-50”包含了50个类别的原始音频数据(.ogg格式),readme.txt文件详细介绍了该数据组成以及数据的采样率(44100 Hz)和音频时长(5s)。
数据分析处理流程
1.读取原始的音频数据
本次实验中涉及到的两种音频格式(.wav和.ogg)的数据均采用python中的soundfile模块进行数据读取,代码如下所示(该代码来源于https://github.com/qiuqiangkong/audioset_classification)
def read_audio(path, target_fs):
'''
input:path=原始音频数据的路径;target_fs:目标采样率,如果数据的采样率不是目标采样率则需要进行重采样
output:返回读取的音频信号和采样率
'''
(audio, fs) = soundfile.read(path)#读取音频信号数据和采样率
if audio.ndim > 1:
audio = np.mean(audio, axis=1)#如果音频信号是多通道的,就平均
if target_fs is not None and fs != target_fs:#获取音频信号的采样率之后,如果不是所需的采样率,则对其进行重采样
audio = librosa.resample(audio, orig_sr=fs, target_sr=target_fs)
fs = target_fs
return audio, fs
2.梅尔谱图输出
梅尔谱是音频信号的一个重要谱图特征,对于音频信号的识别具有重要的意义,详细的原理及python实现参见以下链接:
https://www.cnblogs.com/LXP-Never/p/10918590.html
本实验中直接使用python自带的librosa模块求取音频信号的梅尔谱特征,代码如下所示。
melspec = librosa.feature.melspectrogram(audio/32768, sr=fs, n_fft=1024, hop_length=512, n_mels=128,power=2)#梅尔谱特征
logmelspec = librosa.power_to_db(melspec)#Log梅尔谱特征
mfcc=librosa.feature.mfcc(audio, fs)#梅尔倒谱系数(本次实验没有使用)
plt.figure()
librosa.display.specshow(logmelspec, sr=fs, x_axis='time', y_axis='hz')
plt.set_cmap('rainbow')
plt.savefig('melspec.png')
plt.show()
3.输入网络前的图片预处理
由于本次实验使用了已训练好的模型ResNet-50进行迁移学习,所以图片的尺寸以及相关的预处理需与该网络模型的输入一致。
ResNet的论文地址:https://arxiv.org/pdf/1512.03385.pdf
ResNet网络图像的预处理流程详解参见:https://www.jianshu.com/p/739df8235587
本实验中的代码实现如下所示。
def melspec_processing(melspecpath):
'''
input:melspecpath=梅尔谱存储的位置
output:返回224×224×3的数据和标签
'''
filename=os.listdir(melspecpath)
imgs=[]
labels=[]
for file in filename:
img=Image.open(melspecpath+file)
img = img.convert("RGB") #因为存储的是png格式的图片是4个通道,包含了透明度所以需要转成3通道
#图片的预处理 https://arxiv.org/pdf/1512.03385.pdf
#根据短边实现等比例缩放
width=img.size[0]
height=img.size[1]
rate=256/height
img = img.resize((int(width*rate), int(height*rate)), Image.ANTIALIAS)
# img=img.resize((256,256),resample=Image.ANTIALIAS)
#图片裁剪(Cropping),224×224,
#由于mel谱展示了信号在时间上和频率上的变化,很多时候各个音频主要表现在频率上的变化,
#所以我们裁剪的时候纵轴保持最中间的部分,横轴也保持最中间的部分
img=img.crop((59,16,283,240))
#归一化(Normali