主要内容

声场景识别使用后期融合

这个例子展示了如何创建一个多模型融合声场景识别系统。火车的例子使用梅尔卷积神经网络(CNN)谱图并使用小波散射一个分类器。图坦卡蒙的例子使用了数据集的训练和评估[1]。

介绍

声场景分类(ASC)分类的任务环境的声音。ASC是一个通用的分类问题,是上下文感知的基础设备,机器人,和许多其他应用程序[1]。早期的尝试ASC使用mel-frequency cepstral系数(mfcc)和高斯混合模型(gmm)来描述他们的统计分布。其他受欢迎的特性用于ASC包括零交叉率、频谱质心(spectralCentroid)、光谱滚边(spectralRolloffPoint),谱通量(spectralFlux)和线性预测系数(lpc的)[5]。隐马尔科夫模型(摘要)被训练来描述gmm的演化。最近,表现最好的系统使用深度学习,通常cnn,融合多个模型。最受欢迎的特性为顶级系统2017年DCASE比赛是梅尔谱图(melSpectrogram)。顶级系统融合和数据增加后期使用的挑战来帮助他们的系统概括。

为了说明一个简单的方法,产生合理的结果,这个例子列车CNN使用梅尔使用小波散射谱图和一个分类器。CNN和系综分类器产生整体精度大致相当,但执行更好的区分不同声场景。提高整体精度,你合并CNN和系综分类器使用后期融合结果。

负载声场景识别数据集

要运行示例,您必须先下载数据集[1]。完整的数据集大约是15.5 GB。根据你的机器和网络连接,下载的数据可能需要4个小时。

downloadFolder = tempdir;datasetFolder = fullfile (downloadFolder,“图坦卡蒙-声场景- 2017”);如果~存在(datasetFolder“dir”)disp (下载图坦卡蒙-声场景- 2017 (15.5 GB)……”)HelperDownload_TUT_acoustic_scenes_2017 (datasetFolder);结束

阅读发展集元数据表。表变量名称文件名,AcousticScene,SpecificLocation

metadata_train = readtable (fullfile (datasetFolder”图坦卡蒙-声场景- 2017 -发展”,“meta.txt”),“分隔符”,{' \ t '},“ReadVariableNames”、假);metadata_train.Properties。VariableNames = {“文件名”,“AcousticScene”,“SpecificLocation”};头(metadata_train)
ans = 8×3表文件名AcousticScene SpecificLocation __________________________ _________________ ___________{音频/ b020_90_100。wav”}{“海滩”}{‘b020}{音频/ b020_110_120。wav”}{“海滩”}{‘b020}{音频/ b020_100_110。wav”}{“海滩”}{‘b020}{音频/ b020_40_50。wav”}{“海滩”}{‘b020}{音频/ b020_50_60。wav”}{“海滩”}{‘b020}{音频/ b020_30_40。wav”}{“海滩”}{‘b020}{音频/ b020_160_170。wav”}{“海滩”}{‘b020}{音频/ b020_170_180。wav”}{“海滩”}{' b020 '}
metadata_test = readtable (fullfile (datasetFolder”图坦卡蒙-声场景- 2017 -评价”,“meta.txt”),“分隔符”,{' \ t '},“ReadVariableNames”、假);metadata_test.Properties。VariableNames = {“文件名”,“AcousticScene”,“SpecificLocation”};头(metadata_test)
ans = 8×3表文件名AcousticScene SpecificLocation _____________ _________________ ___________{音频/ 1245。wav”}{“海滩”}{‘b174}{音频/ 1456。wav”}{“海滩”}{‘b174}{音频/ 1318。wav”}{“海滩”}{‘b174}{音频/ 967。wav”}{“海滩”}{' b174 '}{'audio/203.wav' } {'beach'} {'b174'} {'audio/777.wav' } {'beach'} {'b174'} {'audio/231.wav' } {'beach'} {'b174'} {'audio/768.wav' } {'beach'} {'b174'}

注意,具体记录位置特定记录的测试集不相交位置在开发集。这使得它更容易验证训练模型可以推广到真实世界的场景。

