鼾声识别(python+迁移学习)

@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

该图展示了Snoring Dataset音频数据采样前后的波形图!

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()

mou

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
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LJhaha

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值