一.ICBHI 2017数据集(部分截图如下)
解释:(一).101代表人,累计有126个人。所以排号到226
(二).1b1是记录索引Recording index
(三).AI代表胸腔位置(如:气管Tc 胸腔左前方AI,左后方PI……………)
(四).sc代表采集顺序(如:sc为单通道 mc为双通道)
(五).Meditron代表录音设备(麦克风AKGC417L,听诊器,电子听诊器等等…………)
(六).同时,每个人的状况已给出(heathy copd等等…………)
(101_1b1_Al_sc_Meditron.txt打开)
解释:(一)每一行都代表 在此录音中 的一个呼吸周期
(二) 第一列是此呼吸周期的开始时间
第二列是此呼吸周期的结束时间
第三列是有1/无0爆裂音crackles
第四列是有1/无0喘息音wheezes
(三) 可以看出该.wav文件有12个呼吸周期
二.上次看的代码的工作
Step1:通过split_into_cycles.py,将所有的音频中包含的呼吸周期 一个一个 拆分出来。
最后得到(一)创造6898个呼吸周期.wav文件并放入splitted_into_cycles文件夹中
(二)创造了一个csv文件,该文件第一列是呼吸周期.wav文件名,第二列是呼吸周期开始的时间,第三列是呼吸周期结束的时间,第四列是爆裂音(1)和喘息音(2)
Step2:通过split.py,创建了train和test文件夹(train/test==0.8/0.2)。这两个文件夹中都含有both,crackles,normal,wheezes四个文件夹。因此将6898个呼吸周期根据其性质(爆裂音等)放入8个文件夹下
Step3: 将初始的数据打包成.npy文件格式,同时采用五折交叉验证进行训练:将train集分为5份,每次选择4份作为train集(并且里边用到了数据增强),1份作为val集(里边没有数据增强)
数据增强是怎么做到的:在循环中采用是五折交叉验证(将train分为0,1,2,3,4)。
S0:假设我先划定train集(train_A=0,1,2,3),这时选定好的train_A集被数据增强(变幅度,变速度,时移)。所以啊,数据增强后得到了4倍的train_A集(数据增强得到3倍+初始数据为1倍)。Val集(Val_A=4)不做增强。
S1:假设我先划定train集(train_B=0,1,2,4),这时选定好的train_B集被数据增强(变幅度,变速度,时移)。所以啊,数据增强后得到了4倍的train_B集(数据增强得到3倍+初始数据为1倍)。Val集(Val_B=3)不做增强。
(共计重复5次,因此为5折交叉验证)
最后就可以得到 初始数据的20倍 的数据集
Step4:选用wideresnet40网络
Step5:以S0为例 进行训练,训练过程中会有80个模型然后保存最好的(best)模型。
因为5折交叉验证,所以同理:会生成5个模型。
Step6: 将5个模型预测概率加一起除以5,就是最后的结果loss,acc,混淆矩阵。再保存为npy文件
网络模型:输入一段音频(含有多个呼吸周期),先拆分为若干个呼吸周期,输出呼吸周期为trackles,wheezes,both,norm的个数(例如:输出了1个trackles,0个wheezes,2个both,5个normal),后期可以量化标准进而作为辅助手段
三.看到的那篇硕士论文
1.使用vggish-BiLSTM,将10s数据截取为10份(即1s/份),每秒96帧,每帧有64个mel特征。所以输入到网络的矩阵为(10,96,64)
2.他挑选了390条呼吸音样本(145healthy,155copd,47上呼吸道感染,43个支气管扩张)
3.四种录音设备仅选择AKGC417L设备,以避免对结果准确率造成影响
4.通过降采样技术,将数据集扩展为210个healthy,250个copd,94个上呼吸道,86个支气管扩张,共640条数据(每条10s)
四.上周工作(阅读Vggish-BiGRU代码)
(即上篇CSDN文章)
包含mel_features.py文件,vggish_params.py文件,vggish_input.py文件,主程序文件
1.mel_features.py文件
包含了几个类:a.将输入数组转换为可能重叠的帧序列
b.海宁窗
c.计算短时傅里叶变换的幅度
d.将hz转换为mel
e.返回一个矩阵,该矩阵可以对谱图行进行后乘,进而生成mel
f.将数据波形转换为对数幅度梅尔频谱图
2.vggish_params.py文件
包含了音频数据预处理所需要的参数,以及设定的vggish网络结构所需要的参数
3.vggishe_input.py文件
(将1和2的.py输入到这里)
包含了几个类:1.将原始音频文件读取,输出NumPy数组的形式的音频数据
2.将音频波形转换为vggish的示例数组(1.速率变换 2. 帧序列)
3.读取.wav文件的数据和采样率
4.主程序文件
(def 函数的调用关系)
A.数据预处理:
a.先对数据进行read()读取,转到[-1,+1]之间
b.通过带海宁窗的STFT(短时傅里叶变换),再与转成mel矩阵的光谱图 做点积 ,然后取log。最后生成 对数mel
c.对上步的数据通过frame()转为可能重叠的帧序列,到此数据处理完毕。
其中:STFT中的 海宁窗窗口25ms,步长10ms(如何算出:规定1s=16000采样样本,1帧中传递400个样本,移动160个样本,所以换算得出25ms,10ms)。呼吸音采样频率为16000Hz。呼吸音数据均为20s(1s/份),每秒96帧,1帧64个mel特征。所以输入矩阵为(20,96,64)
B.数据输入
ex.shape==(20,96,64)--------------->20秒,96*64的数组
(为什么是20,20是.wav文件的秒数。经测试,当秒数为34时,第一个维度为34)
all_examples.shape==(140,10,96,64,1)
all_labels.shape==(140,2)
labeled_examples是一个list,为140行2列
其中,第一列:.shape==(140,10,96,64,1)
——>这个是呼吸音数据(140是数据个数,10个秒数)
第二列:.shape==(140,2)
——>这个是标签( [1,0]代表health,[0,1]代表copd)
Features是洗牌后的 labeled_examples的第一列
Labels是洗牌后的labeled_examples的第二列
C.网络结构
Vggish网络:输入input==(96,64,1) 输出(128,) 加载vggish_model.h5的权重
BiGRU网络:输入input==(10,96,64,1),输出(2,)实现二分类
通过fit()进行训练,保存模型。其中,15%的训练集作为验证集
——>得到loss和acc
然后,把这个features(也就是预处理后的train集数据),直接进行test
网络模型:输入一段音频(含有多个呼吸周期),直接输出是什么疾病(copd/heathy)
四.对上周工作提出的设想
1.将ICBHI数据集进行合理筛选
a.选出比较好的数据进行一个4分类,达到小论文的目标
b.选出测试集(不能像源码一样将train集用为test集)
2.输入音频的特征ex 取值可以改进(ex[10:]?ex[:10]!数据至少20秒)
3.迁移学习的源数据集是否可以进行更改?
4.将现在的呼吸音数据集替换为新冠患者呼吸的数据集(我记得这个我见过,还要再找找)以及心肺声音的数据集,用来检测模型是否有效
5.将原有的VGGish-BiGRU(CNN-RNN)改为VGGish-transformer试试?
6.将5折交叉验证应用于新的模型中(直接copy就好,与框架无关)
五.本周工作
1.将原数据集进行详细分析
(1)Asthma:1份wav文件,其中1份LittC2SE采集设备
(2)Bronchiectasis:16份wav文件,其中16份Meditron采集设备
(3)Bronchiolitis:13份wav文件,其中13份Meditron采集设备
(4)COPD:793份wav文件,其中60份Litt3200采集设备,50份LittC2SE采集设备,647份AKGC417L采集设备,36份Meditron采集设备。
(5)Healthy:35份wav文件,其中35份Meditron采集设备
(6)LRTI:2份wav文件,其中2份Meditron采集设备
(7)Pneumonia:37份wav文件,其中2份Meditron采集设备,35份LittC2SE采集设备
(8)URTI:23份wav文件,其中23份Meditron采集设备
| LittC2SE | Meditron | Litt3200 | AKGC417L | total | |
| Asthma | 1 | 1 | |||
| Bronchiectasis | 16 | 16 | |||
| Bronchiolitis | 13 | 13 | |||
| COPD | 50 | 36 | 60 | 647 | 793 |
| Healthy | 35 | 35 | |||
| LRTI | 2 | 2 | |||
| Pneumonia | 35 | 2 | 37 | ||
| URTI | 23 | 23 | |||
| total | 86 | 114 | 73 | 647 | 920 |
最原始的数据集:
2.划定数据集
a.数据集1
将数据集进行筛选,最后保留以下6种病例进行分析:
筛选条件1.除掉Asthma,LRTI病例(1个数据和2个数据,太少了)
筛选条件2.在病例中保留 采集设备音频最多的
| 数据集1 | LittC2SE | Meditron | Litt3200 | AKGC417L | total |
| Bronchiectasis | 16 | 16 | |||
| Bronchiolitis | 13 | 13 | |||
| COPD | 647 | 647 | |||
| Healthy | 35 | 35 | |||
| Pneumonia | 35 | 35 | |||
| URTI | 23 | 23 | |||
| total | 35 | 74 | 13 | 647 | 769 |
同时,
以上769份wav文件时长都是20s
我把20s的数据集:
前10s设置为train集(同时在train集中85%训练,15%测试),后10s设置为test集
训练,验证
……
最后的结果:(出现0.00是因为warining,我检查代码发现是predict()函数运算有问题!这个可能和所对应的病例数据量太少有关),可能换个评价方法就好了。
最后的结果:
b.数据集2
| 数据集1 | LittC2SE | Meditron | Litt3200 | AKGC417L | total |
| COPD | 647 | 647 | |||
| Healthy | 35 | 35 | |||
| Pneumonia | 35 | 35 | |||
| URTI | 23 | 23 | |||
| total | 35 | 58 | 0 | 647 | 740 |
将数据集1中的Bronchiectasis、Bronchiolitis病例除掉(因为数据太少)
数据的处理方法同上
六.下周
接着 第五步
1.挑选数据集,进行合理的分类(train,test,val)
2.五折交叉验证放进来(在思考怎么放)