sharedRecordingLocations =相交(metadata_test.SpecificLocation metadata_train.SpecificLocation);流(具体的数量记录位置在训练集和测试集= % d \ n '元素个数(sharedRecordingLocations))
数量的特定记录位置在训练集和测试集= 0

元数据表的第一个变量包含文件名。连接文件路径的文件名。

train_filePaths = fullfile (datasetFolder,”图坦卡蒙-声场景- 2017 -发展”,metadata_train.FileName);test_filePaths = fullfile (datasetFolder,”图坦卡蒙-声场景- 2017 -评价”,metadata_test.FileName);

创建音频数据存储为训练集和测试集。设置标签财产的audioDatastore声场景。调用countEachLabel来验证标签的均匀分布在训练集和测试集。

adsTrain = audioDatastore (train_filePaths,“标签”分类(metadata_train.AcousticScene),“IncludeSubfolders”,真正的);显示器(countEachLabel (adsTrain)) adsTest = audioDatastore (test_filePaths,“标签”分类(metadata_test.AcousticScene),“IncludeSubfolders”,真正的);显示器(countEachLabel (adsTest))
15×2表标签数___________ _____海滩312总线312咖啡馆/餐厅312车312 city_center 312 forest_path 312 grocery_store 312家312图书馆312 metro_station 312 office 312公园312 residential_area 312列车312电车312 15×2表标签数___________ _____海滩108总线108咖啡馆/餐厅108车108 city_center 108 forest_path 108 grocery_store 108家108图书馆108 metro_station 108办公室108公园108 residential_area 108列车108电车108

可以减少在这个例子中使用的数据集来加速运行时性能为代价的。一般来说,减少数据集开发和调试是一个很好的实践。集reduceDataset真正的减少数据集。

reduceDataset = false;如果reduceDataset adsTrain = splitEachLabel (adsTrain 20);adsTest = splitEachLabel (adsTest 10);结束

调用获得一个文件的数据和采样率从数据库中的训练集。音频采样率和持续时间一致。规范化的音频,听它。显示相应的标签。

(数据、adsInfo) =阅读(adsTrain);data =有悖于/ max(数据,[],“所有”);fs = adsInfo.SampleRate;声音(数据、fs)流(“声场景= % s \ n”adsTrain.Labels (1))
声场景=海滩

调用重置返回其初始条件的数据存储。

重置(adsTrain)

特征提取为CNN

每个数据集包含10秒的音频剪辑立体声音频(左右)。特征提取管道和CNN架构在这个例子中是基于[3]。Hyperparameters特征提取,CNN的架构,从原始论文和训练选项修改使用系统hyperparameter优化工作流程。

首先,将音频转换为mid-side编码。[3]表明mid-side编码的数据提供更好的空间信息,CNN可以用来识别移动来源(如火车穿越一个声场景)。

dataMidSide =[总和(数据,2),数据(:1)拼(:,2)];

把信号分成一秒钟与重叠部分。最终的系统使用的概率加权平均一秒钟段预测每个10秒的音频剪辑的场景在测试集。将音频片段划分为一秒钟段使网络更容易训练,帮助防止过度拟合训练集的特定声学事件。重叠有助于确保所有的组合特性相对于另一个由训练数据捕获。它也为系统提供了额外的数据,可以在增加独特的混合。

segmentLength = 1;segmentOverlap = 0.5;[dataBufferedMid, ~] =缓冲区(dataMidSide(: 1),圆(segmentLength * fs),圆(segmentOverlap * fs),“nodelay”);[dataBufferedSide, ~] =缓冲区(dataMidSide(:, 2),圆(segmentLength * fs),圆(segmentOverlap * fs),“nodelay”);dataBuffered = 0(大小(dataBufferedMid, 1),大小(dataBufferedMid 2) +大小(dataBufferedSide, 2));dataBuffered(: 1:2:结束)= dataBufferedMid;dataBuffered(: 2:2:结束)= dataBufferedSide;

使用melSpectrogram将数据转换成一个紧凑的频域表示。定义参数的梅尔·光谱图所显示[3]。

windowLength = 2048;samplesPerHop = 1024;samplesOverlap = windowLength - samplesPerHop;fftLength = 2 * windowLength;numBands = 128;

melSpectrogram独立经营的渠道。优化处理时间,电话melSpectrogram与整个缓冲信号。

规范= melSpectrogram (dataBuffered fs,“窗口”汉明(windowLength“周期”),“OverlapLength”samplesOverlap,“FFTLength”fftLength,“NumBands”,numBands);

梅尔·声谱图转换为对数刻度。

规范= log10(规范+ eps);

重塑数组维度(乐队)————(跳数)————(频道)————(段)的数量。当你将一个图像到一个神经网络,第一个二维图像的高度和宽度,第三个维度是渠道,第四维分离单个图像。

X =重塑(规格、尺寸(规范,1),大小(规范,2),大小(数据,2),[]);

调用melSpectrogram没有输出参数绘制梅尔中期通道的光谱图一秒钟前六的增量。

频道= 1:2:11图melSpectrogram (dataBuffered(:,渠道),fs,“窗口”汉明(windowLength“周期”),“OverlapLength”samplesOverlap,“FFTLength”fftLength,“NumBands”,numBands);标题(sprintf (”段% d '装天花板(频道/ 2)))结束

辅助函数HelperSegmentedMelSpectrograms执行上述特征提取步骤。

加快处理,提取梅尔谱图数据存储中的所有音频文件使用数组。与内存中的数组,高大的数组仍未评价的,直到你请求计算进行使用收集函数。这延迟评价使您能够快速处理大型数据集。当你最终请求输出使用收集,MATLAB结合排队的计算在可能的情况下,需要通过数据的最小数量。如果你有并行计算工具箱™,你可以在你当地的MATLAB会话使用高数组,或在本地平行池。您还可以运行高数组计算集群上如果你有MATLAB®服务器™安装平行。

如果你没有并行计算工具箱™,这个例子中的代码仍然运行。

页= parpool (“IdleTimeout”、正);train_set_tall =高(adsTrain);xTrain = cellfun (@ (x) HelperSegmentedMelSpectrograms (x, fs,“SegmentLength”segmentLength,“SegmentOverlap”segmentOverlap,“WindowLength”windowLength,“HopLength”samplesPerHop,“NumBands”numBands,“FFTLength”fftLength),train_set_tall,“UniformOutput”、假);xTrain =收集(xTrain);xTrain =猫(4,xTrain {:});test_set_tall =高(adsTest);xTest = cellfun (@ (x) HelperSegmentedMelSpectrograms (x, fs,“SegmentLength”segmentLength,“SegmentOverlap”segmentOverlap,“WindowLength”windowLength,“HopLength”samplesPerHop,“NumBands”numBands,“FFTLength”fftLength),test_set_tall,“UniformOutput”、假);xTest =收集(xTest);xTest =猫(4 xTest {:});
开始平行池(parpool)使用“本地”概要文件…连接到平行池(工人数量:6)。评估高表达式使用并行池“当地”:通过1对1:3分45秒完成评估在3分45秒完成评估高表达式使用并行池“当地”:通过1对1:在1分22秒内完成评估完成1分22秒

复制标签的训练集,这样他们在与部分一一对应。

numSegmentsPer10seconds =大小(dataBuffered, 2) / 2;yTrain = repmat (adsTrain.Labels 1 numSegmentsPer10seconds)”;yTrain = yTrain (:);

CNN的数据增加

DCASE 2017数据集包含一个相对较少的原声录音的任务,和发展集和评价集记录在不同的特定位置。因此,很容易overfit培训期间的数据。一个流行的方法来减少过度拟合混合。在混合,增加你的数据集通过混合两个不同的类的功能。当你混合的特性,混合比例相等的标签。那就是:

$ $ \开始{数组}{1}\波浪号{\ mathrm {x}} = \λ{\ mathrm {x}} _i + \离开(1 - \λ# xA; \右){\ mathrm {x}} _j \ \ \波浪号{y} = \λy_i + \离开(1 - \λ\右)y_j \{数组}$ $

混合物被[2]新配方为标签来自一个概率分布,而不是混合标签。的实现混合在这个例子中是一个混合的简化版本:每个光谱图的谱图和一个不同的标签与λ设置为0.5。最初的和复杂的数据集进行训练。

xTrainExtra = xTrain;yTrainExtra = yTrain;λ= 0.5;i = 1:尺寸(xTrain, 4)%找到所有可用的谱图有不同的标签。availableSpectrograms =找到(yTrain ~ = yTrain(我));%随机选择一个可用的谱图有不同的标签。numAvailableSpectrograms =元素个数(availableSpectrograms);,numAvailableSpectrograms idx =兰迪([1]);%的组合。xTrainExtra (::,:, i) =λ* xTrain(::,:,我)+(1λ)* xTrain (:,:,:, availableSpectrograms (idx));%指定标签作为随机设定的λ。如果兰德>λyTrainExtra (i) = yTrain (availableSpectrograms (idx));结束结束xTrain =猫(4 xTrain xTrainExtra);yTrain = [yTrain; yTrainExtra];

调用总结显示标签为增强训练集的分布。

总结(yTrain)
海滩11749总线11870咖啡馆/餐厅11860车11873 city_center 11789 forest_path 12023 grocery_store 11850家11877图书馆11756 metro_station 11912办公室11940公园11895 residential_area 11875列车11795电车11776

定义和火车CNN

定义了CNN的架构。这个架构是基于[1],通过试验和错误修改。看到深度学习层的列表(深度学习工具箱)更多地了解深度学习层中可用MATLAB®。

imgSize = [(xTrain, 1),大小(xTrain, 2),大小(xTrain, 3)];numF = 32;层= [imageInputLayer (imgSize) batchNormalizationLayer convolution2dLayer (3 numF“填充”,“相同”)batchNormalizationLayer reluLayer convolution2dLayer (3 numF“填充”,“相同”)batchNormalizationLayer reluLayer maxPooling2dLayer (3“步”2,“填充”,“相同”)convolution2dLayer (3 2 * numF“填充”,“相同”)batchNormalizationLayer reluLayer convolution2dLayer (3 2 * numF“填充”,“相同”)batchNormalizationLayer reluLayer maxPooling2dLayer (3“步”2,“填充”,“相同”)convolution2dLayer (3、4 * numF,“填充”,“相同”)batchNormalizationLayer reluLayer convolution2dLayer (3、4 * numF,“填充”,“相同”)batchNormalizationLayer reluLayer maxPooling2dLayer (3“步”2,“填充”,“相同”)convolution2dLayer (3 8 * numF,“填充”,“相同”)batchNormalizationLayer reluLayer convolution2dLayer (3 8 * numF“填充”,“相同”)batchNormalizationLayer reluLayer globalAveragePooling2dLayer dropoutLayer (0.5) fullyConnectedLayer (15) softmaxLayer classificationLayer];

定义trainingOptions(深度学习工具箱)美国有线电视新闻网。这些选项是基于[3]通过工作流系统hyperparameter优化和修改。

miniBatchSize = 128;tuneme = 128;lr = 0.05 * miniBatchSize / tuneme;选择= trainingOptions (“个”,“InitialLearnRate”、lr、“MiniBatchSize”miniBatchSize,“动量”,0.9,“L2Regularization”,0.005,“MaxEpochs”8“洗牌”,“every-epoch”,“阴谋”,“训练进步”,“详细”假的,“LearnRateSchedule”,“分段”,“LearnRateDropPeriod”2,“LearnRateDropFactor”,0.2);

调用trainNetwork(深度学习工具箱)来训练网络。

trainedNet = trainNetwork (xTrain、yTrain层,选择);

评估美国有线电视新闻网

调用预测(深度学习工具箱)预测反应从训练网络使用了测试集。

cnnResponsesPerSegment =预测(trainedNet xTest);

平均在每10秒的音频剪辑的响应。

类= trainedNet.Layers . class(结束);numFiles =元素个数(adsTest.Files);counter = 1;cnnResponses = 0 (numFiles元素个数(类));频道= 1:numFiles cnnResponses(频道:)=总和(cnnResponsesPerSegment(计数器:计数器+ numSegmentsPer10seconds-1:), 1) / numSegmentsPer10seconds;counter = counter + numSegmentsPer10seconds;结束

对于每一个10秒的音频剪辑,选择最大的预测,然后将其映射到相应的预测位置。

[~,classIdx] = max (cnnResponses [], 2);cnnPredictedLabels =类(classIdx);

调用confusionchart(深度学习工具箱)可视化测试集上的准确性,返回命令窗口的平均精度。

图(“单位”,“归一化”,“位置”,0.2 0.2 0.5 0.5)厘米= confusionchart (adsTest.Labels cnnPredictedLabels,“标题”,“测试精度- CNN”);厘米。ColumnSummary =“column-normalized”;厘米。RowSummary =“row-normalized”;流(的平均精度CNN = % 0.2 f \ n ',意味着(adsTest.Labels = = cnnPredictedLabels) * 100)
CNN = 73.33的平均精度

系综分类器的特征提取

小波散射在[4]提供一个良好的声学场景表示。定义一个waveletScattering(小波工具箱)对象。不变性的规模和质量因素决定通过试验和错误。

科幻小说= waveletScattering (“SignalLength”、大小(数据,1),“SamplingFrequency”fs,“InvarianceScale”,0.75,“QualityFactors”(4 - 1));

将音频信号转换为mono,然后调用featureMatrix(小波工具箱)返回散射的散射系数分解框架,科幻小说

dataMono =意味着(数据,2);dataMono scatteringCoeffients = featureMatrix(科幻小说,“转换”,“日志”);

平均散射系数超过10秒的音频剪辑。

featureVector =意味着(scatteringCoeffients, 2);流(每10秒夹的多小波的特性= % d \ n '元素个数(featureVector))
每10秒片段= 290多小波的特性

辅助函数HelperWaveletFeatureVector执行上面的步骤。使用一个数组cellfunHelperWaveletFeatureVector并行化特征提取。提取小波的特征向量训练集和测试集。

scatteringTrain = cellfun (@ (x) HelperWaveletFeatureVector (x,科幻小说),train_set_tall,“UniformOutput”、假);xTrain =收集(scatteringTrain);xTrain = cell2mat (xTrain ') ';scatteringTest = cellfun (@ (x) HelperWaveletFeatureVector (x,科幻小说),test_set_tall,“UniformOutput”、假);xTest =收集(scatteringTest);xTest = cell2mat (xTest ') ';
评估高表达式使用并行池“当地”:通过1对1:在25分钟15秒完成评估在25分钟15秒完成评估高表达式使用并行池“当地”:通过1对1:在8分钟2秒完成评估完成8分2秒

定义和合奏训练分类器

使用fitcensemble创建一个合奏训练分类模型(ClassificationEnsemble)。

subspaceDimension = min(150年,大小(xTrain, 2) - 1);numLearningCycles = 30;classificationEnsemble = fitcensemble (xTrain adsTrain.Labels,“方法”,“子”,“NumLearningCycles”numLearningCycles,“学习者”,“判别”,“NPredToSample”subspaceDimension,“类名”removecats(独特(adsTrain.Labels)));

评估系综分类器

对于每一个10秒的音频剪辑,电话预测返回标签和权重,然后将其映射到相应的预测位置。调用confusionchart(深度学习工具箱)可视化测试集上的准确性。打印的平均。

[waveletPredictedLabels, waveletResponses] =预测(classificationEnsemble xTest);图(“单位”,“归一化”,“位置”,0.2 0.2 0.5 0.5)厘米= confusionchart (adsTest.Labels waveletPredictedLabels,“标题”,测试精度-小波散射的);厘米。ColumnSummary =“column-normalized”;厘米。RowSummary =“row-normalized”;流(的平均分类精度= % 0.2 f \ n ',意味着(adsTest.Labels = = waveletPredictedLabels) * 100)
分类器的平均精度= 76.05

应用后期融合

每10秒视频,称预测小波分类器和CNN返回一个向量表示的相对的信心他们的决定。乘以waveletResponsescnnResponses创建一个后期融合系统。

融合= waveletResponses。* cnnResponses;[~,classIdx] = max(融合,[],2);predictedLabels =类(classIdx);

评价晚了融合

调用confusionchart可视化融合分类精度。打印命令窗口的平均精度。

图(“单位”,“归一化”,“位置”,0.2 0.2 0.5 0.5)厘米= confusionchart (adsTest.Labels predictedLabels,“标题”,“测试精度-融合”);厘米。ColumnSummary =“column-normalized”;厘米。RowSummary =“row-normalized”;流(的平均融合模型精度= % 0.2 f \ n ',意味着(adsTest.Labels = = predictedLabels) * 100)
融合模型的平均精度= 78.21

近平行池。

删除(pp)
平行池使用当地的概要文件被关闭。

引用

[1]a . Mesaros t . Heittola, t·维尔塔宁。声场景分类:概述2017年DCASE挑战条目。proc。国际研讨会声学信号增强,2018年。

[2]Huszar,费伦茨。“混合:视数据增大。”InFERENCe. November 03, 2017. Accessed January 15, 2019.https://www.inference.vc/mixup-data-dependent-data-augmentation/

[3]汉、Yoonchang Jeongsoo公园,Kyogu李。“卷积神经网络与双耳表示声场景分类和背景减法。”声场景和事件的检测和分类(DCASE) (2017): 1 - 5。

[4]Lostanlen,文森特,乔阿欣,然后。双耳与小波散射场景分类。技术报告,DCASE2016挑战,2016年。

[5]a . j . Eronen v, t·奥马斯•佩尔托宁j . t . Tuomi a . p . Klapuri s Fagerlund t .主席g . Lorho和j . Huopaniemi IEEE反式“以听力上下文识别”。在音频、语音和语言处理,14卷,没有。1,第329 - 321页,2006年1月。

[6]图坦卡蒙声场景2017年,开发数据集

[7]2017年图坦卡蒙声场景,评估数据集

附录——支持功能万博1manbetx

% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % %% HelperSegmentedMelSpectrograms函数X = HelperSegmentedMelSpectrograms (X, fs,变长度输入宗量)p = inputParser;addParameter (p,“WindowLength”,1024);addParameter (p,“HopLength”,512);addParameter (p,“NumBands”,128);addParameter (p,“SegmentLength”1);addParameter (p,“SegmentOverlap”,0);addParameter (p,“FFTLength”,1024);解析(p,变长度输入宗量{:})params = p.Results;x = [(x, 2)和x (: 1) - x (:, 2)];x = x / max (max (x));[xb_m, ~] =缓冲区(x(: 1),圆(params.SegmentLength * fs),圆(params.SegmentOverlap * fs),“nodelay”);[xb_s, ~] =缓冲区(x(:, 2),圆(params.SegmentLength * fs),圆(params.SegmentOverlap * fs),“nodelay”);xb = 0(大小(xb_m, 1),大小(xb_m 2) +大小(xb_s, 2));xb = xb_m(1:2,::结束);xb = xb_s(: 2:2:结束);规范= melSpectrogram (xb, fs,“窗口”汉明(params.WindowLength“周期”),“OverlapLength”,参数个数。WindowLength params.HopLength,“FFTLength”params.FFTLength,“NumBands”params.NumBands,“FrequencyRange”[0,地板(fs / 2)));规范= log10(规范+ eps);X =重塑(规格、尺寸(规范,1),大小(规范,2),大小(X, 2), []);结束% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % %% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % %% HelperWaveletFeatureVector函数特点= HelperWaveletFeatureVector (x,科幻小说)x =意味着(x, 2);特点= featureMatrix(科幻,x,“转换”,“日志”);特点=意味着(功能,2);结束% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % %