一.数据集: ICBHI 2017挑战赛 呼吸音数据库
总共5.5小时的录音,包含6898个呼吸周期。其中有1864个爆裂声(crackles) 、886个喘息声(wheezes) 、506个爆裂声和喘息声的结合(both crackles and wheezes)
数据集中是 126个人的920段音频(有注释txt文件和呼吸wav文件)
解释:
(1).126个人中的每个人根据采集位置(气管、胸腔左前、胸腔右前等位置)和采集设备(麦克风、听诊器等设备)等不同,录制若干段音频,共计920段音频(每段音频为10到90秒)。
(2).每段音频有若干个呼吸周期,920段音频累计有6898个呼吸周期
(3).在6898个呼吸周期中,包含了中,包含了上述提到的爆裂声(crackles) 、886个喘息声(wheezes) 、506个爆裂声和喘息声的结合(both crackles and wheezes)
(4).数据集
a.数据集文件如下图所示:
上图的命名来源如下图:
b.注释txt文件如下图所示:
第一列到第四列分别是:
呼吸周期开始、呼吸周期结束、有无爆裂声(crackles) 、有无喘息声(wheezes)
二.数据处理:
1.将数据集中的音频文件通过 split_into_cycles.py,该.py文件的作用是将每个音频中包含的呼吸周期一个一个的拆分出来,最后共计6898个呼吸周期并放入splitted_into_cycles文件夹中,同时在该文件夹中创造了一个csv文件(如下两图所示,均为部分节选)
csv文件的列分别为: 音频文件名 呼吸周期开始 呼吸周期结束 爆裂音(1)和喘息音(2)
2.split.py创建crackles,wheezes,both,normal四个文件夹并将6898条呼吸周期移动到四个文件夹中,然后创建train,test文件夹并按照类别以0.8/0.2的比例存入
train和test文件夹
test文件夹下的四个文件夹(train文件夹下也是一模一样的)
../test/both文件夹下的部分文件
3.transformer.py
数据增强以得到更多数据(改变振幅,时间平移,改变速度)
归一化
特征提取:32*32,通道为1的对数梅尔频谱图(1秒16000采样,再提取频谱到对数域)
三.模型
1.models.py
采用的28层的wideResnet作为模型训练,(这里宽度取10)
模型的流程图如下图所示:
图1 图2
图3 图4
图1是整体网络结构的流程图
图2是stacks_blocks的结构图
图3是 残差块 的结构图
图4是 残差块*的结构图
四.训练
train.py
1.优化算法:SGD
2.学习率:
3. batch_size:96
4.epoch:80
5.采用5折交叉验证:将训练集中分为5等份,每次(kfold=0,1,2,3,4)选取其中1份用于作为验证集,其他4份作为训练集。
以kfold=0举例:选择4份训练集和1份验证集进行80次epoch,会生成80个模型然后保存最好的(best)模型来训练。因为是5折交叉验证(即5次),所以最后将会得到5个模型。
对这5个模型的预测(测试集)求平均的loss,得到下图:
最后的准确率是57.69%